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

v_product_id была установлена на 1, запрос получает детальную информацию

о товаре № 1:

□ SELECT * FROM products WHERE product_id = :v_product_id;

PRODUCT_ID PRODUCT_TYPE_ID NAME

DESCRIPTION PRICE

1 1 Modern Science

A description of modern science 19-95

В следующем примере устанавливается v_product_id на 2 и повторяется

запрос:

□ BEGIN

:v_product_id := 2;

END;

SELECT * FROM products WHERE product_id = :v_product_id;

PRODUCT_ID PRODUCT_TYPE_ID NAME

DESCRIPTION PRICE_ __

2 1 Chemistry

Introduction to chemistry 30

Поскольку запрос, используемый в этом примере, полностью идентичен

запросу из предыдущего примера, будет повторно использован кэшированный

запрос, что обеспечит повышение производительности.

Настройка высокой производительности SQL 609

Совет Обычно переменные связи стоит использовать в тех случаях, когда один и тот же

запрос выполняется много раз. Кроме того, переменные связи этого примера определяются

только на время сеанса, поэтому после каждого прерывания сеанса их значения придется восстанавливать.

Составление списка и вывод переменных связи

В SQITPlus можно получить список переменных связи, используя команду

VARIABLE:

П VARIABLE

v a r i a b l e v _ p r o d u c t _ id

d a t a t y p e NUMBER

В SQITPlus можно вывести значение переменной связи, используя команду

PRINT:

□ PRINT v _ p r o d u c t _ id

V_PRODUCT_ID

2 _ .

Использование переменных связи для хранения значений,

возвращенных функцией PL/SQL

Переменные связи можно также использовать для хранения значений,

возвращенных функцией PL/SQL. В следующем примере создается переменная

связи v_average_product_price и в нее записывается результат, возвращаемый

функцией average_product_price() (эта функция была описана

в главе 11; она вычисляет среднюю стоимость товара для заданного

product_type_id):

□ VARIABLE v _ a v e r a g e _ p r o d u c t _ p r i c e NUMBER

BEGIN

:v _ a v e r a g e _ p r o d u c t _ p r i c e := a v e r a g e _ p r o d u c t _ p r i c e ( 1 ) ;

END;

/P

RINT v _ a v e r a g e _ p r o d u c t _ p r i c e

V_AVERAGE_PRODUCT_PRICE

24.975

Использование переменных связи для хранения строк из REFCURSOR

Переменную связи можно использовать для хранения возвращенных значений

из REFCURSOR (REFCURSOR является указателем на список строк). В следующем

примере создается переменная связи v _ p r o d u c t s _ r e f c u r s o r и в нее

записывается результат, возвращаемый функцией p r o d u c t_ p a c k a g e . g e t_

p r o d u c t s _ r e f _ c u r s o r ( ) (она описана в главе 11 и возвращает в REFCURSOR список

строк из таблицы products):

□ VARIABLE v _ p r o d u c t s _ r e f c u r s o r REFCURSOR

BEGIN

610 Глава 16

:v _ p r o d u c t s _ r e f c u r s o r := p r o d u c t _ p a c k a g e . g e t _ p r o d u c t s _ r e f _ c u r s o r ( );

END;

/

PRINT v _ p r o d u c t s _ r e f c u r s o r

PRODUCT_ID NAME PRICE

Modern S c ie n c e 19 .9 5

2 C h em i s t r y 30

3 S upe rno va 2 5 .9 9

4 Tank War 1 3 .9 5

5 Z F i l e s 4 9 .9 9

6 2412: The Re tu rn 14 .9 5

7 Space F o r c e 9 13 .4 9

8 From A n o th e r P la n e t 12 .9 9

9 C l a s s i c a l Mu s ic 10 .9 9

10 Pop 3 15 .9 9

11 C r e a t i v e Y e l l 14 .9 9

PR0DUCT_ID NAME PRICE

12 My F r o n t L in e 13 .4 9

Сравнение стоимости выполнения запросов

Программное обеспечение Oracle использует подсистему, известную под

именем оптимизатор (optimizer) для генерации наиболее эффективного

пути доступа к хранящимся в таблицах данным. Генерируемый оптимизатором

для каждого запроса путь доступа к данным принято называть планом

выполнения (execution plan). Чтобы сгенерировать наилучший план

выполнения оператора, OraclelOg (и более поздние версии) автоматически

собирает статистику о данных из таблиц и индексов; этот процесс принято

называть стоимостной оптимизацией (cost-based optimization).

Сравнение планов выполнения, сгенерированных оптимизатором,

позволяет оценить относительную стоимость одного оператора SQL в

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

сделать ваши операторы оптимальными. В этом разделе вы узнаете, как

просмотреть и понять пару планов выполнения из примеров.

Примечание Версии базы данных, предшествующие OraclelOg, не обеспечивают автоматического

сбора статистики, а оптимизатор по умолчанию применяет так называемую оптимизацию

по правилам (rule-based optimization). Оптимизация по правилам использует синтаксические

правила для генерации оптимального плана выполнения. Как правило, стоимостная оптимизация

работает лучше, чем оптимизация по правилам, так как она использует фактическую

информацию, собранную для данных из таблиц и индексов. Если вы используете 0racle9i или

более ранние версии, вы можете собирать статистику самостоятельно (о том, как это сделать,

см. ниже в разделе «Сбор статистики о таблицах»).