В следующих разделах вы увидите советы по настройке, которые ускорят
выполнение ваших запросов; затем вы ознакомитесь с более сложными
методами настройки производительности.
Для отбора строк используйте фразу WHERE
Многие новички выбирают из таблицы все строки, в то время как им
требуется всего одна строка (или несколько строк). Гораздо лучше использовать
в операторе SELECT для выделения требующихся строк фразу WHERE.
Таким способом можно ограничить отбираемые строки только теми, которые
реально вам необходимы.
Например, необходима детальная информация о покупателях № 1 и
№ 2. Следующий запрос выбирает из таблицы customers в схеме store все
строки (неэкономый вариант):
□ — ПЛОХОЙ ВАРИАНТ (выбирает все строки из таблицы customers)
SELECT *
FROM customers;
CUSTOMER_дIDо FIRST_NAME LAST_NAME DOB
1 John Brown 01-JAN-65
2 Cynthia Green 05-FEB-68
3 Steve White 16.MAR-71
4 Gail Black
5 Doreen Blue 20-MAY-70
PHONE
800-555-1211
800-555-1212
800-555-1213
800-555-1214
□
В следующий запрос добавлена фраза WHERE, которой не было в предыдущем,
чтобы ограничить число строк именно теми, у которых custome r_id
равно 1 или 2:
ХОРОШИЙ ВАРИАНТ (ограничивает число отобранных строк)
SELECT *
Настройка высокой производительности SQL 599
FROM customers
WHERE customer_id IN (1, 2);
CUSTOMER_ID FIRST_NAME LAST_NAME DOB PHONE
1 John
2 Cynthia
Brown
Green
01-JAN-65 800-555-1211
05-FEB-68 800-555-1212
Следует избегать использования во фразе WHERE функций, так как это
приводит к увеличению времени выполнения оператора.
Лучше использовать соединения, чем задавать несколько
запросов
Обычно бывает более эффективно использовать в запросе соединение
таблиц, чем применять несколько запросов, когда требуется получить данные
из нескольких взаимосвязанных таблиц. В следующем плохом примере,
чтобы получить название товара и его тип для товара № 1, используется
два отдельных запроса. Первый запрос получает из таблицы products
значения столбцов name и produc.t_type_id для товара № 1. Затем второй
запрос использует это значение product_type_id для того, чтобы получить
значение столбца name таблицы product_types.
□ — ПЛОХОЙ ВАРИАНТ (два отдельных запроса, когда должен работать один)
SELECT name, product_type_id
FROM products
WHERE product_type_id = 1;
NAME PRODUCT_TYPE_ID
Modern Science 1
SELECT name FROM product_types
WHERE product_type_id = 1;
NAME
Вместо того чтобы использовать два отдельных запроса, как это показано
в предыдущем примере, нужно было получения той же самой информации
написать один запрос, в котором используется соединение таблиц
products и product_types. Следующий запрос использует соединение таблиц
products и product_types по столбцу product_type_id:
□ — ХОРОШИЙ ВАРИАНТ (один запрос вместо двух)
SELECT p.name, pt.name
FROM products p, product_types pt
WHERE p.product_type_id = p.product_type_id
AND p.product_id = 1;
NAME NAME
Book
Modern Science Book
600 Глава 16
Этот запрос выдает то же самое название товара и его тип, что и предыдущие
два, но эти значения получены в результате выполнения одного запроса.
Как правило, выполнить один запрос более эффективно, чем выполнить
два запроса.
В запросе нужно выбрать порядок соединения таким образом, чтобы к
последним по порядку соединения таблицам присоединялось меньшее количество
строк. Предположим, что вы соединяете три таблицы - tabl,
tab2 и Lab3, в таблице tabl 1000 строк, в таблице tab2 - 100 строк, а в таблице
tab3 - 10 строк. В этом случае следует сначала выполнить соединение
таблиц tabl и tab2, а затем присоединить к результату tab3.
В запросах следует избегать выполнения соединения сложных представлений,
поскольку в результате сначала будут выполнены запросы, по
которым создаются представления, и только потом будет запущен фактический
запрос. Вместо этого рекомендуется писать запросы, использующие
базовые таблицы, а не представления.
При выполнении соединений используйте полностью определённые
ссылки на столбцы
В запросы всегда надо включать псевдонимы таблиц и всегда указывать явно
соответствующий псевдоним для каждой ссылки на столбец в запросе
(это называется полностью определённой ссылкой на столбец). В этом
случае базе данных не придется разыскивать каждый столбец во всех таблицах,
используемых в запросе.
Следующий плохой запрос использует псевдонимы р и pt для таблиц
products и product_types, соответственно, но столбцы description и price
не являются полностью определёнными:
□ __ ПЛОХОЙ ВАРИАНТ (столбцы d e s c r ip t io n и p r ic e не полностью определены)