Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
ASE 12.5 передача параметров отдельно от запроса
|
|||
|---|---|---|---|
|
#18+
Привет всем! Как стали разбираться почему медленно идёт сохранение документов оказалось что СУБД делает сканнирование всей таблицы даже когда получает даже как условие точное значения ПК. Только запрос в таком случае формируется и передаётся в виде "Update DocumentItem Set PunktDocument = ? Where ID_DocumentItem = ?" и тдельно параметры в MonSysSqlText текст видно как Update DocumentItem Set PunktDocument = @0001 Where ID_DocumentItem = @0002 если пишу прямо Update DocumentItem Set PunktDocument = 5 Where ID_DocumentItem = 988457 то ПК использует Мне известно что сканикрование таблицы происходит при передаче параметра с несоотвествующим типом может с этим как-то связано? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2006, 12:12 |
|
||
|
ASE 12.5 передача параметров отдельно от запроса
|
|||
|---|---|---|---|
|
#18+
Я не понял, в чем разница в двух выполняемых запросах. Если очень нужен индекс, и он всегда будет полезен, его можно записать в запрос и с помощью хинта. В любом случае нужно посмотреть на точный текст запросов , если они в процедуре или триггере - на весь текст процедуры или триггера. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2006, 19:54 |
|
||
|
ASE 12.5 передача параметров отдельно от запроса
|
|||
|---|---|---|---|
|
#18+
"...........Я не понял, в чем разница в двух выполняемых запросах......." Разницы в них в действительности нет, а есть разница в только способе его передачи. ".....В любом случае нужно посмотреть на точный текст запросов , если они в процедуре или триггере - на весь текст процедуры или триггера............" 'Update DocumentItem Set PunktDocument = ? Where ID_DocumentItem = ?' единственный простейший запрос который передаётся отдельно программой правда в транзакции вместе с другими разными и такими же. Извиняюсь за то что толком не объяснил в начале. Как мне обяснили сотрудники они текст запроса могут передавать отдельно от параметров тоесть они где-то у себя пишут (дословно) 'Update DocumentItem Set PunktDocument = ? Where ID_DocumentItem = ?', и отдельно передают значения параметров и типы (.Net имеет поддерживает такую возможность и так им немоного легче т.к. небеспокоятся например о преобразовании в текст дат и т.п.) ,очевидно также информация (по-отдельности) передаётся через ODBC на сервер. Больше объяснить не могу т.к. сам не пишу програм и рассказываю то что мне рассказали . Потом как мы заметили что план запроса нетот, сделали так, что именно в условии where для ПК не стоит '?' а конкретное значение и теперь работает нормально. Хотя известно покрайней мере что когда-то старый вариант тоже нормально работал (потому что когда-то в этом же месте теже были проблемы с планом . Тогда я сделал то-ли update index statistics толи reorg rebuild и оно стало нормально опять работать, теперь же это не помогло и сделали то что и я сказал). Почему поламалось не знаем единственное что делал за последние дни это действительно добавил достаточно много индексов в базу (но не для этой таблицы!). Дополню, что как минимум таких таблиц сразу заметили 6. Их могло быть и в 8 раз больше но разбираться мы не стали и сразу поменяли всё. Теперь просто мне интересна причина. Очевидно есть разница в том как смотрит сервер на запрос в этих двух случаях и я думал может кто-то сможет подсказать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2006, 13:49 |
|
||
|
ASE 12.5 передача параметров отдельно от запроса
|
|||
|---|---|---|---|
|
#18+
Если интересно, в чем причина - могу сказать. Причина в том, что оптимизаторо по-разному оптимизирует запрос в двух этих вариантах. Когда вы явно задаете значения в запросе, он знает конкретное значение SARG -а и применяет статистику для этого значения SARG-а, она дает хорошую селективность и выбирается индекс. Скорее всего во втором случае оптимизатор не знает конкретное значение SARG-а, но этого определенно сказать нельзя, поскольку не понятно, как посылается запрос. То, о чем говорится в вашем письме, напоминает вызов запроса с параметрами через ODBC. Но там много вариантов, есть подготовленный запрос, есть неподготовленный. Подготовленные можно делать через хранимые процедуры или нет, и т.д. Короче нужно точно знать как выполняется запрос и как ведет себя драйвер. Видимо там .Net адаптер какой-то. Можно предположить что во втором случае оптимизатор, не зная конкретного значения SARG-а, применяет статистику для неизвестного значения, а не из гистограммы. Оно как правило не очень высокой селективности, типа 25%, поэтому считается неэффективной и индекс не выбирается для использования. Вот что-то типа того должно происходить. Способов борьбы много, идея в том, что нужно заставить использовать индекс. Можно задать хинт в запросе , можно изменить дефолтные селективности в таблице с помощью optdiag, можно сохранить Abstract query plan, и еще наверное можно много чего придумать. Но надо знать, как запрос вызывается с клиента. Можно посмотреть в мониторы , какой в итоге запрос получается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2006, 11:36 |
|
||
|
ASE 12.5 передача параметров отдельно от запроса
|
|||
|---|---|---|---|
|
#18+
А, есть же запрос из монитора. Я думаю, тут гадит .net адапрор. ОН, видимо, биндит параметры таким способом: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. В этом случае действительно все происходит, как я описал, поскольку значение переменной @0002 не определено еще на момент оптимизации запроса. Так что надо наверное немного покопать на предмет того, как этот .net адаптер выполняет этот запрос. Хотя можно прописать просто хинт на индекс и не париться. Но если таких запросов много, придется прописывать в каждый. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2006, 11:41 |
|
||
|
|

start [/forum/topic.php?fid=55&msg=34047233&tid=2012508]: |
0ms |
get settings: |
7ms |
get forum list: |
15ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
52ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
56ms |
get tp. blocked users: |
1ms |
| others: | 223ms |
| total: | 372ms |

| 0 / 0 |
