Представления выполняют только те объединения, которые им необходимы, или все объединения всегда? - PullRequest
1 голос
/ 26 апреля 2010

Я на оракуле БД. Допустим, у меня есть одно представление, которое объединяет три таблицы. Представление имеет два поля каждое. Каждое поле нуждается только в данных из двух из трех таблиц.

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

Ответы [ 3 ]

2 голосов
/ 27 апреля 2010

Как правило, он должен ударить по трем столам. Рассмотрим

SELECT A.VAL, B.VAL, C.VAL FROM A JOIN B ON A.ID = B.ID JOIN C ON A.ID = C.ID

Возможно, что один идентификатор в «A» будет иметь ноль, 1 или несколько совпадений в B или C. Если таблица «C» будет пустой, представление никогда не вернет строку, поэтому даже просто запрашивает A. VAL или B.VAL, он все еще должен был бы видеть, была ли соответствующая строка в "C".

Исключение составляют случаи, когда из-за принудительного ограничения ссылочной целостности оптимизатор знает, что строка в «B» всегда будет иметь родительскую строку в «A». В этом случае для выбора B.VAL не нужно фактически проверять наличие родительской строки в «A». Об этом свидетельствует статья

0 голосов
/ 27 апреля 2010

Как правило, ядро ​​базы данных объединяет все три таблицы, чтобы обеспечить правильный ответ.

Oracle иногда удаляет одну из таблиц, где это не меняет результат.

Это можно сделать, если: -

  • Существует ограничение внешнего ключа для таблицы, которую нужно удалить (т. Е. Строка в таблице может быть гарантированно найден)

  • В остальном таблица не используется. т.е. не выбрано из, в предложении where и т. д.

0 голосов
/ 26 апреля 2010

Это, вероятно, зависит от типа используемого соединения. Если они все являются внутренними соединениями, то обязательно нужно будет изучить все три таблицы.

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