|
|
|
Оптимизация запросов, используемых в процедурах
|
|||
|---|---|---|---|
|
#18+
ASA 8.0.3.5444. В процедуре есть простейший запрос такого вида: Код: plaintext 1. По полю PARENTDOCID построен индекс. Селективность поля такова, что как правило по нему отбирается всего 3-5 записей из таблицы. Кардинальность таблицы - миллионы строк. Статистика по таблице собрана. Однако в плане запроса показывает full scan. Замена @parentdocid на конкретную константу "исправляет" план на использование индекса. Вопросы: 1) Как правильнее "выдирать" запросы из процедур для анализа плана - с подстановкой конкретных значений или оставлением имен переменных? Как ASA выполняет запросы в процедурах: подставляя заместо переменных конкретные значения или "привязывая" их как параметры запроса? 2) Почему план показывает full scan? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.04.2008, 18:05 |
|
||
|
Оптимизация запросов, используемых в процедурах
|
|||
|---|---|---|---|
|
#18+
Что бросается в глаза: 1) Чужеродная "собака" в синтаксисе 2) Одинаковое название поля и переменной, возможно сервак поэтому и не использует это условие, и как следствие индекс Простейший метод выдирания запросов и их планов при отладке - это добавление комманд "set sql='bla-bla-bla'; message plan(sql) to console;". Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2008, 01:21 |
|
||
|
Оптимизация запросов, используемых в процедурах
|
|||
|---|---|---|---|
|
#18+
iLLer1) Чужеродная "собака" в синтаксисе То же самое, если написать с двоеточием - план строится, но с full scan, при попытке выполнения ругается на непривязанные параметры. Так что собака ни при чем. iLLer2) Одинаковое название поля и переменной, возможно сервак поэтому и не использует это условие, и как следствие индекс Названия разные пробовались, не в этом дело. Кстати - при условии аналогичного вида, но не по обычному индексированному полю, а по полю первичного ключа, план получается желаемый. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2008, 02:46 |
|
||
|
Оптимизация запросов, используемых в процедурах
|
|||
|---|---|---|---|
|
#18+
Меня сам принцип интересует. Что будет делать с таким запросом, встретившимся в теле процедуры, сервер? По идее он все-таки должен не подставлять значения и отправлять результат на разбор и оптимизацию. Тем более что процедуры вроде бы "компилируются" ASA в момент создания, либо при первом вызове в данном сеансе запуска сервера - и в этот момент вроде как и формируются планы выполнения запросов. Или я не прав? Короче - как правильно поступать с переменными, чтобы план соответствовал тому, что будет использоваться при выполнении процедуры? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2008, 02:50 |
|
||
|
Оптимизация запросов, используемых в процедурах
|
|||
|---|---|---|---|
|
#18+
С планами в АСА все ок. Если с константой в запросе один план, то с переменной с тем же значением будет абсолютно такой же план. В процедуре ли, с клиента ли - одна фигня. Это можно принять как аксиому, а как проверить - я писал выше. По пункту 1 есть поправка. Двоеточие в процедурах использовать не нужно, это не билдерный код. Нужно использовать просто имя переменной. Причем на двоеточие сервер не ругается, но его поведение в таком случае не совпадает с предполагаемым, возможно это и происходит в данной ситуации. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2008, 16:14 |
|
||
|
Оптимизация запросов, используемых в процедурах
|
|||
|---|---|---|---|
|
#18+
автор 1) Как правильнее "выдирать" запросы из процедур для анализа плана - с подстановкой конкретных значений или оставлением имен переменных? Как ASA выполняет запросы в процедурах: подставляя заместо переменных конкретные значения или "привязывая" их как параметры запроса? правильнее смотреть план запроса в плане всей процедуры автор 2) Почему план показывает full scan? один из вариантов переменная @parentdocid имеет не такой тип как поле PARENTDOCID другой момент - если переменная @parentdocid не является параметром процедуры и ее значение на момент компиляции не известно оптимизатор считает селективность фильтра равной 10% ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2008, 22:13 |
|
||
|
Оптимизация запросов, используемых в процедурах
|
|||
|---|---|---|---|
|
#18+
rcryoправильнее смотреть план запроса в плане всей процедуры Каким образом это сделать технически? rcryoдругой момент - если переменная @parentdocid не является параметром процедуры и ее значение на момент компиляции не известно оптимизатор считает селективность фильтра равной 10% Это доподлинно известно?... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2008, 22:23 |
|
||
|
Оптимизация запросов, используемых в процедурах
|
|||
|---|---|---|---|
|
#18+
авторКаким образом это сделать технически? Действительно я и забыл что в ASA с этим проблема, но решение есть, но для 9-ки, но пойдет и для 8-ки SQL Anywhere Studio 9 Developer's GuideThis is a useful technique for capturing information about statements that use a host variable whose values are determined at run time. Here is an example of a stored procedure containing a SELECT with a WHERE clause that refers to a procedure parameter: CREATE PROCEDURE p_test_temp ( IN @from_date TIMESTAMP ) BEGIN SELECT c.key_1, c.key_2, c.non_key_3, c.non_key_5 FROM child AS c WHERE c.non_key_5 BETWEEN @from_date AND '1992-01-01 12:59:59' ORDER BY c.non_key_5; END; Here are the step-by-step instructions for adding an UNLOAD SELECT GRAPHICAL_PLAN statement to a procedure: 1. Copy and paste the SELECT so that it appears twice, and modify the second copy as follows. 2. Surround the SELECT with single quotes and double any embedded quotes to make a valid string literal containing the SELECT. 3. If there are any host variables, break up the string literal and use a call to the STRING function to insert the actual host variable values into the string at run time. This may require the addition of more doubled single quotes to surround the host variable values; e.g., quotes around timestamp literals. 4. Wrap the SELECT with the rest of the keywords: the GRAPHICAL_PLAN call and its parameters, the UNLOAD SELECT keywords, the TO file specification, and the ESCAPES OFF and QUOTES OFF options. Following is what the above procedure looks like after the UNLOAD SELECT GRAPHICAL_PLAN has been added. At run time, the SELECT statement is computed as a string value and passed to GRAPHICAL_PLAN, which then returns a string containing the execution plan in XML format, and that string is written to the file c:\temp\plan_for_embedded_select.xml. CREATE PROCEDURE p_test_temp ( IN @from_date TIMESTAMP ) BEGIN 420 Chapter 10: Tuning SELECT c.key_1, c.key_2, c.non_key_3, c.non_key_5 FROM child AS c WHERE c.non_key_5 BETWEEN @from_date AND '1992-01-01 12:59:59' ORDER BY c.non_key_5; UNLOAD SELECT GRAPHICAL_PLAN ( STRING ( 'SELECT c.key_1, c.key_2, c.non_key_3, c.non_key_5 FROM child AS c WHERE c.non_key_5 BETWEEN ''', @from_date, ''' AND ''1992-01-01 12:59:59'' ORDER BY c.non_key_5;' ), 2, 'asensitive', 'READ-ONLY' ) TO 'c:\\temp\\plan_for_embedded_select.xml' ESCAPES OFF QUOTES OFF; END; After the procedure is executed the resulting file plan_for_embedded_select.xml may be viewed in ISQL by selecting the File > Open menu option and setting Files of type to XML (*.XML). Еще один способ(1) Enable optimization logging by setting the connection option OPTIMIZATION_LOGGING to ON (2) Ensure that the connection option LOG_DETAILED_PLANS is set to ON (3) Ensure that the connection option LOG_MAX_REQUESTS is set to a value of at least 50 (default), and probably no higher than 100 (4) Run a statement that invokes the procedure containing the query; do so several times (at least 20) (5) stop optimization logging by setting the connection option OPTIMIZATION_LOGGING to OFF (6) Browse the contents of the system table SYS.SYSOPTREQUEST. There will be one row in this table for each statement optimized by the engine. In the plan_xml column is the graphical plan (in XML format) of the chosen execution strategy for each statement. (7) Export the graphical plans from the SYSOPTREQUEST table into files, which you can then look at using DBISQL by using FILE->OPEN, and verify that the plans are the expected ones. (8) Delete the optimization logging data when you're done by issuing the DROP OPTIMIZATION LOGGING statement from DBISQL. авторЭто доподлинно известно? недоподлинно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2008, 17:50 |
|
||
|
Оптимизация запросов, используемых в процедурах
|
|||
|---|---|---|---|
|
#18+
rcryoнедоподлинно Кстати, я пробовал эксплицитно указать селективность условия отбора - результат был нулевой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2008, 20:50 |
|
||
|
Оптимизация запросов, используемых в процедурах
|
|||
|---|---|---|---|
|
#18+
За выдержку спасибо, почитаю на досуге. А как топик называется? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2008, 20:53 |
|
||
|
Оптимизация запросов, используемых в процедурах
|
|||
|---|---|---|---|
|
#18+
первое - это из книжки Breck Carter SQL Anywhere Studio 9 Developer's Guide страница 421 второе - из новостной группы, ссылку я не найду. А цифра 10% - такую селективность выбирает Sybase ASE и MS SQL насчет фул скана мне кажется оптимизатор предпочел его вместо скана индекса из-за того что кроме поля индекса в условии WHERE есть поля за которыми ему все равно придется лезть в таблицу за значениями и он считает что придется это делать для десятой части таблицы или около того, что довольно дорого. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2008, 22:16 |
|
||
|
Оптимизация запросов, используемых в процедурах
|
|||
|---|---|---|---|
|
#18+
rcryoвторое - из новостной группы, ссылку я не найду. Официально недокументированная фича :) http://groups.google.com/group/sybase.public.sqlanywhere.general/search?q=optimization_logging&start=0&scoring=d& ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2008, 00:23 |
|
||
|
Оптимизация запросов, используемых в процедурах
|
|||
|---|---|---|---|
|
#18+
rcryoвторое - из новостной группы, ссылку я не найду. А цифра 10% - такую селективность выбирает Sybase ASE и MS SQL Я не совсем понимаю подход разработчиков - брать селективность "с потолка". Интересно, почему оценка селективности не учитывает какую-либо числовую оценку "разнообразия" значений в столбце... rcryoнасчет фул скана мне кажется оптимизатор предпочел его вместо скана индекса из-за того что кроме поля индекса в условии WHERE есть поля за которыми ему все равно придется лезть в таблицу за значениями и он считает что придется это делать для десятой части таблицы или около того, что довольно дорого. Да нет, не получается так. Я проверял разные варианты. В варианте с условием только по индексированному (индекс неуникальный) полю вида FIELD=@var - получил full scan. В варианте, как в начальном примере, но в случае построения индекса по DOCUMENTSTATUS - идет скан по индексу по DOCUMENTSTATUS (и это при том, что его селективность - минимум 20%, т.к. там всего 5 возможных значений). И только в варианте с уловием по первичному ключу - используется индекс по этому полю. Не проверял - но полагаю, индекс также использовался бы и при отборе по полю уникального индекса. Всем спасибо за обсуждение, хотя до конца я данный феномен так и не понял. Применять на практике советы Картера получится, наверное, только в конце недели, там и посмотрим, что да как. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2008, 00:50 |
|
||
|
Оптимизация запросов, используемых в процедурах
|
|||
|---|---|---|---|
|
#18+
А по поводу двоеточия комментарий можно услышать? А то я так и не понял, случайно его упомянул автор, или действительно его так использует. Плюс имя переменной совпадающее с полем в таблице. Пробовал ли автор такой вариант, при котором предыдущие утверждения становились бы ложью? Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2008, 08:56 |
|
||
|
Оптимизация запросов, используемых в процедурах
|
|||
|---|---|---|---|
|
#18+
iLLerА по поводу двоеточия комментарий можно услышать? А то я так и не понял, случайно его упомянул автор, или действительно его так использует. А какой дополнительный комментарий тут может быть? В процедуре естественно нет никаких двоеточий. А вообще, двоеточие - это наиболее типовой способ указания параметров при выполнении запросов из клиентского кода. iLLerПлюс имя переменной совпадающее с полем в таблице. Непринципиально. Разные имена были. Собаки в именах переменных, насколько я помню, и в Watcom'е не запрещены. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2008, 09:24 |
|
||
|
|

start [/forum/topic.php?fid=55&msg=35272539&tid=2011608]: |
0ms |
get settings: |
5ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
156ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
52ms |
get tp. blocked users: |
1ms |
| others: | 206ms |
| total: | 455ms |

| 0 / 0 |
