Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Константы vs связываемые переменные
|
|||
|---|---|---|---|
|
#18+
Собственно, по сабжу интересует следующий вопрос. Понятно, что если многократно выполняется один и тот же DML оператор, но с разными значениями связываемых переменных, то будет оптимальным единожды сделать ему PREPARE, а затем многократно выполнять, изменяя связываемую переменную. Это справедливо в общем-то для любой СУБД. А как будут обстоять дела с производительностью у ASA 8.0.3, если заранее не prepare'ить запросы с параметрами? Имеет ли смысл в таком случае использовать связываемые переменные, или будет эффективнее вообще отказаться от них и выполнять вместо этого однотипные операторы с уже подставлеными значениями-константами? Говоря иначе: Есть ли у ASA что-то вроде курсорного кэша, в котором хранятся результаты последних разобранных операторов, или в описанном случае запрос будет каждый раз проходить полную последовательность действий по синтаксическому разбору, оптимизации, подстановке параметров и выполнению? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.11.2006, 14:51 |
|
||
|
Константы vs связываемые переменные
|
|||
|---|---|---|---|
|
#18+
Поздравляю всех с окончанием старых и новых праздников! Перефразирую свой вопрос так. Предполагается, что клиентская программа будет динамически генерить запросы к БД, часть из которых будут получаться однотипными и отличаться только значениями параметров. В чем плюсы и минусы с точки зрения производительности следующих подходов: 1) запросы генерятся с уже подставленными непосредственно в текст запроса значениями параметров 2) запросы генерятся со связываемыми переменными. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2006, 10:37 |
|
||
|
Константы vs связываемые переменные
|
|||
|---|---|---|---|
|
#18+
Я не уверен до конца, т.к. очень зависит от реализации оптимизатора от версии к версии и от типа СУБД (ASA, ASE, MSSQL ...). Но где-то было, что при прямом указании константного значения оптимизатор использует указанное значение для оценки статистики и исходя из этого выбирает оптимальный план. А при использовании переменных, в какой-то из СУБД оптимизатор не мог использовать значение переменной для оценки статистики и брал некое значение по умолчанию, что могло привести к неоптимальному плану выполнения запроса. Я бы на вашем месте провел эксперимент: сделал таблицу с двумя колонками и неравномерным распределением значений по колонкам. Построил бы два отдельных индекса по этим полям. Построил статистику таблицы. А потом поганял запрос типа select * from table where col1= or col2= В зависимости от значений оптимизатор по-хорошему должен бы выбирать один из двух индексов в зависимости от значений col1, col2 либо сканирование если объем выбираемых данных окажется велик. А потом проверить все тоже самое, но с использованием значений в переменных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2006, 14:25 |
|
||
|
Константы vs связываемые переменные
|
|||
|---|---|---|---|
|
#18+
Ggg_oldЯ не уверен до конца, т.к. очень зависит от реализации оптимизатора от версии к версии и от типа СУБД (ASA, ASE, MSSQL ...). Спасибо за ответ, но вопрос касается конкретной СУБД - ASA 8.0.3 (не хотелось писать специальные тесты, т.к. думал, что создатели серьезных систем, критичных к производительности и имеющих большое количество одновременных коннектов к БД, этот вопрос уже выясняли). Общая теория здесь и так понятна, причем разными возможностями использования статистики далеко не ограничивается. Например, в Oracle 8.1.х (да простят меня форумчане за регулярные сравнения именно с этой СУБД) и выше плюсов использования параметров обычно гораздо больше, т.к. механизм кэширования запросов сервером позволяет СУБД не выполнять повторно полный разбор оператора, а выбрать готовый результат из кэша. Если же формировать запросы с константами, то они мало того что будут проходить все этапы разбора, так еще и будут "выталкивать" из кэша другие часто выполняемые запросы, снижая производителность в параллельно выполняемых сеансах. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2006, 15:01 |
|
||
|
Константы vs связываемые переменные
|
|||
|---|---|---|---|
|
#18+
Тогда задайте вопрос на родной форум сайбеза (через ньюс сервер например). Там как-раз разработчики тусуются. Но я думаю что сделать эксперимент будет быстрее. В доке на ASA 9.02 в разделе cache\acsess plans написано следущее (привожу целиком): Normally, the optimizer selects an access plan for a query every time the query is executed. Optimizing at execution time allows the optimizer to choose a plan based on current system state, as well as the values of current selectivity estimates and estimates based on the values of host variables. For queries that are executed very frequently, the cost of query optimization can outweigh the benefits of optimizing at execution time. For queries and INSERT, UPDATE and DELETE statements performed inside stored procedures , stored functions, and triggers, the optimizer caches execution plans between executions of the query. After a statement in a stored procedure, stored function, or trigger has been executed several times by one connection, the optimizer builds a reusable plan for the statement. A reusable plan does not use the values of host variables for selectivity estimation or rewrite optimizations . The reusable plan may have a higher cost because of this. If the cost of the reusable plan is close to the best observed cost for the statement, the optimizer will choose to add the reusable plan to a plan cache. Otherwise, the benefit of optimizing on each execution outweighs the savings from avoiding optimization, and the execution plan is not cached. The plan cache is a per-connection cache of the data structures used to execute an access plan. Reusing the cached plan involves looking up the plan in the cache and resetting it to an initial state. This is typically substantially faster than optimizing the statement. Cached plans may be stored to disk if they are used infrequently, and they do not increase the cache usage. The optimizer periodically re-optimizes queries to verify that the cached plan is still relatively efficient. You can use the database or connection property QueryCachePages to determine the number of pages used to cache execution plans. These pages occupy space in the temporary file, but are not necessarily resident in memory. You can use QueryCachedPlans statistic to show how many query execution plans are currently cached. This property can be retrieved using CONNECTION_PROPERTY to show how many query execution plans are cached for a given connection, or DB_PROPERTY can be used to count the number of cached execution plans across all connections. This property can be used in combination with QueryCachePages, QueryOptimized, QueryBypassed, and QueryReused to help determine the best setting for the MAX_PLANS_CACHED option The maximum number of plans to cache is specified with the option setting MAX_PLANS_CACHED. The default is 20. To disable plan caching, set this option to 0. Так чтто в АСА есть стоимостной оптимизатор и кэш запросов и другие фишки "взрослых" СУБД. Только никто не забивает мозг разработчика тюнингом этих параметров, т.к. БД по умолчанию сама тюнит все достаточно неплохо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2006, 15:16 |
|
||
|
|

start [/forum/topic.php?fid=55&msg=34112691&tid=2012442]: |
0ms |
get settings: |
9ms |
get forum list: |
8ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
31ms |
get topic data: |
6ms |
get forum data: |
2ms |
get page messages: |
25ms |
get tp. blocked users: |
1ms |
| others: | 250ms |
| total: | 336ms |

| 0 / 0 |
