0

#TEMP_TABLE整数のインデックス付きフィールドを持つ元のテーブルがあり、それを関連フィールドのID別のテーブルに結合してフィルタリングする必要があります。これは、いくつかの条件によってフィルタリングされます。これらの条件はループで提供されます。ループの最後で、フィルター処理された結果を元の #TEMP_TABLE に戻す必要があります。FILTERID_RWHILE

だから現在、私は次のようなことをしています

WHILE [loop condition]
BEGIN
   SELECT #TEMP_TABLE.ID INTO #TMP_FILTERED_TABLE
   FROM #TEMP_TABLE INNER JOIN FILTER ON #TEMP_TABLE.ID = FILTER.ID_R
   WHERE FILTER.FIELD1 = [parameter1 from loop] AND FILTER.FIELD2 = [parameter2 from loop]

   TRUNCATE TABLE #TEMP_TABLE

   INSERT INTO #TEMP_TABLE (ID)
   SELECT ID FROM #TMP_FILTERED_TABLE

   DROP TABLE #TMP_FILTERED_TABLE
END -- END LOOP

FILTER テーブルは非常に大きいため、JOIN は二重のタスクを実行します。FILTER を ID によってより小さいサブセットに制限し、FILTER が独自の WHERE 句によってフィルタリングされると、出力結果が制限されます。#TEMP_TABLE が小さくなるため、ループが進むにつれて結果が小さくなります。

要件は、ループの最終結果が元の #TEMP_TABLE にあることです。

これを行うためのより良い、より最適な、最適化された方法はありますか?

4

1 に答える 1

0

Filtered_table を使用する代わりに、

 delete t 
 from #temp_table t
      INNER JOIN FILTER ON t.ID = FILTER.ID_R
      WHERE NOT (FILTER.FIELD1 = [parameter1 from loop] 
                 AND FILTER.FIELD2 = [parameter2 from loop])
于 2013-08-22T08:46:02.730 に答える