0

テーブルからデータ (今日) を返す必要があります。私は仕事をするこのクエリを使用していますが、私が望むほど速くはありません。

現在のクエリ

WHERE (CallDetail.DNIS='456456') AND CallDetail.ConnectedDateTimeGmt > CAST(FLOOR(CAST(GETDATE() AS FLOAT))AS DATETIME)

私が使用する別のクエリでは、数秒で過去 1 週間分のデータが返されます。

WHERE (CallDetail.LocalName='Name') AND (CallDetail.ConnectedDate Between DATEADD(wk,-1,GetDate()) And GetDate())

今日のデータのみを返すために使用できる、より効果的なクエリはありますか?

4

3 に答える 3

0

クエリを遅くする GETDATE() から日付部分を返すために 2 回キャストする代わりに

WHERE (CallDetail.DNIS='456456') 
AND CallDetail.ConnectedDateTimeGmt > CAST(FLOOR(CAST(GETDATE() AS FLOAT))AS DATETIME)

GETDATE() から日付部分のみを返す高速な方法を使用する

WHERE (CallDetail.DNIS='456456')
AND CallDetail.ConnectedDateTimeGmt > DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE()))
于 2013-05-09T14:21:42.863 に答える
0

日付へのクロス結合を使用してこれを 1 回だけ計算します。これがパフォーマンスにどのように影響するかはわかりませんが、過去にこれを使用したことがあり、常にインデックスにヒットしているように見えました。

SELECT *

FROM [MyData]
CROSS JOIN (DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE())) AS CURRDATE) XJOIN

WHERE (CallDetail.DNIS='456456')
AND CallDetail.ConnectedDateTimeGmt > XJOIN.CURRDATE
于 2013-05-09T15:20:52.903 に答える
0

クエリを高速化したい場合は、インデックスについて考えてください。このクエリの場合、最も効果的なインデックスは on になりCallDetail(DNIS, ConnectedDateTimeGmt)ます。

CallDetail(ConnectedDate)または のいずれかにインデックスがあるため、2 番目のクエリはおそらく高速に実行されますCallDetail(LocalName)

getdate()フィールド名ではなく日付計算のみを行っていることを称賛します (これはインデックスの使用を妨げる可能性があります)。より新しいバージョンの SQL Server を使用している場合、最も読みやすい方法はcast(getdate() as date)変換です。ただし、クエリを高速化する方法は、インデックスを適切に使用することです。

于 2013-05-09T14:29:15.393 に答える