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

SQL Serverで日付+時刻から日付を取得する最も効率的な方法は?

    マットが示したフロアフロート変換を見たことがなかったことを認めなければなりません。私はこれをテストしなければなりませんでした。

    私は純粋な選択(日付と時刻を返しますが、私たちが望むものではありません)、ここでの支配的な解決策(floor-float)、ここで言及されている一般的な「ナイーブ」なもの(stringconvert)、およびここで言及されているものをテストしました使用している(私が思ったように最速だった)

    最大メモリ(32ビット、つまり約3.5 Gb)で実行されているXeon3GHzCPUを搭載したWin2003SP2サーバーで実行されているテストサーバーMSSQLServer2005でクエリをテストしました。私がいる夜なので、マシンはほとんど無負荷でアイドリングしています。私はそれをすべて自分で持っています。

    これは、ミリ秒レベルまで変化するタイムスタンプを含む大きなテーブルから選択したテスト実行のログです。この特定のデータセットには、2。5年を超える日付が含まれています。テーブル自体には1億3000万行を超える行があるため、上位100万行に制限します。

    SELECT TOP 1000000 CRETS FROM tblMeasureLogv2 
    SELECT TOP 1000000 CAST(FLOOR(CAST(CRETS AS FLOAT)) AS DATETIME) FROM tblMeasureLogv2
    SELECT TOP 1000000 CONVERT(DATETIME, CONVERT(VARCHAR(10), CRETS, 120) , 120) FROM tblMeasureLogv2 
    SELECT TOP 1000000 DATEADD(DAY, DATEDIFF(DAY, 0, CRETS), 0) FROM tblMeasureLogv2
    

    SQL Serverの解析およびコンパイル時間:CPU時間=0ミリ秒、経過時間=1ミリ秒。

    (影響を受ける1000000行)テーブル'tblMeasureLogv2'。スキャンカウント1、論理読み取り4752、物理読み取り0、先読み読み取り0、lob論理読み取り0、lob物理読み取り0、lob先読み読み取り0。

    SQL Serverの実行時間:CPU時間=422ミリ秒、経過時間=33803ミリ秒。

    (影響を受ける1000000行)テーブル'tblMeasureLogv2'。スキャンカウント1、論理読み取り4752、物理読み取り0、先読み読み取り0、lob論理読み取り0、lob物理読み取り0、lob先読み読み取り0。

    SQL Serverの実行時間:CPU時間=625ミリ秒、経過時間=33545ミリ秒。

    (影響を受ける1000000行)テーブル'tblMeasureLogv2'。スキャンカウント1、論理読み取り4752、物理読み取り0、先読み読み取り0、lob論理読み取り0、lob物理読み取り0、lob先読み読み取り0。

    SQL Serverの実行時間:CPU時間=1953ミリ秒、経過時間=33843ミリ秒。

    (影響を受ける1000000行)テーブル'tblMeasureLogv2'。スキャンカウント1、論理読み取り4752、物理読み取り0、先読み読み取り0、lob論理読み取り0、lob物理読み取り0、lob先読み読み取り0。

    SQL Serverの実行時間:CPU時間=531ミリ秒、経過時間=33440ミリ秒。 SQL Serverの解析およびコンパイル時間:CPU時間=0ミリ秒、経過時間=1ミリ秒。

    SQL Serverの実行時間:CPU時間=0ミリ秒、経過時間=1ミリ秒。

    ここで何を見ているのですか?

    CPU時間(変換を調べています)に注目してみましょう。次の数値があることがわかります。

    Pure-Select:  422
    Floor-cast:   625
    String-conv: 1953
    DateAdd:      531  
    

    このことから、DateAdd(少なくともこの特定のケースでは)はフロアキャスト方式よりもわずかに高速であるように見えます。

    そこに行く前に、クエリの順序を変更して、同じような結果でこのテストを数回実行しました。

    これは私のサーバーで何か奇妙なことですか、それとも何ですか?



    1. 大きなテーブルでのSQLServerクエリのパフォーマンスを向上させる

    2. SQLで平均を丸めるときに小数を取得するにはどうすればよいですか?

    3. スキーマとビューを使用してPostgreSQLユーザーアクセスを制限する

    4. テーブル値パラメータを変更する方法