Большой запрос, несколько таблиц, старый и новый синтаксис JOIN - PullRequest
1 голос
/ 01 ноября 2011

У меня большой запрос, который объединяет около 20 таблиц (в основном это внешние соединения).Он использует более старый синтаксис соединения с запятыми и где условия с (+) для внешних объединений.Мы заметили, что он потребляет много памяти сервера.Мы пробуем несколько вещей, среди которых одна идея состоит в том, чтобы преобразовать этот запрос для использования более нового синтаксиса ANSI, поскольку синтаксис ANSI позволяет лучше контролировать порядок JOIN, а также явно указывает предикаты JOIN по мере их применения.

Помогает ли преобразование запроса из более старого синтаксиса в более новый синтаксис ANSI в сокращении объема обрабатываемых данных для таких больших запросов, охватывающих большое количество таблиц?

Ответы [ 3 ]

4 голосов
/ 01 ноября 2011

По моему опыту, это не так - он генерирует идентичные планы выполнения.Тем не менее, новый синтаксис JOIN позволяет вам делать то, что вы не можете сделать со старым синтаксисом.Я бы порекомендовал преобразовать его по этой причине и для ясности.Синтаксис ANSI намного проще для чтения (по крайней мере, для меня).После преобразования вы можете сравнить планы выполнения.

0 голосов
/ 01 ноября 2011

Как упоминалось в DCookie, обе версии должны создавать идентичные планы выполнения. Я бы начал с рассмотрения плана выполнения текущего запроса и выяснения того, что на самом деле занимает память. Быстрый взгляд на вывод DBMS_XPLAN.DISPLAY_CURSOR должен быть хорошим началом. Как только вы точно знаете, какую часть запроса вы пытаетесь улучшить, вы сможете проанализировать, поможет ли переключение на соединения в стиле ANSI помочь вам достичь конечной цели.

0 голосов
/ 01 ноября 2011

DCookie сказал, что все, что можно сказать о синтаксисе ANSI.

Однако, если вы внешне объедините 20 таблиц, неудивительно, что вы будете использовать много памяти сервера.Возможно, если вы урежете свой запрос в меньших подзапросах, это может повысить производительность.Таким образом, не все таблицы необходимо читать в памяти, а затем объединять в памяти, а затем фильтровать, а затем выбирать только те столбцы, которые вам нужны.

Изменение этого порядка по крайней мере спасет память, хотя это не должно улучшить скорость выполнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...