かなり複雑なクエリがありますが、インデックスを適用したところ、1秒未満で非常にスムーズに実行されるようになりました。クエリの構造は次のようになります(後で証明するため、完全なクエリを投稿する必要はありません。障害はクエリ自体にありません)。
DECLARE @period varchar(6);
SET @period = '201302';
DECLARE @day datetime;
SET @day = dba.fnu_firstdate(@period);//returns 2013-02-01
SELECT
user_id,
(SELECT CAST(MAX(c1) AS varchar) FROM table t WHERE t.user_id = table.user_id AND when = DATEADD(day, 0, @day)) Day01,
...
(SELECT CAST(MAX(c1) AS varchar) FROM table t WHERE t.user_id = table.user_id AND when = DATEADD(day, 30, @day)) Day31
FROM
table
そうですね、このクエリを実行すると、完了するまでに約1秒かかります。これは、私にとってはまったく問題ありません。ただし、ご覧のとおり、パラメータを指定する必要があります。したがって、それをテーブル値関数に変更して、そこから簡単に選択クエリを実行できるようにしました。
CREATE FUNCTION fnu_data(@period varchar(6))
RETURNS @results TABLE
(
id int,
Day01 varchar(10) null,
...
Day31 varchar(10) null
)
AS
BEGIN
DECLARE @day datetime;
SET @day = dba.fnu_firstdate(@period);
INSERT INTO @results
(
id,
Day01,
...
Day31
)
SELECT
SELECT
user_id,
(SELECT CAST(MAX(c1) AS varchar) FROM table t WHERE t.user_id = table.user_id AND when = DATEADD(day, 0, @day)) Day01,
...
(SELECT CAST(MAX(c1) AS varchar) FROM table t WHERE t.user_id = table.user_id AND when = DATEADD(day, 30, @day)) Day31
FROM
table
RETURN
今私がするとき
SELECT * FROM dba.fnu_data('201302')
6秒かかりますが、長すぎます。同僚のアドバイスを受けて、idにプライマリインデックスを追加し、すべての副選択を結合として置き換えようとしましたが、クエリの実行時間が8秒に延長されました。(PSクエリは最大3200行を返します)。
私の意見では、犯人は挿入ですが、どうすればそれを取り除くことができるのかわかりません。
クエリを改善するにはどうすればよいですか?