2

クエリの実行が遅くなっています。インデックスを評価して再構築していますが、MyFieldのインデックスがこのクエリで使用されるかどうか誰かに教えてもらえますか?

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

私の考えは:

  • SQLがIF、WHERE、またはCASEのフィールドをテストする場合、使用可能なインデックスを使用します。
  • MyFieldがテストされます。
  • したがって、SQLはインデックスを使用してMyFieldをテストできる必要があります。

私の質問は次のとおりです。

  • null値はインデックス付けされていますか?
  • IF、WHERE、CASEなどがない場合、SQLはインデックスを使用しますか?
  • ISNULLよりもCASEratharを使用した場合、違いはありますか?

ありがとうございました。

スコット

4

3 に答える 3

3

参考までに、「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サーバーはインデックスSCANを使用します

また、SQL Server がインデックスを使用しているかどうかにかかわらず、インデックス、シーク、またはスキャンに対して実行している操作を自問する必要があります。

于 2012-02-10T09:55:49.713 に答える
1

あなたの質問に対する私の考えは次のとおりです。

<< null 値はインデックス化されていますか?

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

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

実はそうです、IF文やCASE文と同じ意味を持つメソッドがいくつかあるからです。

<< ISNULL ではなく CASE を使用した場合、違いはありますか?

表示が違うだけで同じです。

HTH。

于 2012-02-10T05:56:30.017 に答える
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

インデックス スキャンはテーブル スキャンよりもはるかに高速であるため、インデックス作成後のクエリのパフォーマンスが向上します。

于 2012-02-10T05:58:10.770 に答える