0

クエリアナライザで遊んでいる大きなテーブルがあり、これを行うための最良の方法を探しています。

テーブルは次のようになります。

name         rows        reserved     data         index_size   unused
table_name   110980132   7802944 KB   6119784 KB   1679320 KB   3840 KB

そして、これらの列があります:

 ID int, time_stamp datetime, value1 float, value2 float, value3 float.... 

これらtime_stampsは時間のある日付です。テーブルの日付部分だけを取得できるようにするには、何も保存せずに簡単な方法を見つける必要があります。最終的には、日と時間の部分だけを知る必要があるかもしれません(時間の部分全体ではありません)。現時点では、過去30日間のデータが何であるかを知る必要があります(この時点で日が欠落している場合があります。この質問/クエリは、最終的に過去x日間だけでなく、すべての日、またはなんでもいい)。

パフォーマンスと時間を考慮して、これを行うための最良の方法は何ですか?私は、、、、、一時テーブル、ビューで遊んだことがgroup byあります...いくつかのものは他のものよりも優れていますが、私がしていることは何も素晴らしいようには見えません。distincttop xrank()

アイデア?ありがとう!

4

2 に答える 2

1
-- Get the earliest date (without time) you want
DECLARE @smallestDate datetime = DATEADD(DAY, DATEDIFF(DAY, -30, GETDATE()), 0)

-- Select the distinct dates
SELECT DISTINCT DATEADD(DAY, DATEDIFF(DAY, 0, time_stamp), 0) AS [Date]
FROM yourTable
WHERE time_stamp > @smallestDate

パフォーマンスの比較を次に示し ます。SQLServerで日付と時刻から日付を取得する最も効率的な方法はどれですか。

于 2012-11-14T22:41:27.383 に答える
0

単一のクエリの代わりにT-SQLバッチを使用できる場合は、次のようなインデックスを使用できます。

create table #tmp (date datetime primary key clustered);
declare @pivot datetime;
  insert #tmp
  select TOP(1) datediff(d,0,time_stamp)
    from tbl
order by time_stamp desc;
while @@rowcount > 0 and (select count(*) from #tmp) < 30
begin
      insert #tmp
      select TOP(1) datediff(d,0,time_stamp)
        from tbl
       where time_stamp < (select min(date) from #tmp)
    order by time_stamp desc;
end;

これに必要なのは、の優れたインデックスでtime_stampあり、そのインデックスで正確に30シーク(またはそれ以下)を実行します。非常に外科的で迅速です。私はそれを概念として投げ出したので、明らかにそこにある2つのスカラーサブクエリは簡単に最適化できます。

于 2012-11-14T22:16:15.697 に答える