2016-03-29 7 views
1

私の現在の目標は動的選択の作成とクエリです。私たちの場合、我々は参照テーブルを持っています。参照テーブルには、参照列の値とテーブル名が含まれます。これらの参照を持つ他のテーブルに対して動的クエリを作成します。例:大規模な動的選択とクエリのベストプラクティスは何ですか

select * from {table} where {pk1} in (...) and {pk2} in {...} 

この生成されたクエリに問題がありました。いくつかの行は結果の戻り値ですが、問合せが異なる条件であるため問合せには含まれません。

変更SQL生成ここでは、この

select * from {table} where ({pk1}=(value1) and {pk2}=(value2)) or ({pk1}=(value3) and {pk2}=(value4)) ...) 

を好きに問題が解決しますが、クエリの実行時間は、代わりに「IN」クエリの良くないました。それは約10-20倍遅くなります。クエリ文字列が "IN"クエリではなく大きすぎます。

各テーブルに対して新しいTYPEを動的に作成することはできず、列は同じ型と順序ではないため、テーブル型のクエリは使用できません。将来、新しいテーブルタイプが挿入される可能性があります。

これを実行するベストプラクティスは何ですか?

よろしく

+0

"in"句にはどれくらいの値がありますか?たとえば、(1,2,3、......、10000)の{pk1} –

+0

これは参照先の表に依存します。現在1つのテーブルの最大行数は約50kです。 –

答えて

-1

私は、あなたがこの用法は、1,2,3,4(中」THEN速く

IF (OBJECT_ID('tempdb..#tid') IS NULL) 
    BEGIN 
    CREATE TABLE #tid(Id BIGINT); 
    INSERT INTO #tid (Id) VALUES (1), 
     (2), 
     (3), 
     (4), 
     (5), 
     (6), 
     (7), 
     (8), 
     --...... 
     (10000); 
    END 
select * from {table} where {pk1} in (SELECT Id FROM #tid); 

、このような文 "で" のために一時テーブルを使用することができると思います... 、10000)

+0

SELECTステートメントについて質問します。INSERTステートメントとUPDATEステートメントについては、バッチを使用できます。 –

関連する問題