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

where句または結合の列の非決定論的関数のパフォーマンスを向上させる方法は?

    非決定論的な関数に加えて、フィールドで計算を行うという問題があります。これにより、(通常) フィールドのインデックスがクエリで使用できなくなります。

    このリンクの 2 番目の段落 (よくある SQL プログラミングの 10 の間違い (述語内のインデックス付き列に対する関数) ) は、これがいつ発生するか、それを回避する方法、およびオプティマイザーが関数の使用にもかかわらずインデックスを使用する可能性がある方法について、より詳細な情報を提供します。

    要するに、改善されたオプティマイザーに頼る代わりに、フィールドをそのまま (計算を行わずに) 保持することでクエリを変更できることがよくありますが、代わりに他の値に対して (逆の) 計算を実行します。あなたの場合、 GetDate() によって提供される現在の日付まで .次に、クエリはフィールド table1.Date のインデックスを使用できます .

    したがって、次のようなものを使用できます:

    SELECT COUNT(*) 
    FROM table1
    WHERE table1.Date
          BETWEEN
                 /* First Day of Current Month */
              AND 
                 /* Last Day of Current Month */
    

    また、当月の最初と最後の日を取得する関数を見つけるだけで済みます。

    sql-server-query-to-find-first-and-last-day-of-当月/

    さらに良いことに、この StackOverflow の質問/回答:月の初日を指定した日付を作成する最も簡単な方法-別の日付

    テストする必要がありますが、上記のわずかなバリエーションで十分だと思います:

    SELECT COUNT(*) 
    FROM table1
    WHERE table1.Date 
          >=      /* First Day of Current Month */
            DATEADD(mm, DATEDIFF(mm, 0, GetDate() ), 0) 
      AND table1.Date 
          <       /* First Day of Next Month */
            DATEADD(mm, 1 + DATEDIFF(mm, 0, GetDate() ), 0) 
    


    1. `Java.lang.String` を `oracle.sql.TIMESTAMPTZ` に変換します

    2. Solrでこの種の機能が機能しないのはなぜですか?

    3. SQL Serverの最大行サイズとVarchar(最大)サイズ

    4. Microsoftによるデータベースの命名規則?