вторник, 27 сентября 2011 г.

Оптимизация запросов в ЦФТ.

Занималась сегодня оптимизацией запросов. Посмотрев план запроса, решила поменять порядок, по которому цепляются таблицы, т.к. хотелось, чтобы в плане выполнения запрос сперва шла таблица с наименьшим количеством строк. Почитав документацию по ЦФТ, решила использовать pragma tbl_order (false);

Прагма TBL_ORDER определяет режим генерации порядка таблиц в выборке в списке from. Если задано значение true (по умолчанию), то во всех операторах выборки данных (for, locate, select, insert, update, delete - см. 1.2.13.2-8) таблицы будут упорядочены в порядке, обратном порядку выражений для типов и коллекций в исходной выборке. Если задано значение false, то обратного упорядочивания происходить не будет.
В результате таблицы встали в нужном порядке, но план выполнения запроса остался прежним. Тогда решила использовать хинт LEADING. Он указывает оптимизатору использовать перечисленный набор таблиц первым по порядку в плане выполнения. Получилось так: select /*+LEADING(plp$hint(s))*/s(s.[INTERNAL_CODE] :UNO) in ::[SALE] all
Запрос стал отрабатывать так как и хотелось. :)

P.S. Для указания индекса, по которому должен выполняться запрос, можно так же использовать хинты. Будет так: select /*+ index( plp$hint(s) IDX_Z#MAIN_DOCUM_DATE_CREATE )*/ s(s.[DOCUMENT_UNO] :UNO) in ::[MAIN_DOCUM] all

P.P.S. ЦФТ не рекоммендует использовать хинты, но имхо, т.к. они делают индексы по усредненным данным, то на конкретных данных могут быть конкретные тормоза. И думаю, что надо оптимизировать самим и постоянно смотреть за производительностью.

Комментариев нет:

Отправить комментарий