Базы данных Oracle - статьи

         

Параметр cursor_sharing в СУБД Oracle9i


В СУБД Oracle9i параметр cursor_sharing может иметь значение similar (аналогичные операторы), которое позволяет средствам разделения курсоров учитывать особенности запросов в системах поддержки принятия решений. Рассмотрим два оператора SQL, показанных ниже. Предположим, что таблица emp имеет индекс первичного ключа (столбец empno) и индекс столбца deptno: select * from emp where empno=1234 и select * from emp where deptno<400

В первом случае будет выполняться поиск по индексу первичного ключа, и это будет лучшим планом выполнения; решение, принятое оптимизатором не будет изменено, если литерал 1234 будет заменен другим литералом, таким, как 5678. Следовательно, курсоры могут благополучно разделяться, не оказывая никакого влияния на производительность; такие литералы называются надежными литералами (safe literals). Во втором случае с условием неравенства желательно, чтобы оптимизатор сгенерировал другой план выполнения, если, например, литерал 400 будет заменен другим литералом, таким, как 10. Следовательно, несмотря на то что два оператора SQL разбираются одинаково, они не будут иметь разделяемого плана выполнения; такие литералы называются ненадежными литералами (unsafe literals). В СУБД Oracle9i это распознавание осуществляется механизмом разделения курсоров, если значение параметра cursor_sharing – similar.

Значение similar в параметре cursor_sharing также выгодно использовать для изменения поведения механизма разделения курсоров, когда в операторах SQL используются литералы, которые фактически не изменяются между вызовами, как в показанном выше примере оператора со списком литералов в предикате (IN-list).

Кажется заманчивым в СУБД Oracle9i устанавливать параметр cursor_sharing=similar как для OLTP-систем, так и для систем поддержки принятия решений, однако существуют случаи, когда это не выгодно. В тех случаях, когда в операторах SQL есть литералы, фактические значения которых инициируют оптимизацию, а сами значения изменяются почти в каждом операторе, производительность выполнения операторов будет равна производительности выполнения операторов без разделения курсоров (то есть как при установке значения параметра по умолчанию: cursor_sharing=exact), во время которого выполняется полный разбор каждого оператора. Поэтому в таких случаях не следует использовать разделение курсоров. В тех случаях, когда фактические значения литералов изменяются лишь несколько раз, установка параметра cursor_sharing=similar может улучшить масштабируемость и сократить время ответа. Однако представляется, что это редкие случаи, установка параметра cursor_sharing=similar в общем не дает какого-либо положительного эффекта по сравнению с надлежащим программированием приложений. Результаты тестирования, приведенные в приложении, ясно показывают, что установка параметра cursor_sharing=similar реально приводит к небольшому снижению производительности, если фактическое значение литерала (инициирующее оптимизацию) изменяется между вызовами.



Содержание раздела