|
v7: Оптимизатор запросов SQL | ☑ | ||
---|---|---|---|---|
0
monsterZE
03.07.19
✎
12:11
|
Есть запрос, который сабж разбирает двумя разными способами. )
1 - с использованием индекса (быстрый) 2 - поиск ключа (медленный) Как заставить его не использовать 2 способ? Пробывал вариации с ексепт хоть лефт оутер джойн.. результат одинаковый (либо оба быстро, либо медленно) ТекстЗапроса = " |SELECT | Т1.До as [Док $Документ.РасходнаяНал] | ,Т1.Ск as [Склад $Справочник.СкладыТ] |FROM | ( | SELECT DISTINCT | ДокР.IDDoc as До | ,$СпрТов.СкладТ as Ск | FROM | $Документ.РасходнаяНал as ДокР (NOLOCK) | INNER JOIN | _1SJourn as Жур (NOLOCK) ON Жур.IDDoc = ДокР.IDDoc | AND (Жур.IDDocDef = $ВидДокумента.РасходнаяНал) | AND (Жур.Date_Time_IDDoc BETWEEN :НачДата AND :КонДата~) | AND (Жур.Closed & 1 = 1) | INNER JOIN | $ДокументСтроки.РасходнаяНал as ДокРСтр (NOLOCK) ON ДокРСтр.IDDoc = ДокР.IDDoc | INNER JOIN | $Справочник.Товары as СпрТов (NOLOCK) ON СпрТов.ID = $ДокРСтр.Товар %СкладТ% | WHERE | $ДокР.ПризнакНакладной = $Перечисление.ПризнРасхНакл.Продажа | AND $ДокР.Склад = :ОснСклад | ) Т1 |left outer join | ( | SELECT | $Спр.Док as До | ,$Спр.Склад as Ск | FROM | $Справочник.СтатОтгрузки as Спр (NOLOCK) | WHERE | $Спр.ДатаДляОтбора BETWEEN :НачДата AND :КонДата2 | ) Т2 ON (Т2.До=Т1.До) AND (Т2.Ск=Т1.Ск) |WHERE | Т2.До is null |"; |
|||
1
monsterZE
03.07.19
✎
12:11
|
Вариант с ексепт
ТекстЗапроса = " |SELECT DISTINCT | ДокР.IDDoc as [Док $Документ.РасходнаяНал] | ,$СпрТов.СкладТ as [Склад $Справочник.СкладыТ] //| ,$ДокР.Клиент as [Клиент $Справочник.Клиенты] |FROM | $Документ.РасходнаяНал as ДокР (NOLOCK) |INNER JOIN | _1SJourn as Жур (NOLOCK) ON Жур.IDDoc = ДокР.IDDoc | AND (Жур.IDDocDef = $ВидДокумента.РасходнаяНал) | AND (Жур.Date_Time_IDDoc BETWEEN :НачДата AND :КонДата~) | AND (Жур.Closed & 1 = 1) |INNER JOIN | $ДокументСтроки.РасходнаяНал as ДокРСтр (NOLOCK) ON ДокРСтр.IDDoc = ДокР.IDDoc |INNER JOIN | $Справочник.Товары as СпрТов (NOLOCK) ON СпрТов.ID = $ДокРСтр.Товар %СкладТ% |WHERE | $ДокР.ПризнакНакладной = $Перечисление.ПризнРасхНакл.Продажа | AND $ДокР.Склад = :ОснСклад |EXCEPT |SELECT | $Спр.Док | ,$Спр.Склад |FROM | $Справочник.СтатОтгрузки as Спр (NOLOCK) |WHERE | $Спр.ДатаДляОтбора BETWEEN :НачДата AND :КонДата2 |ORDER BY | ДокР.IDDoc |"; |
|||
2
monsterZE
03.07.19
✎
12:13
|
Смысл запроса - получить те строки, которые присутствуют в первой табличке и отсутствуют во второй.
|
|||
3
Sserj
03.07.19
✎
12:39
|
AND (Жур.IDDocDef = $ВидДокумента.РасходнаяНал)
AND (Жур.Date_Time_IDDoc BETWEEN :НачДата AND :КонДата~) AND (Жур.Closed & 1 = 1) Вот это кажись надо перенести в WHERE чтобы оптимизатор в сомнения не вводить. |
|||
5
rphosts
03.07.19
✎
12:50
|
(0) посмотрите план выполнения, возможно кривая статистика(обновить + очистить процедурный кэшь).
|
|||
6
monsterZE
03.07.19
✎
13:00
|
(3) перенес, пофигу (
(5) так его и смотрю.. ставлю период, например, неделя 1 - в плане используется поиск по класт. индексу, неделя 2 - поиск ключа статистика обновляется каждый день |
|||
7
toypaul
гуру
03.07.19
✎
13:16
|
(NOLOCK INDEX = МойСуперПуперИндекс)
|
|||
8
monsterZE
03.07.19
✎
14:17
|
(7) аллилуя ))
|
|||
9
Ёпрст
03.07.19
✎
14:27
|
и ..в первом запросе табличка
FROM | $Документ.РасходнаяНал as ДокР (NOLOCK) лишняя |
|||
10
Ёпрст
03.07.19
✎
14:28
|
ты же потом с неё ничего не берешь, а все берешь с таб части
|
|||
11
monsterZE
03.07.19
✎
14:28
|
(9) Почему?.. вроде хуже не делает, а табличку дока не блокирует
|
|||
12
monsterZE
03.07.19
✎
14:30
|
хм.. тако-то да.. осталось от какой-то версии запроса
собсно, наверное, можно ее вобще убрать.. |
|||
13
Ёпрст
03.07.19
✎
14:32
|
(11) а всё, $ДокР.ПризнакНакладной = $Перечисление.ПризнРасхНакл.Продажа
| AND $ДокР.Склад = :ОснСклад не увидел сперва |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |