powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / План исполнения запроса в ASA9
6 сообщений из 6, страница 1 из 1
План исполнения запроса в ASA9
    #32374020
Akni
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день всем.

Тестирую сейчас приложение на предмет перехода с ASA6 на ASA9.

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

TblOrder
Код: plaintext
1.
2.
3.
4.
IdOrder	       INT
IdStandort      INT
IdValuta	       INT
OrderNr	       VARCHAR( 20 )
…

TblOrderDetails
Код: plaintext
1.
2.
3.
4.
5.
6.
IdOrderDetails	INT
IdxOrder		INT
IdStandort	INT
IdxValuta		INT
DetailNr		INT
StatusNr		INT
…

TblStandort
Код: plaintext
1.
IdStandort 	INT
…
PrimaryKey в tblOrder: (idOrder, idStandort, idValuta)
PrimaryKey в tblOrderDetails: (idOrderDetails, idStandort)
PrimaryKey в tblStandort (idStandort)

В tblOrderDetails имеется FK на таблицу tblOrder: (idxOrder, idStandort, idxValuta)
В tblOrder имеется FK на таблицу tblStandort: (idStandort)
Кроме того, в tblOrder есть индекс IXOrderNr по полю OrderNr и индекс IXStatusNr по полю StausNr.
В каждой таблице есть еще другие индексы и FK.

Приблизетельное кол-во записей в таблицах: TblStandort – ок. 10 записей;
TblOrder – ок. 100 тыс. записей
TblOrderDetails – ок. 500 тыс. записей


База из версии ASA 6.04 была конвертирована в версию ASA 9 без каких-либо изменений в структуре вышеописанных таблиц.

Для запроса
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
select o.orderNr, od.detailNr 
from tblOrder o join tblOrderDetail od
on od.idxOrder=o.idOrder
and od.idStandort=o.idStandort
and od.idxValuta=o.idxValuta
where od.StatusNr= 0 
and od.idStandort= 1 
order by o.OrderNr 

выдаются след. планы исполнения:
ASA 6.04 -> O(ixOrderNr), OD(FKOrder)

ASA 9 -> Work [ Sort [O(seq) JH* OD(Seq) ]]

Вопрос: почему более высокая и, как хотелось бы надеяться, более «умная» версия выбирает явно худший план запроса, делая Full Table Scan и абсолютно игнорируя индексы?
...
Рейтинг: 0 / 0
План исполнения запроса в ASA9
    #32374163
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А селективность какая запроса, т.е. какое кол-во записей от общего числа в таблицах он возвращает ? Если высокая, то предлагаемый в ASA9 план получается эффективнее, зачем сначала сканить индексы, а потом значения с таблиц считывать.

Так же запустите ради интереса Consultant Index, что он скажет. Плюс посмотрите в графическом плане запроса расшифровку JH (Join Hash). Вполне возможно, что он делает внутренний Join по индексам таблицы tblOrderDetail.

Выбор использования временных таблиц "Work Table" зависит еще от выделенного размера кэша сервера, предполагаемого обьема обрабатываемых записей (в данном случае для ORDER BY) и значения опции MAX_WORK_TABLE_HASH_SIZE, указывающей, когда начинать их использовать.

Так же можно поиграться с калибровкой БД по скорости винта (ALTER SERVER CALIBRATE). Ну и рекомендую посмотреть в сторону кластерных индексов, например явно не помешает сделать кластерным FK-индекс таблицы TblOrderDetails (который на таблицу TblOrder).

P.S. А вообще план в ASA9 - понятие абсолютно динамическое и для разных ситуаций, обьема и содержания информации для одних и тех же запросов он будет разным. Хотя направлять его неявным образом в нужную сторону можно индексами и способами соединения таблиц в запросах (например на больших обьемах inner join и any будут вести себя скорее всего по разному).
...
Рейтинг: 0 / 0
План исполнения запроса в ASA9
    #32374389
Akni
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте, ASCRUS, спасибо за ответ.

Селективность в привед. примере не очень высокая - исходя из моего знания структуры данных, такой запрос может вернуть максимум 15% записей.
Попробовала тот же запрос с низкой селективностью (взяв другое значение od.idStandort), селективность где-то 0,5-2% макс. Запустила на выполнение - план такой же.

Offtop : да, кстати - высокая селективность - это разве когда большой процент от общего числа записей возвращается? Мне почему-то казалось, что наоборот - чем меньший процент от общего числа записей, тем больше селективность.

Перестроила запрос след. образом:
select o.orderNr, od.detailNr
from tblOrder o join tblOrderDetail od
on od.idxOrder=o.idOrder
and od.idStandort=o.idStandort
and od.idxValuta=o.idxValuta
where od.StatusNr=0
and o.idStandort=5
order by o.OrderNr

Возвращаемые результаты те же самые, т.к. значение idStandort в связанных записях из обеих таблиц одинаковые, зато план теперь выглядит так:
OD(ixStatusNr), O(ixOrderNr),...

Выполнила этот же запрос с большой селективностью - план такой же (с использованием индексов).

Выборка данных осуществл. значительно быстрее, чем при Table Scan, причем в обоих случаях - и с большой, и с низкой селективностью.

А теперь самое интересное: выполнила еще раз первоначальный запрос, точно такой же, как описано в первом посте.

И теперь для выполнения этого запроса ASA9 использовал такие же индексы и такой же план, как и для измененного запроса!


авторА вообще план в ASA9 - понятие абсолютно динамическое и для разных ситуаций, обьема и содержания информации для одних и тех же запросов он будет разным
Каким же образом в таком случае можно протестировать эффективность запросов для довольно таки большого приложения в базе данных с часто изменяющимся объемом информации?
...
Рейтинг: 0 / 0
План исполнения запроса в ASA9
    #32374547
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторКаким же образом в таком случае можно протестировать эффективность запросов для довольно таки большого приложения в базе данных с часто изменяющимся объемом информации?
Для ASA при составлении запросов, чтобы быть уверенным в нормальных планах запросов вне зависимости от обьемов и содержания данных я бы порекомендовал соблюдать несколько простых правил:
1. Правильная проектировка БД - соблюдение нормализации, тщательное продумывание связей таблиц и ключей. Например у Вас может быть оказалось бы эффективнее сделать в таблице TblOrder новое поле-автоинкремент ID и сделать его как Primary Key, существующие же поля в Primary Key описать как CONSTRAINT UNIQUE. А таблицу TblOrderDetails соединять по этому полю, убрав с нее существующие поля соединения.
2. Правильная связь таблиц в запросах. Основной Table Scan с уходом на Hash Join частенько как раз по этой причине. ASA9 достаточно эффективно разгребает и анализирует связи, даже может убирать из плана указанные в запросах таблицы, но реально не востребованные, если они служат только для связи между другими таблицами и есть возможность все связать и без лишней таблицы. Однако в случае множественных связей таблицы к таблицам, особенно с использованием фильтров по полям, не участвующих в внешних ключах оптимизатор может замяться и выбрать Table Scan или не самый подходящий индекс. Можно сказать чем легче и понятнее читается запрос, тем больше гарантий, что всегда будет самый эффективный план. Если запрос действительно сложный, то лучше всего в таких случаях не забывать об использовании временных таблиц.

Ну и я еще бы посоветовал начинать оптимизировать запросы не в момент их написания, а в тот момент, когда они начали тормозить. Смысла делать сразу индексы на таблицы, которые вроде бы должны помочь, то же нет. Очень много шансов, что кроме места в БД и тормозов при обновлении данных, они ничего больше не принесут. Оптимизировать лучше на реальных БД, при условии, что идут реальные тормоза. Тут как раз и пригодиться профайлер, который покажет, где и что тормозит. А дальше уже запрос в ISQL и работа с планом запросов. У меня где то на практике: 90% от медленных запросов - это Table Scan и Hash Join из за сложных связей таблиц и вьюверов в запросе, и только 10% - от отсутствия нужного индекса.

Реально могу сказать, что оптимизатор достаточно эффективен, я на нем гонял запросы, обращающиеся к таблицам с десятками миллионов записей под различными углами (фильтры, группировки, вложенные запросы и т.д.) и в принципе каждый раз соглашался с планом, предложенным ASA.

По поводу оптимизации можно еще почитать BOL, но лучше всего поэксперементировать - немного поупражнявшись с запросами и посмотрев, от чего и как получается план запросов, можно писать довольно предсказуемые по плану и эффективные запросы.

P.S. Селективность - это выборочность. То есть процент выборки записей от их общего количества. Чем выше селективность, тем значит больше записей будут обработаны.
...
Рейтинг: 0 / 0
План исполнения запроса в ASA9
    #32374619
Akni
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за советы.
Что касается связи таблиц, абсолютно с вами согласна, но база мне досталась "в наследство", проколов в проектировании там предостаточно, и изменять все сразу не представляется возможным.

Еще раз по поводу селективности:
как тогда понимать след. фразу из BOL:
автор...Accurate selectivity estimates are critical for the proper operation of the query optimizer. For example, if the optimizer mistakenly estimates a predicate to be highly selective (with, say, a selectivity of 5%), but the actual selectivity is much lower (for example, 50%), then performance may suffer...

Насколько я понимаю, здесь предикат с выборочностью 5% называется высокоселективным, а предикат с селективн. 50% - низкоселективным.

Или мой English меня подводит?
...
Рейтинг: 0 / 0
План исполнения запроса в ASA9
    #32374658
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гм. Судя по всему не подводит. Я как всегда напутал названия терминов - имел ввиду избирательность, назвал селективностью :)
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / План исполнения запроса в ASA9
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]