Taille maximale pour une requête SQL Server? DANS l'article? Est-il une Meilleure Approche [dupliquer]

possibilité de dupliquer:

T-SQL où col IN ( ... )

Quelle est la taille maximale d'une requête SQL Server? (nombre de caractères)

taille Max pour une clause IN? Je pense que J'ai vu quelque chose à propos D'Oracle ayant une limite de 1000 articles mais vous pourriez contourner cela avec ANDing 2 INs ensemble. Un problème similaire dans SQL Server?

UPDATE Quelle serait donc la meilleure approche si je devais prendre par exemple 1000 GUIDs d'un autre système (base de données non relationnelle) et faire un "JOIN IN code" contre le serveur SQL? Est-ce qu'il doit soumettre la liste de 1000 GUIDs à une clause IN? Ou y a-t-il une autre technique qui fonctionne plus efficacement?

Je n'ai pas testé ceci mais je me demande si je pourrais soumettre les GUIDs comme un XML doc. Par exemple

<guids>
    <guid>809674df-1c22-46eb-bf9a-33dc78beb44a</guid>
    <guid>257f537f-9c6b-4f14-a90c-ee613b4287f3</guid>
</guids>

et puis faire une sorte de XQuery rejoindre contre le Doc et la Table. Moins efficace que 1000 articles dans la clause?

85
demandé sur Community 2009-12-08 23:52:11

4 réponses

chaque lot SQL doit correspondre à la limite de Taille du lot : 65,536 * Taille du paquet réseau.

sinon, votre requête est limitée par les conditions d'exécution. La taille de la pile est habituellement épuisée parce que x IN (a,b, c) n'est rien d'autre que x=A ou x=b ou x=c, ce qui crée un arbre d'expression similaire à x=A ou (x=B ou (x=c)), de sorte qu'il devient très profond avec un grand nombre d'OR. SQL 7 frapperait un SO à environ 10k valeurs dans le IN , mais aujourd'hui, les piles sont beaucoup plus profondes (à cause de x64), il peut aller assez profond.

mise à Jour

vous avez déjà trouvé L'article D'Erland sur le thème de passer des listes/tableaux à SQL Server. Avec SQL 2008 vous avez aussi table Valued Parameters qui vous permettent de passer un datable entier comme un paramètre de type de table simple et d'y adhérer.

XML et XPath est une autre solution viable:

SELECT ...
FROM Table
JOIN (
   SELECT x.value(N'.',N'uniqueidentifier') as guid
   FROM @values.nodes(N'/guids/guid') t(x)) as guids
 ON Table.guid = guids.guid;
68
répondu Remus Rusanu 2009-12-08 23:59:29

les Maximums SQL Server sont divulgués http://msdn.microsoft.com/en-us/library/ms143432.aspx (version 2008)

une requête SQL peut être une varchar(max) mais est limitée à 65.536 * la taille du paquet réseau, mais même alors ce qui est le plus susceptible de vous faire trébucher est les 2100 paramètres par requête. Si SQL choisit de paramétrer les valeurs littérales dans la clause in, je pense que vous atteindrez cette limite en premier, mais je ne l'ai pas testé.

Edit : Test, même forcé parameteriztion il a survécu - j'ai frappé un test rapide et qu'il avait l'exécution avec 30k éléments À l'intérieur de la clause. (SQL Server 2005)

à 100k articles, il a fallu un certain temps, puis a chuté avec:

Msg 8623, Niveau 16, État 1, Ligne 1 Le processeur de requête a manqué de ressources internes et ne pouvait pas produire un plan de requête. C'est un événement rare et seulement prévu pour les très des requêtes complexes ou des requêtes qui font référence à un très grand nombre de tables ou de partitions. Veuillez simplifier la requête. Si vous croyez avoir reçu ce message par erreur, veuillez communiquer avec les Services de soutien à la clientèle pour obtenir de plus amples renseignements.

Donc 30k est possible, mais juste parce que vous pouvez le faire - ne signifie pas que vous devriez :)

Edit : Suite en raison d'une question.

50k a fonctionné, mais 60k a abandonné, donc quelque part dans là, sur mon banc d'essai btw.

en termes de comment faire cette jointure des valeurs sans utiliser un grand dans la clause, personnellement je créerais une table de temp, insérerais les valeurs dans cette table de temp, l'indexerait et puis l'utiliserais dans une jointure, lui donnant les meilleures occasions d'optimiser les jointures. (La génération de l'index sur la table temp créera des statistiques pour cela, qui aideront l'optimiseur en règle générale, bien que 1000 GUIDs ne trouveront pas exactement des statistiques trop utiles.)

35
répondu Andrew 2012-08-31 14:39:12

par lot, 65536 * Taille du paquet réseau qui est de 4k so 256 MB

S'arrêtera bien avant, mais ce n'est pas précis.

vous vous retrouvez avec des erreurs de mémoire mais je ne me souviens pas de l'erreur exacte. Un énorme IN sera inefficace de toute façon.

Edit: Remus reminded me: l'erreur concerne" stack size "

12
répondu gbn 2009-12-08 21:03:28

pouvez-vous charger les GUIDs dans une table à gratter puis faire un

... WHERE var IN SELECT guid FROM #scratchtable
7
répondu DaveE 2009-12-08 21:14:20