2011-12-10 13 views
10

emigré la base de datos Oracle a MySQL empresa (sí no me pregunte por qué) y algunas consultas (para informes) son enormes y trabajar en MySQLconsultas de Oracle a MySQL izquierda se une

uno de ellos es 4021 líneas con 89 INNER JOIN

éste genera un informe completamente detallado para el cliente de la empresa para financiero durante el último año.

necesito ese informe (ya que estamos llegando a fin de año) trabajando para 2011 y vi en muchos sitios web que la combinación máxima izquierda para mysql es 60 algo que queda por unirse.

¿Estoy atornillado con este informe? o hay una forma de ejecutarlo?

+0

Si necesita nuevas uniones porque su informe cubre un nuevo año, su modelo de datos probablemente sea incorrecto. –

+1

¿Por qué no hay capitalización? –

Respuesta

0

Tendría que saltar hacia arriba (o hacia abajo, según su vista) a un lenguaje de programación para evitar esto (Ruby, PHP, Python, etc.), lo que facilitaría el manejo de muchas combinaciones utilizando solo objetos nativos de confiar únicamente en una gran unión.

Y está en lo cierto, el número máximo de combinaciones en MySQL es 61 (http://dev.mysql.com/doc/refman/5.0/en/joins-limits.html)

+1

El enlace que proporcionó dice que el número máximo de tablas a las que se puede hacer referencia en una declaración 'JOIN' es 61, no que el número máximo de' JOIN's en una consulta sea 61. –

0

Si ese es el caso, es posible que desee para tratar de romper la consulta por algunos y conseguir algo de la "izquierda unirse a" contenido pre-consultado junto con algunos otros elementos cuando sea práctico. Por ejemplo, puede consultar cosas como (y simplemente adivinar)

Elementos de inventario con categorías con código de cuenta de mayor (columnas de id), etc. como una consulta previa.

Únase a eso con Todos los detalles de la orden para ordenar el resumen del encabezado para obtener la ID del cliente y unirse a los clientes como otra consulta previa. Asegúrese de que los elementos clave se unan al requisito general del informe.

Continúa en la lista siempre que sea posible y probablemente puedas matar un montón, ya que serían resultados de SUBQueries donde ningún nivel tendría 61 uniones en curso.

0

uso enumeraciones tipo, que le ahorrará a partir dolorosa izquierda se une

si tiene pocas mesas se pueden eliminar sólo por el uso enum que es una gran mejora.

especialmente con qué tipo de datos que tiene

5

Creo que su consulta de informe será de todos modos dar lugar a using temporary de explicar. Puede dividir su consulta individual en varias en una transacción y hacer las tablas temporales explícitamente.

Esto puede ser aún más útil si su consulta de Oracle contiene algo así como subconsultas con nombre (quiero decir WITH subconsultas de T-SQL, no sé si existen en Oracle, pero definitivamente no existen en MySQL).

+0

+1 para tablas temporales. Estado allí, hecho eso. – Mchl

+0

CTE existen en bases de datos normales pero mysql :))). El espacio asignado para las tablas temporales también tiene un número finito, incluso en mysql deberías pensar en eso también :)) –