Информационный сайт

 

Реклама
bulletinsite.net -> Книги на сайте -> Программисту -> Тоу Д. -> "Настройка SQL. Для профессионалов" -> 123

Настройка SQL. Для профессионалов - Тоу Д.

Тоу Д. Настройка SQL. Для профессионалов — СПб.: Питер, 2004. — 333 c.
ISBN 5-94723-959-0
Скачать (прямая ссылка): nastroykasqldlyaprof2004.djvu
Предыдущая << 1 .. 117 118 119 120 121 122 < 123 > 124 125 126 127 128 129 .. 161 >> Следующая


0DV.Item_Count, ODT.Text, P.Prod_Description. 0DV.Shipment_Date FRDM Recent_0rder_V 0V. OrderJDetaі I_V 0DV. Products P,

Code_Translations 0DT. Customers C WHERE UPPER(0V.Customer_Last_Name) LIKE :last_name||T AND UPPER(DV.Customer_First_Name) LIKE :first_name||T AND 0DV.0rder_ID = 0V.0rder_ID AND DV.Customer_ID = C.Customer_ID AND 0DV.Product_ID = P.Product_ID(+)

AND ODV.Status_Code = ODT.Code

AND 0DT.CodeJype = '0RDER_DETAIL_STATUS'

ORDER BY 0V.Customer_ID. 0V.0rder_ID Desc. 0DV.Shipment_ID. 0DV.0rder_Detail_ID

Излишние считывания в запросах, использующих представления

Теперь рассмотрим случай соединений с узлами, помеченными С* и С на рис. 7.35. Эти узлы представляют одну и ту же таблицу с одинаковыми операторами соединения, поэтому любой план исполнения, включающий оба узла, избыточен, он считывает одни и те же строки таблицы и, вероятно, записи индекса, дважды. Второе, ненужное считывание в любом случае не должно требовать физического ввода-вывода, так как первое считывание, выполненное менее чем миллисекунду назад, должно поместить блок таблицы или индекса в голову совместно используемого кэша. Если план исполнения сильно фильтруется перед тем, как обратиться ко второму, избыточному узлу, то дополнительными операциями логического ввода-вывода можно пренебречь. Ho для больших запросов или запросов, в которых большинство строк фильтруются только после подобных ненужных считываний, стоимость излишних операций логического ввода-вывода существенна.
Запросы с представлениями

249

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

Как избавиться от лишнего соединения с таблицей Customers? У вас есть три варианта.

¦ Добавить новые требуемые столбцы в список SELECT запроса, определяющего представление, и использовать их вместо ссылок на столбцы лишней таблицы в запросе, использующем представления. Это безопасно для других запросов, которым нужно то же представление, так как изменения включают только добавление столбцов, но не модификацию диаграммы определяющего представление запроса.

¦ Исключить лишнее соединение из запроса, определяющего представление, и использовать только столбцы из узла простой таблицы в запросе, использующем представления. Однако это опасно, если существуют другие использующие представления запросы, которым могут понадобиться исключенные столбцы представления.

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

Ненужные узлы и соединения

Рассмотрим соединение с узлом ОТ в последнем запросе, использующем представления. Кажется, что исходный определяющий представление запрос включает это соединение в целях поддержки запросов, относящихся к состоянию заказов. Ho на самом деле этот запрос даже не упоминает состояние заказа, поэтому у вас может возникнуть вопрос, нужен ли зтот узел. Если вы не заметили этот бесполезный узел, то могли бы распознать его, заметив в плане исполнения соединение с индексом по первичному ключу этой таблицы, но без считываний из самой таблицы. Такие только индексные считывания индексов по первичным ключам обычно указывают на ненужные соединения.

Безопасное исключение таких ненужных соединений будет достаточно непростым делом, потому что иногда у них есть функциональные побочные эффекты. Так как это внутреннее соединение, то, по крайней мере, вероятно, что, даже без фильтра для этого узла, само соединение отбрасывает строки, которые запрос не должен возвращать. Это может быть сделано за счет отбрасывания строк, где Orders .Status_Code IS NULL или где Status_Code указывает не недопустимые коды состояния, для которых не существует соответствия в таблице Code_Translations. Последнее маловероятно или должно быть исправлено во время восстановления ссылочной целостности. Однако равные null внешние ключи встречаются часто, и если значение столбца может быть null, вам следует задуматься о добавлении явного условия Status_Code IS NOT NULL перед тем, как убирать соединение, чтобы эмулировать неявную фильтрующую функцию внутреннего соединения. Более вероятно, что разработчик, применяющий представление, даже не подумал о неявной фильтрующей функции представления, и неявный фильтр — это нежелательная случайность. Таким образом, перед тем, как имитировать прежнее поведение
250

7. Диаграммное изображение и настройка сложных SQL-запросов

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

Запросы с операциями над множествами
Предыдущая << 1 .. 117 118 119 120 121 122 < 123 > 124 125 126 127 128 129 .. 161 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100