2017-05-17 11 views
0

私は100万レコードを含むSQLテーブルを持っています。私が電話するとSUM()はSQLのSELECT()より時間がかかりません。使い方?

SELECT * 
    FROM [AdventureWorksDW2012].[dbo].[LotTable] 

クエリを完了するのに13秒かかりました。

以下のクエリを実行してID列のSUM()を取得しました。プラスとマイナスの値を含む乱数が含まれています。

SELECT SUM(NewestID) 
    FROM LotTable 

このクエリでは500ミリ秒かかりました。 SUM()を実行するには、SQLエンジンは値を読み込み、その値に何らかの操作を適用する必要があります。しかし、SELECT()より速く実行されています。何が背後にあるロジックですか?下の画像を参照してください。事前に感謝します。

SELECT()SUM()

答えて

6

これは予想される動作です。

  • クエリは(クエリが実行され、分析され、最適化および実行スキーマを設計し、
  • さ:データベース・システムにクエリを送信するときには、いくつかのことが起こる参照してください!)、
  • 結果は、(クライアントに通知される!)

最後の2つの項目が(感嘆符で)高速化の潜在的な源です。

まず、の合計値がの場合、はこれらの値をすべて保存する必要はありません。実際には、アキュムレータを使用します。だから、成熟したデータベースシステムはアキュムレータを値0で初期化し、見つかった各行に対して(オプションの制約にマッチする)、その値をアキュムレータに追加します。キーは、アキュムレータは固定量のメモリを使用します。たとえば整数の場合、通常は10バイト未満です。したがって、アキュムレータは(高速の)メモリに格納されます。

SUM(..)の利点は、それが連想的であることでもあります。((a+b)+c)+d(a+b)+(c+d)に等しくなります。データベースがどのように動作し構成されているかに応じて、テーブルの一部の合計を計算する複数のワーカーにタスクを分散することができます。これらの部分集合はまとめてまとめられます。

一方、SELECTクエリを実行すると、結果が行単位で書き込まれます。その結果、linearメモリ使用量があります。一致する行ごとに、メモリが必要です。大きなテーブルの場合、古い行がCPUキャッシュから、場合によってはメモリから「スワップ」される可能性があります。したがって、クエリの実行には時間がかかります。

最後に、システムが応答する必要があります。今すぐSUM(..)を実行すると、それは1行です。したがって、転送されるデータの量は少なくなります。 SELECTクエリは、通常、数百行を転送します。もちろん、大量のデータを転送するには、少量のデータよりも時間がかかります。

3

(DBAの視点から)短い答え:

SELECT *SELECT SUM(NewestID)より多くの列と行を返すために持っているからです。

また、SUM()が並行して実行されている可能性があります。そのため、速度が向上する可能性があります。

また、SSMSの結果セットの表示は非常に遅く、クエリの実際の実行時間を比較するために、セッションの開始時にSET STATISTICS TIME ONを使用できます。だから、

SET STATISTICS TIME ON 

SELECT * 
FROM [AdventureWorksDW2012].[dbo].[LotTable] 

SELECT SUM(NewestID) 
FROM [AdventureWorksDW2012].[dbo].[LotTable] 

は今Messages]タブに移動し、クエリの実行時間を見てみましょう:

  • CPU時間を:操作は、骨材(SUMAVGなど)のように、CPUの上に作られましたかRAMに格納するのに必要なCPU時間+時間、メモリバスを介して結果を送信し、ネットワーク等
  • 経過時間が他の算術演算

    もう1つの方法は、SSMSで結果の表示を破棄することです。ツール - >オプション - >クエリ結果 - > SQL Server - >結果をグリッドに移動し、実行後の結果を破棄します。

    新しいタブを開き、クエリをもう一度実行し、実行時間の比較方法を確認してください。 (新しいセッションのために別のタブに結果が表示されるように、オプションをオフにしてください)。あなたはNewestID列またはあなたが持っている(またはしない)場合は、インデックスを持っているかのよう


    実際には、テーブルにクラスタ化インデックスこれらよりも多くの要因があるかもしれません。

  • -1

    機能付きフィールドが1つしかないため、

    関連する問題