0

SQL が直接使用されるか、NHibernate によって作成された場合、「どこに / ない ([1 ~ 100 パラメーター])」という大きな条件がある可能性がある場合、クエリ プランの数を制限するために、パラメーターを特定の制限まで埋めることは理にかなっていますか? ?

パラメータは int/number で、DBMS は MSSQL または Oracle です。クエリは sp_executesql/executeimmediate を介して呼び出され、クエリ プランのキャッシュを適用します。

通常、このようなクエリには、同じクエリに対して最大 100 のクエリ プランがあります。このようなクエリのいくつかは、すぐにキャッシュをいっぱいにするか、キャッシュされたクエリ プランをまったく使用しないことでパフォーマンスが低下する可能性があります。

ユーザーは、特定の数のパラメーターに達するまで、最後の値を繰り返してパラメーター リストを埋めることができますか?

私の知る限り、MSSQL と Oracle は既知のクエリを文字列の等価性によって識別し、その結果、パラメーターの数が異なるごとに異なるクエリ プランが作成されます。

(値はもちろんパラメータであり、連結された数値ではありません)。

SELECT * FROM MyTable WHERE Id in (4001, 4002, 4003, ... , 4055, 4056)

56 個のパラメーターを使用して、次のように変更します。

SELECT * FROM MyTable WHERE Id in (4001, 4002, 4003, ... , 4055, 4056, 4056, 4056, 4056, 4056)

値 4056 を繰り返して 60 個のパラメーターを持ち、すべての長い「in」リストの長さは 50、60、70、80、90、100 です。10 個未満のパラメーターのみが残ります。

このような最大 100 個のパラメーターを持つクエリの場合、10 ~ 100 個のパラメーターに対して 10 個のクエリ プランがあり、さらに 1 ~ 9 個のパラメーター (塗りつぶしなし) に対して 9 個のクエリ プランがあります。

編集: NHibernate (3.1.0.4 以降) と SQL Server で、batch-size="200" を使用すると、実際にはパラメーター リストが固定長のパラメーター リストを持つ複数のステートメントに分割されることがわかりました。たとえば、118 個の ID パラメータを持つ select と batch-size="200" は、118 個の ID を持つ 1 つではなく、100、12、および 6 個の ID を持つ 3 つの select として送信される場合があります。これは私が望んでいたものと似ています.batch-size="200"は200の異なるSQL文字列ではなく、したがってクエリプランは時間の経過とともに蓄積されますが、おそらく16というより少ない数です.1の間の各パラメーターカウントに対して1つのSQLがあるようです.および 12、次に 25、50、および 100 のパラメーターを持つステートメント。繰り返し値を入力する方が効率的かもしれませんが、これはクエリ プランを確実に再利用するための良い方法です。

4

1 に答える 1

0

すべてが同じ値の型を表すクエリ パラメーターが多数ある場合は、パラメーター リストではなく、テーブル内の列にする必要があります。

それらが十分に静的である場合は、それらをフィルター テーブルに入れて、次の操作を行います。

SELECT t.*
FROM MyTable t
INNER JOIN FilterTable f ON t.Id = f.Id

それらが完全に動的である場合は、テーブル値パラメーターを使用します。SQL Server 2008 では、テーブル値パラメーターを NHibernate からストアド プロシージャに渡すことができます。Oracle で同じことを達成する方法

于 2013-07-12T18:30:55.747 に答える