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

誰かが2つのクエリの違いを説明できますか?

    getdate() ランタイムです定数関数 関数参照ごとに 1 回だけ評価されるため、

    SELECT GETDATE()FROM SomeBigTable  

    クエリの実行にかかる時間に関係なく、すべての行に対して同じ結果が返されます。

    ただし、両者には違いがあります。最初のものは変数を使用し、変数が SQL Server に割り当てられる前にプランがコンパイルされるため、(再コンパイルがない場合) 行の 30% が返されると想定されます。この推測により、2 番目のクエリとは異なるプランが使用される可能性があります。

    GETDATE() を使用する際の注意事項 フィルターで直接 GETDATE() を評価することです コンパイル時以降、クエリまたはデータを変更して再コンパイルをトリガーすることなく、選択性が劇的に変化する可能性があります。以下の例では、1,000 行のテーブルに対する変数を使用したクエリにより、推定 300 行と完全なテーブル スキャンの計画が導かれますが、関数呼び出しが埋め込まれたクエリでは、1 行が推定され、ブックマーク ルックアップが実行されます。これは最初の実行では正確ですが、時間の経過により 2 回目の実行ではすべての行が適格になり、1,000 回のランダムなルックアップを実行することになります。

    USE tempdb;CREATE TABLE [myTable](CreatedDate datetime,Filler char(8000) NULL)CREATE NONCLUSTERED INDEX ix ON [myTable](CreatedDate)INSERT INTO [myTable](CreatedDate)/*1 行挿入最初に適合する*/SELECT DATEADD(D,-2001,getdate())UNION ALL/*最初に適合しない999行*/SELECT TOP 999 DATEADD(minute,1, DATEADD(D,-2000,getdate() ))FROM master..spt_valuesEXEC('DECLARE @myDate DATETIME =DATEADD(D,-2000,getdate())SELECT * FROM [myTable] WHERE CreatedDate <=@myDate')EXEC('SELECT * FROM [myTable] WHERE CreatedDate <=DATEADD(D,-2000,getdate())')RAISERROR ('Delay',0,1) WITH NOWAITWAITFOR DELAY '00:01:01'EXEC('DECLARE @myDate DATETIME =DATEADD(D,-2000, getdate())SELECT * FROM [myTable] WHERE CreatedDate <=@myDate')EXEC('SELECT * FROM [myTable] WHERE CreatedDate <=DATEADD(D,-2000,getdate())')DROP TABLE [myTable]  

    1. preg_match_all配列を挿入するphp

    2. work_memのサイズを大きくしてもパフォーマンスは向上しません

    3. PL / SQLでループを使用せずに1から10を印刷するにはどうすればよいですか?

    4. MySQL-約を取得する普遍的な方法。バイト単位の行サイズ