2016-09-16 6 views
-1

私は三つのフィールド持つテーブルrecordsありますSQLタイムスタンプ範囲クエリを改善するには?

id - the row id 
value - the row value 
source - the source of the value 
timestamp - the time when the row was inserted (should this be a unix timestamp or a datetime?) 

をそして、私はこのようなクエリを実行したい:

SELECT timestamp, value FROM records WHERE timestamp >= a AND timestamp <= b

しかし数百万レコードを持つテーブルでは、このクエリは、超非効率的であるが!

私はDBMSとしてAzure SQL Serverを使用しています。これは最適化できますか?

もしあなたがそれを行うためのステップバイステップのガイドを提供することができますか(「小さな」ステップをスキップしないでください)?インデックスを作成し、クエリステートメントを再設計し、テーブルを再設計します(パーティション化?)...

ありがとう!

+0

'records(timestamp、value)'にインデックスが必要なようです。 –

+0

このクエリでは、どのタイプのインデックスが最適ですか? – PedroD

+0

インデックスについていくつかの調査をしてください。個々の小さなステップを尋ねることによって、クエリのチューニングに関する調査をまだ行っていないことが示されます。 – dfundako

答えて

1

検索するフィールドに索引を作成した後は、between演算子を使用すると、単一の操作になります。これはSQLにとって最も効率的です。

DateFieldにはまた

'2015年1月1日' AND '12/31/2015' 年、SQL Serverの2016年には、使用してタイムスタンプのようなもので使用するために範囲索引を作成することができABC FROM SELECT XXXにメモリ最適化テーブル。それは本当にそれを行う方法です。

1

日時データを使用することをお勧めします。日時データを格納するにはdatetime2データ型を使用することをお勧めします(datetime2は精度が高く、精度が低いほどストレージは少なくなります)。

クエリについては、投稿したステートメントに基づいて、タイムスタンプをキー列にしてから値を含めることをお勧めします。これは、あなたの述語としてタイムスタンプを使用していて、それと一緒に値を返すためです。

CREATE NONCLUSTERED INDEX IX_Records_Timestamp on Records (Timestamp) INCLUDE (Value) 

これは、カラム名に注意してください。列名に予約されたキーワードを使用しないことを強くお勧めします。

関連する問題