2014-01-17 9 views
12

Weiß jemand, was ist die Grenze für die Anzahl der Werte, die man in einer Liste von Ausdrücken haben kann (um auf eine Übereinstimmung zu testen) für die IN-Klausel?"IN" Klausel Begrenzung in Sql Server

+0

http://msdn.microsoft.com/en-us/library/ms143432.aspx – xdazz

+8

Sie sollten nie Code schreiben, der Sie irgendwo in der Nähe der Grenze bringt, weil in (aa, a2, ..., an) wird sehr ineffizient, wenn n groß wird - Sie sollten Ihre Abfrageauswahl über einen besseren Mechanismus steuern, wann immer es möglich ist, z die Entsprechung existiert Klausel –

+0

ist es nur eine Interviewfrage ... weil ich nicht glaube, dass in der praktischen Welt Sie irgendeine Situation haben würden, in der Matchgruppe gefunden werden kann nahe zur Größe – Dhaval

Antwort

13

Ja gespalten gibt es eine Grenze, aber MSDN only specifies that it lies "in the thousands":

Including an extremely large number of values (many thousands) in an IN clause can consume resources and return errors 8623 or 8632. To work around this problem, store the items in the IN list in a table.

auf diesem Fehler in Details Sehen, wir sehen, dass diese Grenze nicht spezifisch für IN ist aber gilt Komplexität im Allgemeinen abfrage:

Error 8623:

The query processor ran out of internal resources and could not produce a query plan. This is a rare event and only expected for extremely complex queries or queries that reference a very large number of tables or partitions. Please simplify the query. If you believe you have received this message in error, contact Customer Support Services for more information.

Error 8632:

Internal error: An expression services limit has been reached. Please look for potentially complex expressions in your query, and try to simplify them.

3

Je nach verwendeter Datenbank-Engine kann die Länge einer Anweisung begrenzt sein.

SQL Server hat eine sehr große Grenze:

Maximum Capacity Specifications for SQL Server

Also, für IN-Klauseln groß, es ist besser, eine temporäre Tabelle zu erstellen, die Werte einfügen und machen Sie einen JOIN. Es funktioniert auch schneller.

Es gibt eine Grenze, aber Sie können Ihre Werte in separate Blöcke in()

Select * 
From table 
Where Col IN (123,123,222,....) 
or Col IN (456,878,888,....) 

verwenden, um einen Tabellenwertparameter im Jahr 2008 oder einen hier beschriebenen Ansatz

Arrays and Lists in SQL Server 2005

4

Es ist nicht spezifisch, sondern auf die Abfrage-Plan-Generator überschreiten Speichergrenzen zusammen. Ich kann bestätigen, dass mit mehreren tausend es oft Fehler, kann aber durch Einsetzen der Werte in eine Tabelle ersten und umformulieren als

select * from b where z in (select z from c) 

die Abfrage aufgelöst werden, wenn die Werte in der Tabelle sind in c in Klausel wollen. Wir haben das erfolgreich mit einer In-Klausel von 1 Millionen Werten verwendet.

0

Je nachdem, wie Sie die Abfrage ausführen (JDBC, Hiberante, eine Art von SQL-GUI) und bei der Verwendung von Literalwerte anstelle einer Unterabfrage where X in (1, 2, 3...) - Sie können auch die folgenden Fehler auftreten:

Too many parameters were provided in this RPC request. The maximum is 2100.

Also wäre die Grenze in diesen Fällen 2100 (oder sogar noch weniger, wenn andere Parameter vorhanden sind).