оракул запрос к MySQL левых присоединяется - PullRequest
10 голосов
/ 10 декабря 2011

Я перенес базу данных Oracle в Oracle MySQL (да, не спрашивайте меня почему), и несколько запросов (для отчетов) огромны и работают в MySQL

одна из них - 4021 строка с 89 INNER JOIN

Этот отчет генерирует подробный отчет для клиента компании за финансовый год.

мне нужен этот отчет (так как мы скоро дойдем до конца года), работающий на 2011 год, и на многих веб-сайтах я увидел, что максимальное левое соединение для mysql составляет 60, что-то осталось.

я облажался с этим отчетом? или есть способ запустить его?

Ответы [ 4 ]

5 голосов
/ 15 января 2012

Я думаю, ваш запрос отчета в любом случае приведет к using temporary в EXPLAIN.Вы можете разбить один запрос на несколько транзакций и явно создать временные таблицы.

Это может быть еще более полезно, если ваш запрос Oracle содержит что-то вроде именованных подзапросов (я имею в виду WITH подзапросов из T-SQL).Я не знаю, существуют ли они в Oracle, но определенно не существуют в MySQL).

0 голосов
/ 10 декабря 2011

Если это так, вы можете попытаться разбить запрос на несколько частей и получить часть контента «левого соединения», предварительно запрошенного вместе с некоторыми другими элементами, где это целесообразно. Например, вы можете предварительно запросить такие вещи, как (и просто угадать)

Инвентаризация товаров с категориями с основным счетным кодом (столбцы идентификаторов) и т. Д. В качестве одного предварительного запроса.

Присоедините это со всеми деталями заказа к сводке заголовка заказа, чтобы получить идентификатор клиента, и присоединитесь к клиентам в качестве еще одного предварительного запроса. Убедитесь, что все ключевые элементы включены в общее требование к отчету.

Продолжайте вниз по списку, где это возможно, и вы, вероятно, можете убить группу, поскольку они будут результатами SUBQueries, где ни на одном уровне не будет 61 присоединения.

0 голосов
/ 17 декабря 2011

используйте тип enums, который избавит вас от болезненных левых соединений

, если у вас есть несколько таблиц, которые можно удалить, просто воспользовавшись enum, что является большим улучшением.

особенно с тем, чтовиды данных у вас

0 голосов
/ 10 декабря 2011

Вам придется прыгнуть вверх (или вниз, в зависимости от вашего взгляда) к языку программирования, чтобы обойти это (Ruby, PHP, Python и т. Д.), И все это упростит обработку многих объединений, просто используя собственные объекты вместополагаясь исключительно на огромное объединение.

И вы правы, максимальное количество объединений в MySQL составляет 61 (http://dev.mysql.com/doc/refman/5.0/en/joins-limits.html)

...