私は最適化のテクニックに関する助けを求めています。 in節のテンポラリテーブルを使用すると、クエリが5秒以上実行されます。静的な値を変更すると、1秒未満でデータが返されます。私はこれを最適化する方法を理解しようとしています。SQL Server(2014)プロシージャに渡されたフィルタ変数を使用するときのクエリの最適化
-- details about the number of rows in table
dept_activity table
- total rows - 17,319,666
- rows for (dept_id = 10) - 36054
-- temp table
CREATE TABLE #tbl_depts (
Id INT Identity(1, 1) PRIMARY KEY
,dept_id integer
);
-- for example I inserted one row but based on conditions multiple department numbers are inserted in this temp table
insert into #tbl_depts(dept_id) values(10);
-- this query takes more than 5 seconds
SELECT activity_type,count(1) rc
FROM dept_activity da
WHERE (
@filter_by_dept IS NULL
OR da.depart_id IN (
SELECT td.dept_id
FROM #tbl_depts td
)
)
group by activity_type;
-- this query takes less than 500 milli seconds
SELECT activity_type,count(1) rc
FROM dept_activity da
WHERE (
@filter_by_dept IS NULL
OR da.depart_id IN (
10 -- changed to static value
)
)
group by activity_type;
1秒以内に最初のクエリのデータを返すためにどのように最適化できますか。
このように労働組合を使用する方法について '、ACTIVITY_TYPEを選択filter_by_deptがACTIVITY_TYPE 組合 SELECT ACTIVITY_TYPEでNULL グループですdept_activityダ (1)からのrc をカウントし、カウント(1どのように' – TheGameiswar
questi; ACTIVITY_TYPEによって( SELECTが#tbl_depts FROM をtd.dept_idをTD) グループIN dept_activityダ WHERE da.depart_id FROM)RC あなたのテストデータが大きい場合は、DDL、DMLが含まれている必要があります。テストデータが大きい場合は、テーブルのスキーマと統計をスクリプト化してください( '右クリックデータベース - >スクリプト生成 - >特定のデータベースオブジェクトを選択 - >次の画面で詳細を選択し、統計情報を選択してください) 'をクリックして質問に貼り付けます。この情報を使って、あなたが直面している問題と同じ問題を解決します。その他、質問に答えるのが非常に難しくなります。 – TheGameiswar