Методы оптимизации выполнения запросов в реляционных СУБД


Семантическая оптимизация запросов - часть 9


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

Заметим, что условия целостности можно использовать для расширений условия запроса только в том случае, когда они гарантированно являются истинными. Как мы отмечали выше, в System R, например, ограничения целостности первого типа (т.е. ограничения на состояния базы данных) могут, вообще говоря, нарушаться внутри транзакции. Поэтому в общем случае при обработке запросов на языке SQL в СУБД, аналогичной System R, использование семантической оптимизации запросов на основе ограничений целостности может оказаться некорректным. Впрочем, это общее свойство подхода System R: в транзакциях, изменяющих состояние базы данных, запросы на выборку могут выдавать результаты, противоречащие ограничениям целостности базы данных.

Например, пусть в транзакции выполняется следующая последовательность операторов SQL:

INSERT INTO EMP: <223, Smith, 3>; SELECT EMPCOUNT FROM DEPT WHERE DEPT# = 3; UPDATE DEPT SET EMPCOUNT = EMPCOUNT + 1 WHERE DEPT# = 3.

Эта транзакция корректна с точки зрения целостности базы данных, но второй оператор выдаст семантически неверный результат. Аналогичный эффект может произойти и при попытке семантической оптимизации. Пусть в транзакции выполняются операторы

INSERT INTO EMP: <223, Smith, 3>; SELECT COUNT (*) FROM EMP WHERE EMP.DEPT# = 3; UPDATE DEPT SET EMPCOUNT = EMPCOUNT + 1 WHERE DEPT# = 3.

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

SELECT EMPCOUNT FROM DEPT WHERE DEPT# = 3. (Мы опускаем детали возможных преобразований). Но тогда, как и в предыдущем примере, результат запроса будет соответствовать ограничению целостности, но будет расходиться с реальным состоянием базы данных к моменту выполнения запроса.

Однако, если транзакция является "только читающей", т.е.


Начало  Назад  Вперед