powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Оптимизация запросов, используемых в процедурах
15 сообщений из 15, страница 1 из 1
Оптимизация запросов, используемых в процедурах
    #35266377
Фотография A.K.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ASA 8.0.3.5444. В процедуре есть простейший запрос такого вида:
Код: plaintext
1.
select * from DOCUMENTS where PARENTDOCID=@parentdocid and DOCUMENTTYPE= 135  and DOCUMENTSTATUS= 3 

По полю PARENTDOCID построен индекс. Селективность поля такова, что как правило по нему отбирается всего 3-5 записей из таблицы. Кардинальность таблицы - миллионы строк. Статистика по таблице собрана.

Однако в плане запроса показывает full scan.

Замена @parentdocid на конкретную константу "исправляет" план на использование индекса.

Вопросы:
1) Как правильнее "выдирать" запросы из процедур для анализа плана - с подстановкой конкретных значений или оставлением имен переменных? Как ASA выполняет запросы в процедурах: подставляя заместо переменных конкретные значения или "привязывая" их как параметры запроса?
2) Почему план показывает full scan?
...
Рейтинг: 0 / 0
Оптимизация запросов, используемых в процедурах
    #35266674
iLLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что бросается в глаза:
1) Чужеродная "собака" в синтаксисе
2) Одинаковое название поля и переменной, возможно сервак поэтому и не
использует это условие, и как следствие индекс

Простейший метод выдирания запросов и их планов при отладке - это добавление
комманд "set sql='bla-bla-bla'; message plan(sql) to console;".


Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Оптимизация запросов, используемых в процедурах
    #35266693
Фотография A.K.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iLLer1) Чужеродная "собака" в синтаксисе
То же самое, если написать с двоеточием - план строится, но с full scan, при попытке выполнения ругается на непривязанные параметры. Так что собака ни при чем.
iLLer2) Одинаковое название поля и переменной, возможно сервак поэтому и не
использует это условие, и как следствие индекс
Названия разные пробовались, не в этом дело.
Кстати - при условии аналогичного вида, но не по обычному индексированному полю, а по полю первичного ключа, план получается желаемый.
...
Рейтинг: 0 / 0
Оптимизация запросов, используемых в процедурах
    #35266696
Фотография A.K.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Меня сам принцип интересует. Что будет делать с таким запросом, встретившимся в теле процедуры, сервер? По идее он все-таки должен не подставлять значения и отправлять результат на разбор и оптимизацию. Тем более что процедуры вроде бы "компилируются" ASA в момент создания, либо при первом вызове в данном сеансе запуска сервера - и в этот момент вроде как и формируются планы выполнения запросов. Или я не прав?

Короче - как правильно поступать с переменными, чтобы план соответствовал тому, что будет использоваться при выполнении процедуры?
...
Рейтинг: 0 / 0
Оптимизация запросов, используемых в процедурах
    #35267039
iLLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С планами в АСА все ок. Если с константой в запросе один план, то с
переменной с тем же значением будет абсолютно такой же план. В процедуре ли,
с клиента ли - одна фигня. Это можно принять как аксиому, а как проверить -
я писал выше.

По пункту 1 есть поправка. Двоеточие в процедурах использовать не нужно, это
не билдерный код. Нужно использовать просто имя переменной. Причем на
двоеточие сервер не ругается, но его поведение в таком случае не совпадает с
предполагаемым, возможно это и происходит в данной ситуации.


Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Оптимизация запросов, используемых в процедурах
    #35269847
rcryo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор
1) Как правильнее "выдирать" запросы из процедур для анализа плана - с подстановкой конкретных значений или оставлением имен переменных? Как ASA выполняет запросы в процедурах: подставляя заместо переменных конкретные значения или "привязывая" их как параметры запроса?

правильнее смотреть план запроса в плане всей процедуры
автор
2) Почему план показывает full scan?

один из вариантов переменная @parentdocid имеет не такой тип как поле PARENTDOCID

другой момент - если переменная @parentdocid не является параметром процедуры и ее значение на момент компиляции не известно оптимизатор считает селективность фильтра равной 10%
...
Рейтинг: 0 / 0
Оптимизация запросов, используемых в процедурах
    #35269858
Фотография A.K.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rcryoправильнее смотреть план запроса в плане всей процедуры
Каким образом это сделать технически?
rcryoдругой момент - если переменная @parentdocid не является параметром процедуры и ее значение на момент компиляции не известно оптимизатор считает селективность фильтра равной 10%
Это доподлинно известно?...
...
Рейтинг: 0 / 0
Оптимизация запросов, используемых в процедурах
    #35272240
rcryo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторКаким образом это сделать технически?
Действительно я и забыл что в 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.

авторЭто доподлинно известно?
недоподлинно
...
Рейтинг: 0 / 0
Оптимизация запросов, используемых в процедурах
    #35272539
Фотография A.K.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rcryoнедоподлинно
Кстати, я пробовал эксплицитно указать селективность условия отбора - результат был нулевой.
...
Рейтинг: 0 / 0
Оптимизация запросов, используемых в процедурах
    #35272544
Фотография A.K.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
За выдержку спасибо, почитаю на досуге. А как топик называется?
...
Рейтинг: 0 / 0
Оптимизация запросов, используемых в процедурах
    #35272605
rcryo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
первое - это из книжки
Breck Carter SQL Anywhere Studio 9 Developer's Guide страница 421
второе - из новостной группы, ссылку я не найду.
А цифра 10% - такую селективность выбирает Sybase ASE и MS SQL

насчет фул скана мне кажется оптимизатор предпочел его вместо скана индекса из-за того что кроме поля индекса в условии WHERE есть поля за которыми ему все равно придется лезть в таблицу за значениями и он считает что придется это делать для десятой части таблицы или около того, что довольно дорого.
...
Рейтинг: 0 / 0
Оптимизация запросов, используемых в процедурах
    #35272701
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rcryoвторое - из новостной группы, ссылку я не найду. Официально недокументированная фича :)
http://groups.google.com/group/sybase.public.sqlanywhere.general/search?q=optimization_logging&start=0&scoring=d&
...
Рейтинг: 0 / 0
Оптимизация запросов, используемых в процедурах
    #35272725
Фотография A.K.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rcryoвторое - из новостной группы, ссылку я не найду.
А цифра 10% - такую селективность выбирает Sybase ASE и MS SQL
Я не совсем понимаю подход разработчиков - брать селективность "с потолка". Интересно, почему оценка селективности не учитывает какую-либо числовую оценку "разнообразия" значений в столбце...

rcryoнасчет фул скана мне кажется оптимизатор предпочел его вместо скана индекса из-за того что кроме поля индекса в условии WHERE есть поля за которыми ему все равно придется лезть в таблицу за значениями и он считает что придется это делать для десятой части таблицы или около того, что довольно дорого.
Да нет, не получается так.
Я проверял разные варианты. В варианте с условием только по индексированному (индекс неуникальный) полю вида FIELD=@var - получил full scan. В варианте, как в начальном примере, но в случае построения индекса по DOCUMENTSTATUS - идет скан по индексу по DOCUMENTSTATUS (и это при том, что его селективность - минимум 20%, т.к. там всего 5 возможных значений). И только в варианте с уловием по первичному ключу - используется индекс по этому полю. Не проверял - но полагаю, индекс также использовался бы и при отборе по полю уникального индекса.

Всем спасибо за обсуждение, хотя до конца я данный феномен так и не понял. Применять на практике советы Картера получится, наверное, только в конце недели, там и посмотрим, что да как.
...
Рейтинг: 0 / 0
Оптимизация запросов, используемых в процедурах
    #35272952
iLLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А по поводу двоеточия комментарий можно услышать? А то я так и не понял,
случайно его упомянул автор, или действительно его так использует. Плюс имя
переменной совпадающее с полем в таблице. Пробовал ли автор такой вариант,
при котором предыдущие утверждения становились бы ложью?


Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Оптимизация запросов, используемых в процедурах
    #35273001
Фотография A.K.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iLLerА по поводу двоеточия комментарий можно услышать? А то я так и не понял,
случайно его упомянул автор, или действительно его так использует. А какой дополнительный комментарий тут может быть? В процедуре естественно нет никаких двоеточий. А вообще, двоеточие - это наиболее типовой способ указания параметров при выполнении запросов из клиентского кода.
iLLerПлюс имя переменной совпадающее с полем в таблице. Непринципиально. Разные имена были. Собаки в именах переменных, насколько я помню, и в Watcom'е не запрещены.
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Оптимизация запросов, используемых в процедурах
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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