Запрос делает декартово соединение, если только - PullRequest
4 голосов
/ 15 марта 2011

У меня есть запрос, который должен вернуть 2 строки. Тем не менее, он возвращает 48 строк. Он ведет себя так, будто одна из таблиц, к которой присоединяются, не существует. Но если я добавлю столбец из этой таблицы в предложение select без изменений в части from или where запроса, он вернет 2 строки.

Вот что говорит «Объяснить план» без «m. *» В select: Explain Plan before

Здесь снова после добавления m. * В select: Explain Plan after

Кто-нибудь может объяснить, почему он должен так себя вести?

Обновление : эта проблема существовала только в одной системе, а не в другой. Администратор БД проверил, что для проблемы с параметром optimizer_features_enable установлено значение 10.2.0.5, а для случая, когда этого не произошло, для параметра optimizer_features_enable установлено значение 10.2.0.4. К сожалению, сайт клиента работает 10.2.0.5.

Ответы [ 2 ]

2 голосов
/ 15 марта 2011

Речь идет об исключении объединения, которое было введено в 10gR2:

Таблица исключения (поочередно называется "присоединение к устранению") удаляет лишнее таблицы из запроса. Стол избыточно, если его столбцы только ссылка на предикаты соединения, и гарантируется, что эти соединения ни фильтровать, ни расширять результирующие строки. Есть несколько случаи, когда Oracle устранит избыточный стол.

Может быть, это что-то вроде ошибки или около того. Взгляните на эту статью.

0 голосов
/ 15 марта 2011

Похоже, ошибка. Какие ограничения?

Логически, если бы все строки в MASTERSOURCE_FUNCTION имели функцию NON-OSDA, то это не исключало бы никаких строк (или, если бы ни одно из них не имело этого значения, тогда все строки были бы исключены).

Если пойти еще дальше, если каждая строка в MASTERSOURCE имеет одну или ноль строк N-OSDA в MASTERSOURCE_FUNCTION, то она должна быть кандидатом на исключение. Но между идентификатором MASTERSOURCE ID и NAME также должна быть взаимно-прямая связь.

Я бы извлек ROWID из ACCOUNTSOURCE для 48 строк, затем проследил идентификатор и имя MASTERSOURCE и посмотрел, на каких основаниях эти строки дублируются или не исключаются. То есть в MASTERSOURCE есть 12 повторяющихся имен, где ожидается, что они будут уникальными с помощью ограничения NOVALIDATE.

...