|  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, производительность | 
|  | 
| 
 |