04.11.2010, 10:37 | #1 |
Участник
|
order by тормозит
X++: InventTrans inventTrans; Counter counter; TimeOfDay start; ; start = timenow(); for (counter = 1; counter <= 10; counter ++) while select inventTrans order by statusIssue where inventTrans.inventTransId == '1234567890' && inventTrans.statusReceipt == StatusReceipt::None && inventTrans.statusIssue >= StatusIssue::ReservOrdered && inventTrans.statusIssue <= StatusIssue::OnOrder { info(inventTrans.ItemId); } info(int2str(timenow() - start)); start = timenow(); for (counter = 1; counter <= 10; counter ++) while select inventTrans // order by statusIssue where inventTrans.inventTransId == '1234567890' && inventTrans.statusReceipt == StatusReceipt::None && inventTrans.statusIssue >= StatusIssue::ReservOrdered && inventTrans.statusIssue <= StatusIssue::OnOrder { info(inventTrans.ItemId); } info(int2str(timenow() - start)); Info Сообщение (13:28:54) 0 Господа, это только у меня, или кто-то решал эту проблему? Запрос элементарный, проиндексировано по inventTransId. Сортировка по другим полям тормозит еще больше. Решение есть, но что-то здесь мне не нравитcя. Ax3.0 SP3 KR3 SQL2005 Последний раз редактировалось Old; 04.11.2010 в 10:57. |
|
04.11.2010, 16:41 | #2 |
Модератор
|
У Вас WHERE и ORDER BY указаны по группе полей (InventTransId, StatusReceipt, StatusIssue), которая ни одним штатным индексом не покрывается, так что это некоторый челлендж для оптимизатора. Планов исполнения Вы не привели, поэтому предположительно в запросе без сортировки он подхватывает индекс TransIdIdx, отбирает проводки по лоту и далее эту выборку дофильтровывает по StatusReceipt, StatusIssue, а во втором запросе видит для себя дополнительную работу по сортировке и пытается упростить себе жизнь, отобрав уже отсортированные по StatusIssue ключи в StatusItemIdx и потом дофильтровав выборку по лоту. По идее, единичный лот обычно гораздо селективнее любой комбинации {StatusReceipt, StatusIssue} и выборка по нему предпочтительнее, но это уже относится к организации статистик вообще и к их аккуратности и актуальности конкретно в Вашей БД. В качестве workaround-а можно предложить как минимум два варианта:
__________________
-ТСЯ или -ТЬСЯ ? |
|
04.11.2010, 20:43 | #3 |
Участник
|
Index кластерный
Решение есть, но мне не нравится, что при элементарном проиндексированном по inventTransId запросе, сортировка по любому полю кроме inventTtransId, такие тормоза. |
|
04.11.2010, 20:59 | #4 |
Участник
|
А у Вас это наблюдается?
Производительность ведь в разы. Последний раз редактировалось Old; 04.11.2010 в 21:14. |
|
04.11.2010, 23:59 | #5 |
----------------
|
при нормальных индексах и статистиках такого быть не должно.
|
|
10.11.2010, 10:00 | #6 |
Участник
|
Можно попробовать отключить параллелизм на MS SQL.
В запросе установлен отбор проводок только с определенным лотом, а обычно их число для одного лота не превышает нескольких десятков. Если это так, то сортировка небольшого кол-ва записей не должна ощутимо влиять на производительность. |
|
10.11.2010, 12:02 | #7 |
Участник
|
Мне кажется, не надо танцев с бубном - лучше посмотреть на запрос в том виде, как его получает СУБД: если с ним все в порядке, то посмтотреть на план запроса, подумать, почему он "не такой, как надо", и копать в эту сторону.
|
|
Теги |
inventtrans, order by, sql server, производительность |
|
|