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

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

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

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

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

10
Derek 10 Дек 2011 в 07:38
Если вам нужны новые объединения, потому что ваш отчет охватывает новый год, ваша модель данных, вероятно, неверна.
 – 
a_horse_with_no_name
15 Янв 2012 в 13:49

4 ответа

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

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

5
newtover 15 Янв 2012 в 13:43
CTE существуют в обычных базах данных, кроме mysql :))) . Место, выделенное для временных таблиц, тоже имеет конечное число, даже в mysql об этом тоже стоит подумать :))
 – 
Sergey Benner
21 Янв 2012 в 18:15

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

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

0
Josh 10 Дек 2011 в 07:43
1
В предоставленной вами ссылке указано, что максимальное количество таблиц, на которое может ссылаться любой оператор JOIN, равно 61, а не максимальное количество JOIN в любом запросе равно 61.
 – 
ta.speot.is
15 Янв 2012 в 08:38

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

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

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

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

0
DRapp 10 Дек 2011 в 08:15

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

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

Особенно с тем, какие данные у вас есть

0
zackaryka 17 Дек 2011 в 05:34