Выбрать главу

В следующих разделах вы увидите советы по настройке, которые ускорят

выполнение ваших запросов; затем вы ознакомитесь с более сложными

методами настройки производительности.

Для отбора строк используйте фразу 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 не полностью определены)