1M行を超えるテーブルに対して一時的な分析クエリを実行しようとしています。典型的な質問は、任意の時間枠(例えば、過去4ヶ月など)に分割された任意の時間枠に対して、「3日ごとにグループ化された」、いくつかの行が「いくつかの基準」を満たすかどうかです。固定値リストで照会する方法
私たちの現在の解決策は、期間ごとに1つのカウントクエリを実行することです。したがって、上記の例では40の異なるクエリが生成され、パフォーマンスが許容できなくなります。私が撮影した
一つのアプローチはそうのように、一時テーブルを作成することです:
create temporary table time_series (
lower_limit timestamp default current_timestamp,
upper_limit timestamp default current_timestamp
);
insert into time_series (lower_limit, upper_limit) values
('2017-01-15 00:00:00', '2017-01-18 00:00:00'),
('2017-01-18 00:00:00', '2017-01-21 00:00:00'),
...
('2017-05-09 00:00:00', '2017-05-12 00:00:00'),
('2017-05-12 00:00:00', '2017-05-15 00:00:00');
select ts.upper_limit, count(mbt.time) from time_series ts
join my_big_table mbt on
(
mbt.time > ts.lower_limit and
mbt.time <= ts.upper_limit
)
group by ts.upper_limit
order by ts.upper_limit;
drop table time_series;
が生み出し...
+---------------------+-----------------+
| upper_limit | count(mbt.time) |
+---------------------+-----------------+
| 2017-01-18 00:00:00 | 65890 |
| 2017-01-21 00:00:00 | 98230 |
| ... | |
| 2017-05-12 00:00:00 | 57690 |
| 2017-05-15 00:00:00 | 2349 |
+---------------------+-----------------+
これは、はるかにパフォーマンスの我々の現在のソリューションよりもですが、問題は私がデータベースを所有していないことです。テーブルはOracle、SQLServer、MySQL、またはPostgreSQLのいずれかに存在する可能性があり、SELECT権限しか持たないため、一時テーブルの作成と削除は保証されません。たとえば、私は上記のSQLをMySQLで実行しましたが、CREATE TEMPORARY TABLEを自分自身に許可しなければなりませんでした。
タイムスタンプの固定リストを周期的な境界として受け入れるクエリのスコープ内で使用できる「合成テーブル」(他に何を呼び出すべきかわからない)を作成する方法はありますか?テンポラリテーブルがない場合を除いて、上記を持っているか?
あなたが現在使用しているだけのDBMSにタグを付けてください。 – Sami
これらのシナリオのすべてでテーブル変数を作成できると思います。 – scsimon
mysqlを除くすべてのデータベースで、これをCTEで行うことができます。あなたは、あなたが照会しているRDBMSに依存して実行されるいくつかの異なる実行可能なクエリで終わるかもしれません。 – JNevill