を最適化するので、私はこれらのテーブルを持っている:SQL Serverのピボットクエリの代替または
-- tbl_obs
id lat lon created
-------------------------
1 1.2 -2.1 2002-08-03
2 1.9 -5.5 2002-08-03
3 1.5 -4.1 2002-08-03
-- tbl_obsdata
id name value obs_id
---------------------------------
1 gender Male 1
2 type Type I 1
3 description Some desc 1
4 gender Female 2
5 type Type II 2
6 description Some desc 2
7 gender Female 3
8 type Type II 3
9 description Some desc 3
私はこのような両方のテーブルからデータを結合しますクエリをしたい:
lat lon created gender type description
------------------------------------------------
1.2 -2.1 2002-08-03 Male Type I Some desc
1.9 -5.5 2002-08-03 Female Type I Some desc
1.5 -4.1 2002-08-03 Male Type II Some desc
私はこれを行うことができます知っています以下のようなピボットを持つ:
with cte as (
select obsdata.name, obsdata.value, obs.lat, obs.lon, obs.created
from obsdata
left join obs on obs.id = obsdata.obs_id
)
select lat, lon, created, gender, type, description
from cte
pivot(
max(value)
for [name] in (gender, type, description)
) as pvt
今のところ、これは(と思う)の結果を返しますが、私は約百万行を持っており、これは本当に遅い実行されます。これを達成するための代替方法は、はるかに高速でしょうか?私はSQL Server 2012を使用しています。
です。この質問を見ると、CTEが遅い理由かもしれないと私は考えています。あなたはCTEの代わりに一時的なテーブル(インデックス付き)を好むでしょうか? – BhatiaAshish
@BhatiaAshish。 。 。私は、後者が絶対必要でない限り、一時テーブルに対して単一のクエリを優先します。 –
ピボットのパフォーマンスに問題があり、一般的にJohn Cappallettiなどのソリューションよりも遅くなります。ピボットはうまくありませんが、大容量の大容量データ環境で作業しているのでピボットは使用しません。 – btberry