registros ordenar operador funcion ejemplos contiene sql sql-server tsql limits

ordenar - Tamaño máximo para una consulta SQL Server? Cláusula IN? ¿Hay un mejor enfoque



ordenar registros sql (4)

Posible duplicado:
T-SQL DONDE col IN (...)

¿Cuál es el tamaño máximo para una consulta de SQL Server? (# de caracteres)

Tamaño máximo para una cláusula IN Creo que vi algo acerca de que Oracle tiene un límite de 1000 artículos, pero se puede solucionar esto con ANDing 2 INs juntos. ¿Problema similar en SQL Server?

ACTUALIZACIÓN Entonces, ¿cuál sería el mejor enfoque si necesito tomar, por ejemplo, 1000 GUID de otro sistema (base de datos no relacional) y hacer un "JOIN en código" contra SQL Server? ¿Es para enviar la lista de 1000 GUID a una cláusula IN? ? ¿O hay otra técnica que funcione de manera más eficiente?

No he probado esto, pero me pregunto si podría enviar los GUID como documento XML. Por ejemplo

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

y luego haga algún tipo de XQuery JOIN contra el Doc y la Tabla. ¿Menos eficiente que la cláusula IN de 1000 elementos?


¿Puedes cargar los GUID en una tabla de scratch y luego hacer un

... WHERE var IN SELECT guid FROM #scratchtable


Cada lote SQL tiene que caber en el Límite de tamaño de lote : 65.536 * Tamaño de paquete de red.

Aparte de eso, su consulta está limitada por las condiciones de tiempo de ejecución. Por lo general, se quedará sin tamaño de pila porque x IN (a, b, c) no es más que x = a OR x = b OR x = c, que crea un árbol de expresiones similar a x = a OR (x = b OR (x = c)), por lo que se pone muy profundo con una gran cantidad de OR. SQL 7 alcanzaría un SO con valores de aproximadamente 10k en el IN , pero ahora las pilas son mucho más profundas (debido a x64), por lo que puede llegar a ser bastante profundo.

Actualizar

Ya encontraste el artículo de Erland sobre el tema de pasar listas / matrices a SQL Server. Con SQL 2008 también tiene Parámetros de valores de tabla que le permiten pasar un DataTable completo como un parámetro de tipo de tabla única y unirse a él.

XML y XPath es otra solución 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;


Los Máximos de SQL Server se revelan en http://msdn.microsoft.com/en-us/library/ms143432.aspx (esta es la versión de 2008)

Una consulta SQL puede ser varchar (max) pero se muestra como limitada a 65.536 * Tamaño de paquete de red, pero incluso entonces lo más probable es que te tropieces con los 2100 parámetros por consulta. Si SQL elige parametrizar los valores literales en la cláusula in, creo que alcanzaría ese límite primero, pero no lo he probado.

Edición: pruébelo, incluso bajo la parametrización forzada, sobrevivió. Cogí una prueba rápida y la ejecuté con 30k elementos dentro de la cláusula In. (SQL Server 2005)

En 100k artículos, tomó algo de tiempo y luego cayó con:

Msg 8623, nivel 16, estado 1, línea 1 El procesador de consultas se quedó sin recursos internos y no pudo generar un plan de consulta. Este es un evento raro y solo esperado para consultas o consultas extremadamente complejas que hacen referencia a una gran cantidad de tablas o particiones. Por favor, simplifique la consulta. Si cree que recibió este mensaje por error, comuníquese con Servicios de soporte al cliente para obtener más información.

Entonces 30k es posible, pero solo porque puedes hacerlo, no significa que debas :)

Editar: continúa debido a una pregunta adicional.

50k funcionó, pero se perdieron 60k, así que en algún lugar de mi plataforma de prueba por cierto.

En términos de cómo hacer eso para unir los valores sin usar una cláusula grande, personalmente crearía una tabla temporal, insertaría los valores en esa tabla temporal, la indexaría y luego la usaría en una combinación, dándole las mejores oportunidades para Optimiza las uniones. (Generar el índice en la tabla temporal creará estadísticas para él, lo que ayudará al optimizador como una regla general, aunque 1000 GUIDs no encontrarán estadísticas demasiado útiles).


Por lote, 65536 * Tamaño del paquete de red que es 4k, por lo que 256 MB

Sin embargo, IN se detendrá mucho antes de eso, pero no es preciso.

Terminas con errores de memoria pero no recuerdo el error exacto. Una IN enorme será ineficiente de todos modos.

Editar: Remus me recordó: el error es sobre "tamaño de pila"