2017-10-26 10 views
1

私は様々なプロジェクト(データベース)からいくつかのレコードをテンポラリテーブルに動的に収集し、一時テーブルからテーブルに挿入するプロシージャを作成しました。 WHEREステートメントでは、残念ながら私は実行プランにチェックしたときに、このクエリの部分が大量にかかることがわかりました。このINSERT部分またはWHERE部分を最適化するにはどうすればよいですか?SQLテンポラリテーブルからテーブルへの挿入を最適化する方法

INSERT INTO dbo.PROJECTS_TESTS (PROJECTID, ANOTHERTID, DOMAINID, is_test) 
    SELECT * FROM #temp_Test AS tC 
    WHERE NOT EXISTS (SELECT TOP 1 1 
         FROM dbo.PROJECTS_TESTS AS ps WITH (NOLOCK) 
         WHERE ps.PROJECTID = tC.projectId 
         AND ps.ANOTHERTID = tC.anotherLink 
         AND ps.DOMAINID = tC.DOMAINID 
         AND ps.is_test = tC.test_project 
         ) 
+0

よう

INSERT INTO dbo.PROJECTS_TESTS (PROJECTID, ANOTHERTID, DOMAINID, is_test) SELECT <maybe distinct> tC.* FROM #temp_Test AS tC LEFT OUTER JOIN FROM dbo.PROJECTS_TESTS AS ps on ps.PROJECTID = tC.projectId AND ps.ANOTHERTID = tC.anotherLink AND ps.DOMAINID = tC.DOMAINID AND ps.is_test = tC.test_project where ps.PROJECT ID IS NULL 

か何か、これは本番環境であれば、(NOLOCK)を使用しないでください。実行計画を表示してください。なぜこのクエリが不適格であると思われるのでしょうか。 PROJECTS_TESTSテーブルにインデックスがありますか? –

+0

1. #temp projectId、anotherLink、DOMAINID、test_projectにインデックスを作成します。 2.不要@TOP 1 1 @ 3.削除NOLOCK –

答えて

0

私はあなたがより良いEXISTSよりJOINを行うことによって提供することと思います。参加条件(現在はWHERE)の基数によっては、DISTINCTも必要になる場合があります。その

関連する問題