|
|
|
NAV, SQL 2000 и оптимизатор запросов
|
|||
|---|---|---|---|
|
#18+
Всем - здравствовать! Очень непонятная проблема съедает мозг. Есть NAV (бывш. Navision, вдруг если кто не знает это ERP такая). База живёт на SQL 2000, огромная - терабайт. Есть некая таблица (339, для тех кто NAV знает). В таблице в NAV есть ключ "Примен.-к Операции Но.,Примен.-из Операции Но.". Галка "maintain SQL index" установлена, ключ в SQL присутствует, ключ не битый. По этому ключу в NAV делается выборка рекордсета: Код: plaintext 1. 2. 3. 4. В "родной" БД, и вообще на всех SQL-базах, с которыми я в жизни имел дело, такой запрос выполняется моментально, ибо фильтры кладутся по ключу. В этой базе, выполнение выборки занимает МИНУТУ. Стал искать, в чём дело. Выполнил код под монитором клиента (для не-навиженологов, это такая штука, в которой можно посмотреть на кишки выполняющегося процесса, своего рода дебаггер). Увидел следующее (очень извиняюсь за нечитабельный вид): Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. Говоря по-русски, получается следующее: из NAV в SQL передаётся совершенно правильный, нормальный запрос: Код: plaintext Но при этом в SQL почему-то выборка выполняется по уродскому ключу Примен.-из Операции Но.,Операция Но., что естественно приводит к фильтрации по неключевому полю с 54-секундным выполнением. Самое интересное, что если этот же запрос выполнить непосредственно в SQL, результаты возвращаются моментально. Подозреваем, что косячит оптимизатор запросов, но точно определить не можем, и обойти тоже не знаем как. Мы в полном ступоре. Помогите понять, в чём дело? Если вдруг будет нужно - можно мне звонить (903)5672441 для оперативности, приму любую помощь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2010, 15:57 |
|
||
|
NAV, SQL 2000 и оптимизатор запросов
|
|||
|---|---|---|---|
|
#18+
Самое интересное, что если этот же запрос выполнить непосредственно в SQL, результаты возвращаются моментально. Хм.. А тут почему оптимизатор не косячит? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2010, 16:10 |
|
||
|
NAV, SQL 2000 и оптимизатор запросов
|
|||
|---|---|---|---|
|
#18+
А вообще запросы к SQL-серверу надо профайлером смотреть. Это будет запрос, который получает сервер. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2010, 16:13 |
|
||
|
NAV, SQL 2000 и оптимизатор запросов
|
|||
|---|---|---|---|
|
#18+
petsaСамое интересное, что если этот же запрос выполнить непосредственно в SQL, результаты возвращаются моментально. Хм.. А тут почему оптимизатор не косячит? Понятия не имею. Честно говоря, я SQL практически не знаю. Потому и прошу совета, у меня идей нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2010, 16:14 |
|
||
|
NAV, SQL 2000 и оптимизатор запросов
|
|||
|---|---|---|---|
|
#18+
Вы уверены , что из Navision данный select передаётся в том же виде, что и из MS SQL (кстати это можно посмотреть профайлером) Подозреваю , что в случае с Navision на сервер передаётся что то типа sp_executesql или нечто похожее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2010, 16:15 |
|
||
|
NAV, SQL 2000 и оптимизатор запросов
|
|||
|---|---|---|---|
|
#18+
anatoleech Но при этом в SQL почему-то выборка выполняется по уродскому ключу Примен.-из Операции Но.,Операция Но., что естественно приводит к фильтрации по неключевому полю с 54-секундным выполнением. Это вы про план выпроления что ли ? anatoleech Самое интересное, что если этот же запрос выполнить непосредственно в SQL, результаты возвращаются моментально. Подозреваем, что косячит оптимизатор запросов, но точно определить не можем, и обойти тоже не знаем как. Мы в полном ступоре. Помогите понять, в чём дело? Если вдруг будет нужно - можно мне звонить (903)5672441 для оперативности, приму любую помощь. На план выполнения могут оказать влияние настройки SET коннекта ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2010, 16:16 |
|
||
|
NAV, SQL 2000 и оптимизатор запросов
|
|||
|---|---|---|---|
|
#18+
_djХомяГВы уверены , что из Navision данный select передаётся в том же виде, что и из MS SQL (кстати это можно посмотреть профайлером) Подозреваю , что в случае с Navision на сервер передаётся что то типа sp_executesql или нечто похожее. Спасибо, попробуем. Но тем не менее, факт что SQL использует левый ключ вместо конкретно указанного. Почему, как бороться, в чём причины могут быть? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2010, 16:19 |
|
||
|
NAV, SQL 2000 и оптимизатор запросов
|
|||
|---|---|---|---|
|
#18+
> Но при этом в SQL почему-то выборка выполняется по уродскому ключу > Примен.-из Операции Но.,Операция Но., что естественно приводит к > фильтрации по неключевому полю с 54-секундным выполнением. гм. не объясните, почему вы считаете, что для вашего запроса должен использоваться ключ (Примен.-к Операции Но.,Примен.-из Операции Но.), а не (Примен.-из Операции Но.,Операция Но.) лично на мой взгляд выбор сервера вполне логичен. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2010, 16:20 |
|
||
|
NAV, SQL 2000 и оптимизатор запросов
|
|||
|---|---|---|---|
|
#18+
Gloryanatoleech Но при этом в SQL почему-то выборка выполняется по уродскому ключу Примен.-из Операции Но.,Операция Но., что естественно приводит к фильтрации по неключевому полю с 54-секундным выполнением. Это вы про план выпроления что ли ? Это то, что я вижу в мониторе клиента в навижене. В SQL ушёл вполне определённый запрос, а выполняется он по другому ключу. Glory anatoleech Самое интересное, что если этот же запрос выполнить непосредственно в SQL, результаты возвращаются моментально. Подозреваем, что косячит оптимизатор запросов, но точно определить не можем, и обойти тоже не знаем как. Мы в полном ступоре. Помогите понять, в чём дело? На план выполнения могут оказать влияние настройки SET коннекта Не-не-не, тут никакого коннекта не SET, это не вызов процедур, это выборка, которая производится навиженом из своей же базы данных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2010, 16:22 |
|
||
|
NAV, SQL 2000 и оптимизатор запросов
|
|||
|---|---|---|---|
|
#18+
anatoleechGloryanatoleech Но при этом в SQL почему-то выборка выполняется по уродскому ключу Примен.-из Операции Но.,Операция Но., что естественно приводит к фильтрации по неключевому полю с 54-секундным выполнением. Это вы про план выпроления что ли ? Это то, что я вижу в мониторе клиента в навижене. В SQL ушёл вполне определённый запрос, а выполняется он по другому ключу. Что такое "выполняется по ключу" в терминах MSSQL? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2010, 16:23 |
|
||
|
NAV, SQL 2000 и оптимизатор запросов
|
|||
|---|---|---|---|
|
#18+
anatoleech Не-не-не, тут никакого коннекта не SET, это не вызов процедур, это выборка, которая производится навиженом из своей же базы данных. Это как - запрос выполняется, а коннекта к серверу нет ? А как тогда без коннекта запрос вообще попадает на сервер ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2010, 16:24 |
|
||
|
NAV, SQL 2000 и оптимизатор запросов
|
|||
|---|---|---|---|
|
#18+
в профайлере конекшен сеттинги сравните. а после в квере поставьте себе сеттинги нава и повторите запрос. скорее всего и поведение запроса изменится. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2010, 16:24 |
|
||
|
NAV, SQL 2000 и оптимизатор запросов
|
|||
|---|---|---|---|
|
#18+
daw > Но при этом в SQL почему-то выборка выполняется по уродскому ключу > Примен.-из Операции Но.,Операция Но., что естественно приводит к > фильтрации по неключевому полю с 54-секундным выполнением. гм. не объясните, почему вы считаете, что для вашего запроса должен использоваться ключ (Примен.-к Операции Но.,Примен.-из Операции Но.), а не (Примен.-из Операции Но.,Операция Но.) лично на мой взгляд выбор сервера вполне логичен. Не логичен. Вот код, который выполняется в NAV: Код: plaintext 1. 2. 3. 4. 5. Вот запрос, который уходит в SQL: Код: plaintext Фильтрация по двум полям, оба поля входят в составной ключ из двух полей (не считая первичного ключа), а используется ключ из одного поля (не считая первичного ключа). Логично было бы взять конкретно указанный ключ с обоими фильтруемыми полями, а SQL предпочитает почему-то брать ключ с одним полем, что неправильно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2010, 16:26 |
|
||
|
NAV, SQL 2000 и оптимизатор запросов
|
|||
|---|---|---|---|
|
#18+
GloryanatoleechGloryanatoleech Но при этом в SQL почему-то выборка выполняется по уродскому ключу Примен.-из Операции Но.,Операция Но., что естественно приводит к фильтрации по неключевому полю с 54-секундным выполнением. Это вы про план выпроления что ли ? Это то, что я вижу в мониторе клиента в навижене. В SQL ушёл вполне определённый запрос, а выполняется он по другому ключу. Что такое "выполняется по ключу" в терминах MSSQL? мм.... не имею ни малейшего понятия, что это в индексах MSSQL :( Подозреваю, что это может называться как-то вроде "использования индекса" или "использования ключа". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2010, 16:27 |
|
||
|
NAV, SQL 2000 и оптимизатор запросов
|
|||
|---|---|---|---|
|
#18+
anatoleech Логично было бы взять конкретно указанный ключ с обоими фильтруемыми полями, а SQL предпочитает почему-то брать ключ с одним полем, что неправильно. И где вы видите, что сервер делает по-другому ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2010, 16:29 |
|
||
|
NAV, SQL 2000 и оптимизатор запросов
|
|||
|---|---|---|---|
|
#18+
anatoleech не имею ни малейшего понятия, что это в индексах MSSQL :( Подозреваю, что это может называться как-то вроде "использования индекса" или "использования ключа". И еще раз - где вы видите, _как_ MSSQL выполняет ваш запрос в обеих случаях ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2010, 16:34 |
|
||
|
NAV, SQL 2000 и оптимизатор запросов
|
|||
|---|---|---|---|
|
#18+
> Обратите внимание на ключ и на фильтры. > > Фильтрация по двум полям, оба поля входят в составной ключ из двух полей > (не считая первичного ключа), а используется ключ из одного поля (не > считая первичного ключа). > > Логично было бы взять конкретно указанный ключ с обоими фильтруемыми > полями, а SQL предпочитает почему-то брать ключ с одним полем, что > неправильно. а вы вообще представляете себе, как индексы устроены и как поиск по индексу происходит? я сильно подозреваю, что строк, для которых "Примен.-к Операции Но."<>0 гооораздо больше, чем тех, для которых "Примен.-из Операции Но."=30195 поправьте, если это не так. а если так, то эффективнее будет индекс, где "Примен.-из Операции Но." стоит первым в списке ключевых столбцов. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2010, 16:34 |
|
||
|
NAV, SQL 2000 и оптимизатор запросов
|
|||
|---|---|---|---|
|
#18+
автор Но при этом в SQL почему-то выборка выполняется по уродскому ключу Примен.-из Операции Н ААА вообще то сервак делает правильно ("Примен.-из Операции Но."=30195)является sarga'ble , а вот римен.-к Операции Но.",'<>0' - нет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2010, 16:35 |
|
||
|
NAV, SQL 2000 и оптимизатор запросов
|
|||
|---|---|---|---|
|
#18+
Gloryanatoleech Не-не-не, тут никакого коннекта не SET, это не вызов процедур, это выборка, которая производится навиженом из своей же базы данных. Это как - запрос выполняется, а коннекта к серверу нет ? А как тогда без коннекта запрос вообще попадает на сервер ? Потому что это и есть сервер навижена. Навижен шурует в своей же базе, своими же средствами, он к ней уже подключен. Вряд ли смогу внятно более объяснить - это чёрный ящик. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2010, 16:36 |
|
||
|
NAV, SQL 2000 и оптимизатор запросов
|
|||
|---|---|---|---|
|
#18+
anatoleechФильтрация по двум полям, оба поля входят в составной ключ из двух полей (не считая первичного ключа), а используется ключ из одного поля (не считая первичного ключа). Логично было бы взять конкретно указанный ключ с обоими фильтруемыми полями, а SQL предпочитает почему-то брать ключ с одним полем, что неправильно.Странно, вы же написали, что как раз сервер использует индекс с двумя полями, как и должно быть:anatoleechНо при этом в SQL почему-то выборка выполняется по уродскому ключу Примен.-из Операции Но.,Операция Но., что естественно приводит к фильтрации по неключевому полю с 54-секундным выполнением. Вам нужно освоить терминологию, профпайлер и вообще SQL Server, или привлечь соответствующего специалиста. Без этого не получится, или будет очень долго. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2010, 16:36 |
|
||
|
NAV, SQL 2000 и оптимизатор запросов
|
|||
|---|---|---|---|
|
#18+
сколько у вас (в процентах от общего количества) строк, где "Примен.-к Операции Но."<>0 и сколько таких, где "Примен.-из Операции Но."=30195 ? Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2010, 16:36 |
|
||
|
NAV, SQL 2000 и оптимизатор запросов
|
|||
|---|---|---|---|
|
#18+
Gloryanatoleech не имею ни малейшего понятия, что это в индексах MSSQL :( Подозреваю, что это может называться как-то вроде "использования индекса" или "использования ключа". И еще раз - где вы видите, _как_ MSSQL выполняет ваш запрос в обеих случаях ? В мониторе клиента. Это собственное средство NAV. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2010, 16:37 |
|
||
|
NAV, SQL 2000 и оптимизатор запросов
|
|||
|---|---|---|---|
|
#18+
anatoleechGloryanatoleech Не-не-не, тут никакого коннекта не SET, это не вызов процедур, это выборка, которая производится навиженом из своей же базы данных. Это как - запрос выполняется, а коннекта к серверу нет ? А как тогда без коннекта запрос вообще попадает на сервер ? Потому что это и есть сервер навижена. Навижен шурует в своей же базе, своими же средствами, он к ней уже подключен. Вряд ли смогу внятно более объяснить - это чёрный ящик. Какой нафиг ящик Нельзя выполнить никакой команды на MSSQL без создания коннекта к нему ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2010, 16:37 |
|
||
|
NAV, SQL 2000 и оптимизатор запросов
|
|||
|---|---|---|---|
|
#18+
alexeyvganatoleechФильтрация по двум полям, оба поля входят в составной ключ из двух полей (не считая первичного ключа), а используется ключ из одного поля (не считая первичного ключа). Логично было бы взять конкретно указанный ключ с обоими фильтруемыми полями, а SQL предпочитает почему-то брать ключ с одним полем, что неправильно.Странно, вы же написали, что как раз сервер использует индекс с двумя полями, как и должно быть:anatoleechНо при этом в SQL почему-то выборка выполняется по уродскому ключу Примен.-из Операции Но.,Операция Но., что естественно приводит к фильтрации по неключевому полю с 54-секундным выполнением. Вам нужно освоить терминологию, профпайлер и вообще SQL Server, или привлечь соответствующего специалиста. Без этого не получится, или будет очень долго. Должно быть "Применено-к, применено-из". Используется "Применено-из". Терминологию осваивать нет резона, да и некогда. При работе с sqlной базой NAV, с SQL обычно приходится иметь дело просто на уровне администрирования. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2010, 16:44 |
|
||
|
NAV, SQL 2000 и оптимизатор запросов
|
|||
|---|---|---|---|
|
#18+
anatoleechПри работе с sqlной базой NAV, с SQL обычно приходится иметь дело просто на уровне администрирования. Т.е. вы сидите в какой-то утилите Navison и считаете, что она вам показывает то, что действительно происходит на MSSQL сервере ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2010, 16:46 |
|
||
|
|

start [/forum/topic.php?fid=29&msg=36838449&tid=1526391]: |
0ms |
get settings: |
11ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
153ms |
get topic data: |
13ms |
get forum data: |
2ms |
get page messages: |
70ms |
get tp. blocked users: |
2ms |
| others: | 237ms |
| total: | 512ms |

| 0 / 0 |

Извините, этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
... ля, ля, ля ...