sql >> データベース >  >> RDS >> Sqlserver

null 許容列を ISNULL でラップすると、テーブル スキャンが発生しますか?

    はい、テーブルスキャンが発生します。 (ただし、列が実際に null 可能でない場合は最適化されるようです)

    SR0007 ルールは、述語を検索不能にし、列のインデックスが役に立たなくなることを意味するため、非常に貧弱な包括的なアドバイスです。列にインデックスがない場合でも、カーディナリティの見積もりが不正確になり、計画の他の部分に影響を与える可能性があります。

    Microsoft.Performance での分類 カテゴリは、クエリのパフォーマンスを理解していない人によって書かれたようで、非常に面白いです.

    論理的根拠は

    であると主張しています

    式自体は unknown と評価されますが、 = であることを理解すると、コードは完全に決定論的な結果を返します。 、 <>>< NULL との比較など 不明と評価 そしてその WHERE 句は、式が true と評価される行のみを返します .

    ANSI_NULLS オフですが、 WHERE ISNULL([c2],0)> 2; のドキュメントで提供されている例 vs WHERE [c2]> 2; とにかく、この設定の影響を受けません。この設定

    スキャン vs シーク以下を示す実行計画

    CREATE TABLE #foo
      (
         x INT NULL UNIQUE
      )
    
    INSERT INTO #foo
    SELECT ROW_NUMBER() OVER (ORDER BY @@SPID)
    FROM   sys.all_columns
    
    SELECT *
    FROM   #foo
    WHERE  ISNULL(x, 10) = 10
    
    SELECT *
    FROM   #foo
    WHERE  x = 10
    
    SELECT *
    FROM   #foo
    WHERE  x = 10
            OR x IS NULL 
    




    1. ジオサーバーエラー:関数postgis_lib_version()

    2. RubyonRails接続の問題

    3. 非決定論的な順序の行番号

    4. 大きなxmlから抽出すると、文字列リテラルが長すぎてクエリが失敗します