Я перенес базу данных оракула компании в mysql (да, не спрашивайте меня, почему), и несколько запросов (для отчетов) огромны и работают в mysql
Один из них - 4021 строка с 89 INNER JOIN
Этот генерирует подробный финансовый отчет для компании-клиента за последний год.
Мне нужен этот отчет (поскольку мы скоро подойдем к концу года), работающий на 2011 год, и я видел на многих веб-сайтах, что максимальное левое соединение для mysql составляет 60, что-то левое соединение.
Я облажался с этим отчетом? или есть способ запустить его?
4 ответа
Я думаю, что ваш запрос отчета в любом случае приведет к using temporary
в EXPLAIN. Вы можете разбить свой единственный запрос на несколько в транзакции и явно создать временные таблицы.
Это может быть еще более полезным, если ваш запрос Oracle содержит что-то вроде именованных подзапросов (я имею в виду WITH
подзапросов из T-SQL, я не знаю, существуют ли они в Oracle, но определенно не существуют в MySQL).
Вам придется перейти вверх (или вниз, в зависимости от вашего взгляда) к языку программирования, чтобы обойти это (Ruby, PHP, Python и т. д.), и все это упростит обработку такого количества соединений, просто используя собственные объекты вместо того, чтобы полагаться исключительно на огромное объединение.
И вы правы, максимальное количество объединений в MySQL равно 61 ( http://dev.mysql.com/doc/refman/5.0/en/joins-limits.html)
JOIN
, равно 61, а не максимальное количество JOIN
в любом запросе равно 61.
Если это так, вы можете попытаться разбить запрос на несколько частей и получить предварительно запрошенный контент «левого соединения» вместе с некоторыми другими элементами, где это целесообразно. Например, вы можете предварительно запросить такие вещи, как (и просто угадать)
Товарно-материальные ценности с категориями с кодом основного счета (столбцы идентификаторов) и т. д. в качестве одного предварительного запроса.
Присоединитесь к этому со всеми деталями заказа, чтобы получить сводку заголовка заказа, чтобы получить идентификатор клиента и присоединиться к клиентам в качестве еще одного предварительного запроса. Убедитесь, что любые ключевые элементы присоединяются к общему требованию к отчету.
Продолжите список, где это возможно, и вы, вероятно, сможете убить кучу, поскольку они будут результатами подзапросов, где ни на одном уровне не будет 61 соединения.
Используйте тип enums, который избавит вас от болезненных левых соединений
Если у вас есть несколько таблиц, которые вы можете удалить, просто используя enum
, это большое улучшение.
Особенно с тем, какие данные у вас есть
Похожие вопросы
Новые вопросы
mysql
MySQL — это бесплатная система управления реляционными базами данных (RDBMS) с открытым исходным кодом, которая использует язык структурированных запросов (SQL). НЕ ИСПОЛЬЗУЙТЕ этот тег для других БД, таких как SQL Server, SQLite и т. д. Это разные БД, которые используют свои собственные диалекты SQL для управления данными. В вопросе всегда указывайте точную версию сервера. Версии 5.x сильно отличаются по своим возможностям от версий 8+.