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

クエリは日付式では遅く実行されますが、文字列リテラルでは高速です

    これはうまくいくかもしれません:

    どこで FK.DT =cast(getdate() + 1 - datepart(day, getdate()) as date) 

    トレース フラグ 4199 をオンにして実行していない限り、バグ カーディナリティの見積もりに影響します。執筆時点で

    SELECT DATEADD(m, DATEDIFF(m, getdate(), 0), 0), DATEADD(m, DATEDIFF(m, 0, getdate()), 0) 

    返品

    <前>+-------------------------+----------------- --------+| 1786-06-01 00:00:00.000 | 2013-08-01 00:00:00.000 |+-------------------------+------------ --------------+

    バグは、カーディナリティの見積もりを導出するときに、質問の述語が 2 番目ではなく最初の日付を使用することです。ということで、以下の設定です。

    CREATE TABLE FK(ID INT IDENTITY PRIMARY KEY,DT DATE,Filler CHAR(1000) NULL,UNIQUE (DT,ID))INSERT INTO FK (DT)SELECT TOP (1000000) DATEADD(m, DATEDIFF( m, getdate(), 0), 0)FROM master..spt_values o1, master..spt_values o2UNION ALLSELECT DATEADD(m, DATEDIFF(m, 0, getdate()), 0) 

    クエリ 1

    SELECT COUNT(Filler)FROMWHERE FK.DT =CAST(DATEADD(m, DATEDIFF(m, 0, getdate()), 0) AS DATE)  

    一致する行の数が 100,000 になると見積もっています。これは日付 '1786-06-01' に一致する番号です .

    ただし、次のクエリは両方とも

    SELECT COUNT(Filler)FROM FKWHERE FK.DT =CAST(GETDATE() + 1 - DATEPART(DAY, GETDATE()) AS DATE)SELECT COUNT(Filler)FROM FKWHERE FK.DT =CAST(DATEADD (m, DATEDIFF(m, 0, getdate()), 0) AS DATE) オプション (QUERYTRACEON 4199) 

    この計画を与える

    カーディナリティの推定がより正確になったため、プランはフル スキャンではなく単一のインデックス シークのみを実行するようになりました。



    1. ORA-00933:複数行の挿入時にSQLコマンドが正しく終了しませんでした

    2. SQLServerのカーソルタイプ-静的カーソルのみを転送| SQLServerチュートリアル/TSQLチュートリアル

    3. MySQLRDSおよびJDBCSSL接続でエラーが発生する:要求されたターゲットへの有効な認証パスが見つかりません

    4. XMLからOraclePL/SQL環境のパスのリストへ