2012-02-10 33 views
2

私のクエリはs-l-o-wです。インデックスを評価して再構築していますが、このクエリでMyFieldのインデックスを使用するかどうか教えてもらえますか?ISNULL:パフォーマンスの向上?

SELECT ISNULL(MyField , 'No Data') 
FROM MyTable 

私の考えです:

  • SQLは、それが使用可能な索引を使用していますかCASE IF、内のフィールドをテストする場合。
  • MyFieldがテストされます。
  • したがって、SQLはインデックスを使用してMyFieldをテストできるはずです。

私の質問は以下のとおりです。

  • はNULL値がインデックス化されていますか?
  • IF、WHERE、CASEなどがない場合、SQLはインデックスを使用しますか?
  • ISNULLよりCASE ratharを使用しても差はありますか?

ありがとうございます。

スコット

+1

特定の状況に関する情報はほとんどありません。 MyTableの構造やサイズはわかりません。現在表示しているクエリはすべての行を返し、インデックスを使用しません。あなたが私たちにより多くの情報を提供すれば、なぜそれがs-l-o-wであるのかを説明することができます。 –

答えて

1

はい、そのフィールドにインデックスが存在する場合はインデックスが使用されます。 ISNULLは関係ありません。う

BEGIN TRAN 

--Create test table and add some dummy data 
CREATE TABLE MyTable(MyField VARCHAR(20)) 
INSERT INTO MyTable SELECT 'test1' 
INSERT INTO MyTable SELECT 'test2' 
INSERT INTO MyTable SELECT NULL 
INSERT INTO MyTable SELECT 'test3' 

-- Run query with ISNULL (note that a Table Scan is done) 
SELECT ISNULL(MyField , 'No Data') FROM MyTable 
-- Run query without ISNULL (note that a Table Scan is done) 
SELECT MyField FROM MyTable 

-- Now create an index and compare the execution plans for the same queries 
CREATE NONCLUSTERED INDEX IX_MyTable_MyField ON MyTable (MyField) 

-- Run query with ISNULL (note that an Index Scan is done) 
SELECT ISNULL(MyField , 'No Data') FROM MyTable 
-- Run query without ISNULL (note that an Index Scan is done) 
SELECT MyField FROM MyTable 

ROLLBACK 

インデックススキャンがはるかに高速テーブルスキャンよりも、そのインデックス後のクエリが作成されます。

次のようにあなたはそれが使用するインデックスを参照するクエリ実行プランをオン(これを自分でテストすることができます

+0

ブリリアント。だから、SQLはまだすべての値を読み込みますが、フィールドがインデックスされていれば、SQLはテーブルから読み込む必要はなく、代わりにインデックスから読み込むことができます。 – Scott

+0

はい、ノンクラスタード・インデックスは、索引付けされているデータ(この場合は1つの列)のみを持つ表のマイクロ・バージョンのようなものです。そのため、クエリはより少ないデータでふるまいます。 –

1

Here'reご質問についての私の考え:

< <がインデックスnull値はありますか?

null値は、他の値としてインデックスされます。

< < IF、WHERE、CASEなどがない場合、SQLはインデックスを使用しますか?

実際には、IFやCASE文で同じ意味を持つメソッドがあるので、はい、そうです。

< <私はISNULLよりCASE ratharを使用すると違いがありますか?

これは同じですが、表示が異なるだけです。

HTH。

3

ちょうどFYI、あなたが "Where"句について話していたなら、答えは違うでしょう。

SELECT ISNULL(MyField , 'No Data') 
FROM MyTable 
WHERE MyField ='myvalue' 

SQL Serverはインデックスは(あなたは常にを目指すべきである)SEEK行いますが、あなたがしなければ: あなたが行う場合

SELECT ISNULL(MyField , 'No Data') 
FROM MyTable 
WHERE isNull(myColumn, 'no data') is not null --I know this check doesn't make sense, but it's just for the sake of illustration. Imagine another function instead of isNull like substring or getdate... 

SQL Serverはインデックススキャンを使用します

さらに、SQL Serverがインデックスを使用しているかどうかを確認するには、インデックス、シークまたはスキャンでどの操作を実行しているのかを確認する必要があります。

関連する問題