2017-11-27 11 views
0

私は自動的にSQL文を生成してDBを検索して特定の値のリストを探します。これにより、たとえば、SQL_QueryTableに格納されている180の問合せが生成されます。次に、私はカーソルを使用してSQL_QueryTableから各ステートメントをフェッチし、1億5000万レコードのテーブルに対してステートメントを実行し、最終的に結果を結果テーブルに格納します。n個のSQL文を持つテーブルに対してSQLクエリの並列処理を実行しますか?

ただし、これは動作しますが、非常に時間がかかります。 実行時間を改善するための提案を探しています。

DECLARE @SQLQuery nvarchar(max) 
DECLARE @Counter int = 1 
DECLARE @TrackerID nvarchar(max) 

DECLARE SQLQuery CURSOR 

    FOR SELECT SQL_Query, TrackerID FROM SQL_QueryTable 
OPEN SQLQuery 

     FETCH NEXT FROM SQLQuery INTO @SQLQuery, @TrackerID 

     WHILE @@FETCH_STATUS = 0 
      BEGIN 
       PRINT @SQLQuery 
       PRINT @Counter 

       Insert Into Table_1 (column1, column2, column3, column4) 
       Exec(@SQLQuery)   --      
       Update Table_1 
       Set TrackerID = @TrackerID 
       where TrackerID is null 

       SET @Counter = @Counter + 1 
       FETCH NEXT FROM SQLQuery INTO @SQLQuery, @TrackerID 
      END 
Close SQLQuery 
Deallocate SQLQuery 
+0

クエリは自動的に生成する必要がありますか?必要なものを実行するクエリの数を減らすことができれば、並列性は自動的に発生します(クエリプランナが高速化すると仮定した場合)。並列性が問題ではないかもしれません - より良いインデックスが必要なのかもしれません –

+0

はあなたのクエリが何をしているかに依存します...もしあなたの180のクエリが1つのレコードを処理しているなら、カーソルを使うのではなく、 – Squirrel

+0

こんにちは@ Nick.McDermaid、私は検索する必要があるキーワードの数が異なるので、私は自動的にSQL文を生成する必要があります。したがって、それらを1つのカーソルを使用してSQLステートメントとしてテーブルに格納し、2番目のカーソルを実行して結果を実行して格納します。 – vtanov

答えて

0

は関係なく、任意の標準の最適化方法の(インデックスは、最適化されたSELECTステートメントが...)あなたが見つける必要がある単一のデータごとに表1の時間を問い合わせます。これは努力を倍増させる。物事をスピードアップするには、ここでは別のアプローチが必要です。

単純なアップグレードでは、一連の変数を一度に検索することができます。たとえば、演算子が(=)の場合、これは簡単です。検索変数データを新しいアシスタントテーブルに格納し、INまたはINNER JOINを使用してすべてのストアド変数に対して1つのステートメントを作成し、フィルタリングされたデータを取得します。そのように検索する値が増えるほど、パフォーマンスは向上します。値が異なる列に格納されている場合、ORを使用するとパフォーマンスが大幅に低下するため、列ごとに繰り返すことができます。

オペレータは、多少複雑になるでしょう。それはあなたのカスタム検索によって異なります。等価演算子(=)は扱いやすくなります。範囲演算子(より小さい、より大きい、より小さい)は、それ自身でセットを定義し、結合するのがより困難です。 LIKE演算子に加えて、文字列を検索するための余分な努力も同じです。

結論として、(=)を使用して検索すると、それらが異なる列に分割されていても検索をグループ化できます。あなたが他の演算子を使用しない場合、あなたは大丈夫です。低い数字で使用する場合は、大多数のグループを使用し、複雑な検索は今のところ仕事のままにしておきます。

関連する問題