大きなテーブル(現在は約850万行)があり、毎週パーセンタイル値を計算する必要があります。しかし、そのプロセスは非常に遅い(ハードウェア/現在のクエリでは5〜6時間)。SQLパーセンタイルの計算が非常に遅い - 高速化に役立つ
クエリを高速化するためにクエリを変更するにはどうすればよいですか?
は今のところ、私のクエリは、基本的にはこれです:
SELECT DISTINCT [ident1]
,[ident2]
,[ident3]
,[ident4]
,percentile_cont(0.05)
WITHIN GROUP (
ORDER BY [value] ASC
) OVER (
PARTITION BY [ident1]
,[ident2]
,[ident3]
,[ident4]
) AS [percentile_5]
,percentile_cont(0.10)
WITHIN GROUP (
ORDER BY [value] ASC
) OVER (
PARTITION BY [ident1]
,[ident2]
,[ident3]
,[ident4]
) AS [percentile_10]
,percentile_cont(0.25)
WITHIN GROUP (
ORDER BY [value] ASC
) OVER (
PARTITION BY [ident1]
,[ident2]
,[ident3]
,[ident4]
) AS [percentile_25]
,percentile_cont(0.50)
WITHIN GROUP (
ORDER BY [value] ASC
) OVER (
PARTITION BY [ident1]
,[ident2]
,[ident3]
,[ident4]
) AS [percentile_50]
,percentile_cont(0.75)
WITHIN GROUP (
ORDER BY [value] ASC
) OVER (
PARTITION BY [ident1]
,[ident2]
,[ident3]
,[ident4]
) AS [percentile_75]
,percentile_cont(0.90)
WITHIN GROUP (
ORDER BY [value] ASC
) OVER (
PARTITION BY [ident1]
,[ident2]
,[ident3]
,[ident4]
) AS [percentile_90]
,percentile_cont(0.95)
WITHIN GROUP (
ORDER BY [value] ASC
) OVER (
PARTITION BY [ident1]
,[ident2]
,[ident3]
,[ident4]
) AS [percentile_95]
FROM dataTable
私は問題の一部である思いそのDISTINCT
選択から、私は、行にDB内のすべての値を取得していますと。 SQLは各グループごとに一度だけパーセンタイルを計算するのに十分スマートですか?それとも、それぞれの値に対して繰り返し計算していますか?
ご協力いただければ幸いです。
パーセンタイル_ ** cont **が必要ですか、それともパーセンタイル_ **ディスク**を使用してもよろしいですか? – dnoeth
実行計画はこのクエリについて何を伝えますか? (最初の場所は実行計画でなければなりません)。たとえば、索引が見つからないことがあります。 –
私は実行計画の作成に取り組んでいます。私のDBAはその時点で機能を無効にしています。その間、これをインデックス化する最良の方法は何ですか? [ident1]、[ident2]、[ident3]、[ident4]、および[value]のクラスタード・インデックス?または列の一部のサブセットですか? – hoytdj