Aquí podría ser tu PUBLICIDAD


¿Alguna vez encontró una consulta que SQL Server no pudo ejecutar porque hacía referencia a demasiadas tablas?

votos
15

¿Alguna vez has visto alguno de sus mensajes de error?

- SQL Server 2000

No se pudo asignar una tabla auxiliar para la resolución de vista o función.
Se superó el número máximo de tablas en una consulta (256).

- SQL Server 2005

Demasiados nombres de tabla en la consulta. El máximo permitido es 256.

Si es así, ¿qué has hecho?

¿Abandonado? ¿Convenció al cliente de simplificar sus demandas? Denormalized la base de datos?


@ (todos quieren que publique la consulta):

  1. No estoy seguro de si puedo pegar 70 kilobytes de código en la ventana de edición de respuestas.
  2. Incluso si puedo esto, esto no ayudará, ya que estos 70 kilobytes de código harán referencia a 20 o 30 vistas que yo también tendría que publicar, ya que de lo contrario el código no tendrá sentido.

No quiero sonar como si estuviera alardeando aquí, pero el problema no está en las consultas. Las consultas son óptimas (o al menos casi óptimas). He pasado incontables horas optimizándolos, buscando cada columna y cada tabla que se puede eliminar. Imagínese un informe que tiene 200 o 300 columnas que deben rellenarse con una sola instrucción SELECT (porque así fue como se diseñó hace unos años cuando todavía era un informe pequeño).

Publicado el 05/08/2008 a las 15:54
fuente por usuario Marek Grzenkowicz
En otros idiomas...        العربية       

8 respuestas

votos
8

Para SQL Server 2005, recomendaría usar variables de tabla y construir parcialmente los datos sobre la marcha.

Para hacer esto, crea una variable de tabla que represente el conjunto de resultados final que deseas enviar al usuario.

Luego, encuentre su tabla principal (digamos la tabla de pedidos en su ejemplo anterior) y extraiga esos datos, más un poco de datos suplementarios que indiquen solo una combinación (nombre del cliente, nombre del producto). Puede hacer un SELECT INTO para poner esto directamente en su variable de tabla.

A partir de ahí, repita en la tabla y para cada fila, haga un montón de pequeñas consultas SELECT que recuperen todos los datos suplementarios que necesita para su conjunto de resultados. Inserta estos en cada columna sobre la marcha.

Una vez completo, puede hacer un simple SELECCIONAR * de la variable de su tabla y devolver este conjunto de resultados al usuario.

No tengo ningún número difícil para esto, pero ha habido tres instancias distintas en las que he trabajado hasta ahora, donde hacer estas consultas más pequeñas realmente ha funcionado más rápido que hacer una consulta de selección masiva con un montón de combinaciones.

Respondida el 05/08/2008 a las 04:19
fuente por usuario Dillie-O


Aquí podría ser tu PUBLICIDAD


votos
1

Esto ocurriría todo el tiempo al escribir Informes de Reporting Services para las instalaciones de Dynamics CRM que se ejecutan en SQL Server 2000. CRM tiene un esquema de datos muy normalizado que da como resultado muchas combinaciones. En realidad, hay una revisión que aumentará el límite de 256 a 260: http://support.microsoft.com/kb/818406 (siempre pensamos que era una gran broma por parte del equipo de SQL Server).

La solución, como lo alude a Dillie-O, es identificar "subunidades" apropiadas (preferiblemente aquellas que se usan varias veces) y factorizarlas en variables temp-table que luego usa en sus uniones principales. Es un PIA importante y a menudo mata el rendimiento. Lo siento por ti.

@ Kevin, me encanta esa camiseta, lo dice todo :-).

Respondida el 02/11/2008 a las 04:50
fuente por usuario friism

votos
1

@chopeen Puede cambiar la forma en que calcula estas estadísticas y, en su lugar, mantener una tabla separada de todas las estadísticas por producto. Cuando se realiza un pedido, recorra los productos y actualice los registros apropiados en la tabla de estadísticas. Esto desplazaría una gran parte de la carga de cálculo a la página de pago en lugar de ejecutar todo en una gran consulta al ejecutar un informe. Por supuesto, hay algunas estadísticas que no van a funcionar tan bien de esta manera, por ejemplo, haciendo un seguimiento de las próximas compras de los clientes después de comprar un producto en particular.

Respondida el 05/08/2008 a las 04:19
fuente por usuario pix0r

votos
1

Nunca me he encontrado con este tipo de situación, y para ser honesto, la idea de hacer referencia a> 256 tablas en una consulta me llena de temor mortal.

Su primera pregunta probablemente debería ser "¿Por qué tantos?", Seguido de cerca por "¿Qué información NO necesito?" Me preocuparía que la cantidad de datos que se devuelven de dicha consulta también empezara a afectar el rendimiento de la aplicación de forma bastante severa.

Respondida el 05/08/2008 a las 03:57
fuente por usuario ZombieSheep

votos
0

Tenía el mismo problema en SQL Server 2005 (trabajó en 2008) cuando quería crear una vista. Resolví el problema mediante la creación de un procedimiento almacenado en lugar de una vista.

Respondida el 07/03/2012 a las 04:59
fuente por usuario Tamas Pataky

votos
0

Tenía este mismo problema ... mi caja de desarrollo se ejecuta SQL Server 2008 (la vista funcionaba bien), sino en la producción (con SQL Server 2005) que la vista no lo hizo. Terminé la creación de puntos de vista para evitar esta limitación, el uso de los nuevos puntos de vista como parte de la consulta en la vista que arrojó el error.

Teniendo en cuenta la clase de tonto la ejecución lógica es la misma ...

Respondida el 19/08/2010 a las 06:29
fuente por usuario LeRoy DeNooyer

votos
0

Publique la consulta: D

También siento que uno de los posibles problemas podría ser tener toneladas (leer más de 200) de tablas de nombre / valor que podrían condensarse en una única tabla de búsqueda.

Respondida el 05/08/2008 a las 04:26
fuente por usuario Shawn

votos
0

Me gustaría ver esa consulta, pero me imagino que es un problema con algún tipo de iterador, y aunque no puedo pensar en ninguna situación donde sea posible, apuesto a que es de un mal momento / caso / cursor o una tonelada de vistas mal implementadas.

Respondida el 05/08/2008 a las 03:58
fuente por usuario Shawn