CustPassMaster
16列のテーブルがありCustNum varchar(8)
、その1つがであり、indexを作成しましたIX_dbo_CustPassMaster_CustNum
。SELECT
ステートメントを実行すると:
SELECT * FROM dbo.CustPassMaster WHERE CustNum = '12345678'
インデックスを完全に無視します。これは、CustDataMaster
もう少し多くの列(55)を持つテーブルがあり、そのうちの1つが混乱しているためですCustNum varchar(8)
。IX_dbo_CustDataMaster_CustNum
このテーブルのこの列()にインデックスを作成し、実質的に同じクエリを使用します。
SELECT * FROM dbo.CustDataMaster WHERE CustNum = '12345678'
そして、作成したインデックスを使用します。
この背後に特定の理由はありますか?なぜインデックスを使用しますが、インデックスを使用しCustDataMaster
ませんCustPassMaster
か?列数が少ないためですか?
最初のクエリは66行を返します。2番目の場合、1行が返されます。
また、追加のメモ:CustPassMaster
4991レコードがあり、CustDataMaster
5376レコードがあります。これがインデックスを無視する理由になりますか?CustPassMaster
また、同じCustNum
値を持つ重複レコードもあります。これは別の要因ですか?
この主張は、両方のクエリの実際の実行計画の結果に基づいています。
CustPassMaster
(未使用のインデックスを持つもの)のDDLは次のとおりです。
CREATE TABLE dbo.CustPassMaster(
[CustNum] [varchar](8) NOT NULL,
[Username] [char](15) NOT NULL,
[Password] [char](15) NOT NULL,
/* more columns here */
[VBTerminator] [varchar](1) NOT NULL
) ON [PRIMARY]
CREATE NONCLUSTERED INDEX [IX_dbo_CustPassMaster_CustNum] ON dbo.CustPassMaster
(
[CustNum] ASC
) WITH (PAD_INDEX = OFF
, STATISTICS_NORECOMPUTE = OFF
, SORT_IN_TEMPDB = OFF
, DROP_EXISTING = OFF
, ONLINE = OFF
, ALLOW_ROW_LOCKS = ON
, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
そして、DDL CustDataMaster
(多くの無関係なフィールドを省略しました):
CREATE TABLE dbo.CustDataMaster(
[CustNum] [varchar](8) NOT NULL,
/* more columns here */
[VBTerminator] [varchar](1) NOT NULL
) ON [PRIMARY]
CREATE NONCLUSTERED INDEX [IX_dbo_CustDataMaster_CustNum] ON dbo.CustDataMaster
(
[CustNum] ASC
)WITH (PAD_INDEX = OFF
, STATISTICS_NORECOMPUTE = OFF
, SORT_IN_TEMPDB = OFF
, DROP_EXISTING = OFF
, ONLINE = OFF
, ALLOW_ROW_LOCKS = ON
, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
これらのテーブルのいずれにもクラスター化インデックスはなく、1つの非クラスター化インデックスしかありません。
データ型が保存されているデータの型と完全に一致しないという事実を無視します。これらのフィールドは、IBM AS / 400 DB2データベースからのバックアップであり、互換性のあるデータ型です。(このバックアップデータベースをまったく同じクエリでクエリし、まったく同じ結果を取得できる必要があります。)
このデータはステートメントにのみ使用されSELECT
ます。バックアップアプリケーションがAS / 400からデータをコピーする場合を除いて、INSERT
/ UPDATE
/ DELETE
ステートメントは実行しません。