|
Условие в запросе на непустую ссылку | ☑ | ||
|---|---|---|---|---|
|
0
chelentano
15.02.10
✎
14:47
|
всем здравствуйте!
платформа 8.1 Кто подскажет, почему условие в запросе "НЕ(СпрКонтрагенты.Код ЕСТЬ NULL)" сильно тормозит выполнение запроса? Т.е. когда накладываю. такое условие, запрос выполняется порядка 7 минут. Когда убираю условие - то порядка 3 секунд. В чём тут дело? |
|||
|
1
Ненавижу 1С
гуру
15.02.10
✎
14:48
|
потому что ЕСТЬ NULL не использует индексы
ИМХО |
|||
|
2
Defender aka LINN
15.02.10
✎
14:48
|
Потому что делается как минимум одно соединение лишнее.
|
|||
|
3
Mitriy
15.02.10
✎
14:49
|
просто на ссылку не айс?
|
|||
|
4
Sekho
15.02.10
✎
14:49
|
СпрКонтрагенты.КОД??? Этот реквизит же текстовый.
|
|||
|
5
Sekho
15.02.10
✎
14:49
|
""
|
|||
|
6
chelentano
15.02.10
✎
14:51
|
(3) типа ГДЕ СпрКонтрагенты ССЫЛКА Справочник.Контрагенты?
(5) тогда не попадут те, у кого Код = "" |
|||
|
7
Mitriy
15.02.10
✎
14:52
|
типа НЕ(СпрКонтрагенты.Ссылка ЕСТЬ NULL)
|
|||
|
8
butterbean
15.02.10
✎
14:52
|
(6) весь запрос покажи
|
|||
|
9
Nikitos
15.02.10
✎
14:52
|
НЕ(СпрКонтрагенты = Справочники.Валюты.ПустаяСсылка())
так не устраивает? |
|||
|
10
Dem1urg
15.02.10
✎
14:53
|
типа
... СпрКонтрагенты.Ссылка <> &Пустая ... Запрос.УстановитьПараметр(Справочники.Контрагенты.ПустаяСсылка()); |
|||
|
11
Sekho
15.02.10
✎
14:53
|
(6) Не(СпрКонтрагенты Есть NULL) . Я так понимаю, ты информацию без пустых контрагентов хочешь выбрать, а не без кодов контрагентов
|
|||
|
12
chelentano
15.02.10
✎
14:53
|
(8) 5 сек.
(9) сейчас попробую |
|||
|
13
Mitriy
15.02.10
✎
14:53
|
(9) не взлетит ))
|
|||
|
14
Dem1urg
15.02.10
✎
14:54
|
(10) имел ввиду
... СпрКонтрагенты.Ссылка <> &Пустая ... Запрос.УстановитьПараметр("Пустая", Справочники.Контрагенты.ПустаяСсылка()); |
|||
|
15
Nikitos
15.02.10
✎
14:55
|
согласен с (14).
но ведь надо же думать... |
|||
|
16
Wehrmacht
15.02.10
✎
14:55
|
СпрКонтрагенты.Ссылка <> ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка)
:) |
|||
|
17
Mitriy
15.02.10
✎
14:55
|
(14) NULL <> ПустаяСсылка
|
|||
|
18
Wehrmacht
15.02.10
✎
14:57
|
...хотя как СпрКонтрагенты.Ссылка может быть пустой?!...
|
|||
|
19
Sekho
15.02.10
✎
14:57
|
(11) - не вариант?
|
|||
|
20
Mitriy
15.02.10
✎
14:59
|
(19) тогда уж (7)
|
|||
|
21
Nikitos
15.02.10
✎
14:59
|
(18) ну забыл в каком-то документе заполнить контрагента...
|
|||
|
22
Wehrmacht
15.02.10
✎
14:59
|
(21) СпрКонтрагенты - явно не должно быть документом )
|
|||
|
23
Sekho
15.02.10
✎
15:00
|
(20) согласен
|
|||
|
24
Nikitos
15.02.10
✎
15:02
|
(22) а может он извращенец типа:
Выбрать Документ.Контрагент как СпрКонтрагенты Кто же его знает? |
|||
|
25
chelentano
15.02.10
✎
15:04
|
ТекстЗапроса = "
ВЫБРАТЬ СпрОрганизации.Код КАК КодОрганизации, СпрКонтрагенты.Код КАК КодКонтрагента, Таб.СуммаДЗ, Таб.СуммаПДЗ ИЗ (ВЫБРАТЬ ТабДебиторка.Договор КАК Договор, СУММА(ТабДебиторка.СуммаДЗ) КАК СуммаДЗ, СУММА(ТабДебиторка.СуммаПДЗ) КАК СуммаПДЗ ИЗ (ВЫБРАТЬ РегПрогнозОтгрузка.ДоговорКонтрагента КАК Договор, ВЫБОР КОГДА РегПрогнозОтгрузка.ТипыФактов = &ОтгрузкаФБП ТОГДА РегПрогнозОтгрузка.Сумма ИНАЧЕ -РегПрогнозОтгрузка.Сумма КОНЕЦ КАК СуммаДЗ, 0 КАК СуммаПДЗ ИЗ РегистрСведений.ТГ_ПрогнозОтгрузкаНаТТ КАК РегПрогнозОтгрузка ГДЕ РегПрогнозОтгрузка.ТипыФактов = &ОтгрузкаФБП ИЛИ РегПрогнозОтгрузка.ТипыФактов = &Оплата И РегПрогнозОтгрузка.Период <= &КонПериода ОБЪЕДИНИТЬ ВЫБРАТЬ РегПДЗ.Договор КАК Договор, 0 СуммаДЗ, РегПДЗ.Сумма КАК СуммаПДЗ ИЗ РегистрСведений.ТГ_ПросроченнаяДебиторскаяЗадолженность.СрезПоследних(&КонПериода, Сумма>0) КАК РегПДЗ ) КАК ТабДебиторка СГРУППИРОВАТЬ ПО ТабДебиторка.Договор ИМЕЮЩИЕ СУММА(ТабДебиторка.СуммаДЗ)>0 ИЛИ СУММА(ТабДебиторка.СуммаПДЗ)>0 ) КАК Таб ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ДоговорыКонтрагентов КАК СпрДоговоры ПО Таб.Договор = СпрДоговоры.Ссылка ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК СпрКонтрагенты ПО СпрДоговоры.Владелец = СпрКонтрагенты.Ссылка ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Организации КАК СпрОрганизации ПО СпрДоговоры.Организация = СпрОрганизации.Ссылка ГДЕ НЕ(СпрКонтрагенты.Код ЕСТЬ NULL) И НЕ(СпрОрганизации.Код ЕСТЬ NULL) |
|||
|
26
Mitriy
15.02.10
✎
15:04
|
(24) тогда сначала табуреткой по пальцам...
|
|||
|
27
chelentano
15.02.10
✎
15:04
|
(25) к (8)
|
|||
|
28
Mitriy
15.02.10
✎
15:05
|
(27) ты (7) пытал?
|
|||
|
29
chelentano
15.02.10
✎
15:07
|
кстати, если делать ВНУТРЕННЕЕ вместо ЛЕВОЕ, то тоже 7 минут выполняется
(28) угу, причём в первую очередь. то же самое |
|||
|
30
Dem1urg
15.02.10
✎
15:10
|
(25) а зачем тебе соединение на контрагентов если их можно напрямую через Владелец у договора взять?
|
|||
|
31
Mitriy
15.02.10
✎
15:11
|
(30) и Объединить замени на Объединить все
|
|||
|
32
Nikitos
15.02.10
✎
15:11
|
в (18) по-моему уже толково выражено
|
|||
|
33
Dem1urg
15.02.10
✎
15:12
|
ТекстЗапроса = "
ВЫБРАТЬ Таб.Договор.Организация.Код КАК КодОрганизации, Таб.Договор.Владелец.Код КАК КодКонтрагента, Таб.СуммаДЗ, Таб.СуммаПДЗ ИЗ (ВЫБРАТЬ ТабДебиторка.Договор КАК Договор, СУММА(ТабДебиторка.СуммаДЗ) КАК СуммаДЗ, СУММА(ТабДебиторка.СуммаПДЗ) КАК СуммаПДЗ ИЗ (ВЫБРАТЬ РегПрогнозОтгрузка.ДоговорКонтрагента КАК Договор, ВЫБОР КОГДА РегПрогнозОтгрузка.ТипыФактов = &ОтгрузкаФБП ТОГДА РегПрогнозОтгрузка.Сумма ИНАЧЕ -РегПрогнозОтгрузка.Сумма КОНЕЦ КАК СуммаДЗ, 0 КАК СуммаПДЗ ИЗ РегистрСведений.ТГ_ПрогнозОтгрузкаНаТТ КАК РегПрогнозОтгрузка ГДЕ РегПрогнозОтгрузка.ТипыФактов = &ОтгрузкаФБП ИЛИ РегПрогнозОтгрузка.ТипыФактов = &Оплата И РегПрогнозОтгрузка.Период <= &КонПериода ОБЪЕДИНИТЬ ВЫБРАТЬ РегПДЗ.Договор КАК Договор, 0 СуммаДЗ, РегПДЗ.Сумма КАК СуммаПДЗ ИЗ РегистрСведений.ТГ_ПросроченнаяДебиторскаяЗадолженность.СрезПоследних(&КонПериода, Сумма>0) КАК РегПДЗ ) КАК ТабДебиторка СГРУППИРОВАТЬ ПО ТабДебиторка.Договор ИМЕЮЩИЕ СУММА(ТабДебиторка.СуммаДЗ)>0 ИЛИ СУММА(ТабДебиторка.СуммаПДЗ)>0 ) КАК Таб |
|||
|
34
chelentano
15.02.10
✎
15:12
|
(31) зачем?
(30) можно. заинтересовало как факт (32) что именно выражено? как может быть пустой? при загрузке не заполнили, например |
|||
|
35
Nikitos
15.02.10
✎
15:13
|
+(32) зачем вообще эта проверка
ГДЕ НЕ(СпрКонтрагенты.Код ЕСТЬ NULL) И НЕ(СпрОрганизации.Код ЕСТЬ NULL) ?? |
|||
|
36
Mitriy
15.02.10
✎
15:14
|
(35) зачем вообще соединение...
|
|||
|
37
Dem1urg
15.02.10
✎
15:14
|
(34) пустой владелец штатно может быть только у пустого договора
|
|||
|
38
chelentano
15.02.10
✎
15:17
|
(37) выбираю записи из регистра, в регистре есть измерение "Договор", существует запись, где это измерение не заполнено. как отсечь такие записи?
|
|||
|
39
butterbean
15.02.10
✎
15:18
|
(38) ГДЕ Договор <> ЗНАЧЕНИЕ(Справочник.Договоры.ПустаяСсылка)
|
|||
|
40
chelentano
15.02.10
✎
15:25
|
кстати, если в каждом подзапросе условие на НЕ(Есть NULL) наложить, то нормально отрабатывает
|
|||
|
41
chelentano
15.02.10
✎
15:25
|
(39) в каждом из подзапросов?
|
|||
|
42
hhhh
15.02.10
✎
15:28
|
(40) есть NULL - это вообще из другой оперы. Ты определись, что тебе нужно.
|
|||
|
43
chelentano
16.02.10
✎
08:34
|
здравствуйте, господа знатоки запросов :)) Подниму ветку, т.к. вопрос так и остался до конца невыясненным. Немного переделал запрос, чтобы не было лишних вопросов, проблема остаётся прежней. Текст запроса:
ВЫБРАТЬ Таб.Договор КАК Договор, СпрОрганизации.Код КАК КодОрганизации, СпрКонтрагенты.Код КАК КодКонтрагента, Таб.СуммаДЗ, Таб.СуммаПДЗ, Таб.ДнейПросрочки ИЗ (ВЫБРАТЬ ТабДебиторка.Договор КАК Договор, СУММА(ТабДебиторка.СуммаДЗ) КАК СуммаДЗ, СУММА(ТабДебиторка.СуммаПДЗ) КАК СуммаПДЗ, МАКСИМУМ(ТабДебиторка.ДнейПросрочки) КАК ДнейПросрочки ИЗ (ВЫБРАТЬ РегПрогнозОтгрузка.ДоговорКонтрагента КАК Договор, ВЫБОР КОГДА РегПрогнозОтгрузка.ТипыФактов = &ОтгрузкаФБП ТОГДА РегПрогнозОтгрузка.Сумма ИНАЧЕ -РегПрогнозОтгрузка.Сумма КОНЕЦ КАК СуммаДЗ, 0 КАК СуммаПДЗ, 0 КАК ДнейПросрочки ИЗ РегистрСведений.ТГ_ПрогнозОтгрузкаНаТТ КАК РегПрогнозОтгрузка ГДЕ (РегПрогнозОтгрузка.ТипыФактов = &ОтгрузкаФБП ИЛИ РегПрогнозОтгрузка.ТипыФактов = &Оплата) И РегПрогнозОтгрузка.Период <= &КонПериода И ДоговорКонтрагента <> ЗНАЧЕНИЕ(Справочник.ДоговорыКонтрагентов.ПустаяСсылка) ) КАК ТабДебиторка СГРУППИРОВАТЬ ПО ТабДебиторка.Договор ИМЕЮЩИЕ СУММА(ТабДебиторка.СуммаДЗ)>0 ИЛИ СУММА(ТабДебиторка.СуммаПДЗ)>0 ) КАК Таб ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ДоговорыКонтрагентов КАК СпрДоговоры ПО Таб.Договор = СпрДоговоры.Ссылка ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК СпрКонтрагенты ПО СпрДоговоры.Владелец = СпрКонтрагенты.Ссылка ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Организации КАК СпрОрганизации ПО СпрДоговоры.Организация = СпрОрганизации.Ссылка ГДЕ СпрОрганизации.Код <> """" И СпрДоговоры.Код <> """" |
|||
|
44
chelentano
16.02.10
✎
08:37
|
так почему же он выполняется около 7 минут, где затык?
ЗЫ. если наложить те же самые соединения и условия в подзапросе или вообще убрать условия " ГДЕ СпрОрганизации.Код <> """" И СпрДоговоры.Код <> """" ", то время выполнения уменьшается до 3-4 секунд |
|||
|
45
butterbean
16.02.10
✎
08:37
|
(43) зачем тебе эти левые соединения?? убери - посмотри что будет
|
|||
|
46
chelentano
16.02.10
✎
08:39
|
(45) левые соединения не влияют никак, томрозит именно из-за условия
|
|||
|
47
chelentano
16.02.10
✎
08:40
|
+(46) если не делать соединений, а написать ГДЕ Таб.Договор.Организация.Код<> """", то происходит то же самое
|
|||
|
48
DUDE
16.02.10
✎
09:09
|
Чем автору не понравился подход, предложенный в (33)? при нем не потребуется делать условий вида "ГДЕ Таб.Договор.Организация.Код<> """" или "ГДЕ СпрОрганизации.Код <> """"" (разве что у вас реально есть организации с пустым кодом).
" томрозит именно из-за условия" см. (2) |
|||
|
49
chelentano
16.02.10
✎
09:15
|
(48) у нас реально есть организации и контрагенты с пустым кодом
|
|||
|
50
chelentano
16.02.10
✎
09:18
|
+(49) сейчас вопрос не в том, КАК это обойти, а в том, ПОЧЕМУ это происходит. в первый раз вижу, чтобы условие так влияло на время выполнения.
|
|||
|
51
chelentano
16.02.10
✎
09:20
|
кстати, если перехватить запрос в профайлере и запустить его на SQL сервере, то разница такая же
|
|||
|
52
hhhh
16.02.10
✎
09:22
|
(50) когда пишешь ГДЕ Таб.Договор.Организация.Код<> """",
у тебя система автоматом делает соединение со справочником организаций, а когда пишешь ГДЕ Таб.Договор.Организация <> &ПустаяСсылка - этого соединения не происходит. Сам подумай. Зачем тебе лишнее соединение? |
|||
|
53
chelentano
16.02.10
✎
09:27
|
(52) хочешь сказать, что из-за лишнего соединения разница в 7 минут? сильно сомневаюсь
|
|||
|
54
DUDE
16.02.10
✎
09:29
|
Самое простое в твоем случае - составить список таких организаций и заменить проверку Код<> """" на "Организация В (&СписокСНепустымиКодами)" или "Организация НЕ В (&СписокСПустымиКодами)" (смотря что будет оптимальней).
|
|||
|
55
DUDE
16.02.10
✎
09:31
|
(53) если таких строк много, то почему бы и нет, тем более, что у тебя при этом платформой делается внутреннее соединение с таб. организаций и таб. договоров(для двух условий).
|
|||
|
56
chelentano
16.02.10
✎
09:36
|
(55) когда прописываю сам
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК СпрКонтрагенты ПО СпрДоговоры.Владелец = СпрКонтрагенты.Ссылка ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Организации КАК СпрОрганизации ПО СпрДоговоры.Организация = СпрОрганизации.Ссылка , то выполняется быстро когда прописываю ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК СпрКонтрагенты ПО СпрДоговоры.Владелец = СпрКонтрагенты.Ссылка ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Организации КАК СпрОрганизации ПО СпрДоговоры.Организация = СпрОрганизации.Ссылка ГДЕ СпрОрганизации.Код <> """" И СпрДоговоры.Код <> """" , то тормозит. Т.е. проблема не в соединении, а именно в условии, когда есть соединение, но нет условия, выполняется шустро |
|||
|
57
DUDE
16.02.10
✎
09:40
|
(56) Ключевые слова в моем посте были "платформой делается внутреннее соединение".
|
|||
|
58
dk
16.02.10
✎
09:45
|
(56) привет
может рлс на код наложен? |
|||
|
59
chelentano
16.02.10
✎
10:10
|
(57) платформой не делается внутреннее соединение, по крайней мере, в профайлере нет такого
(58) привет, нет там никаких рлс |
|||
|
60
dk
16.02.10
✎
10:13
|
а если поменять местами?
ГДЕ (СпрДоговоры.Код <> """") И (СпрОрганизации.Код <> """") хотя ... |
|||
|
61
chelentano
16.02.10
✎
10:16
|
(60) вот именно :))))
|
|||
|
62
chelentano
16.02.10
✎
10:17
|
что такое Clustered Index Scan?
|
|||
|
63
chelentano
16.02.10
✎
10:18
|
в плане выполнения 76% занимает
|
|||
|
64
Wehrmacht
16.02.10
✎
10:25
|
(56) Ну может потому что операции сравнения строк по определению достаточно тормозные, не?
|
|||
|
65
chelentano
16.02.10
✎
10:54
|
(64) ну не настолько же
|
|||
|
66
Dem1urg
16.02.10
✎
15:12
|
А сколько по времени выполняется такой вариант?
ВЫБРАТЬ Таб.Договор.Организация.Код КАК КодОрганизации, Таб.Договор.Владелец.Код КАК КодКонтрагента, Таб.СуммаДЗ, Таб.СуммаПДЗ ИЗ (ВЫБРАТЬ ТабДебиторка.Договор КАК Договор, СУММА(ТабДебиторка.СуммаДЗ) КАК СуммаДЗ, СУММА(ТабДебиторка.СуммаПДЗ) КАК СуммаПДЗ ИЗ (ВЫБРАТЬ РегПрогнозОтгрузка.ДоговорКонтрагента КАК Договор, ВЫБОР КОГДА РегПрогнозОтгрузка.ТипыФактов = &ОтгрузкаФБП ТОГДА РегПрогнозОтгрузка.Сумма ИНАЧЕ -РегПрогнозОтгрузка.Сумма КОНЕЦ КАК СуммаДЗ, 0 КАК СуммаПДЗ ИЗ РегистрСведений.ТГ_ПрогнозОтгрузкаНаТТ КАК РегПрогнозОтгрузка ГДЕ РегПрогнозОтгрузка.ТипыФактов = &ОтгрузкаФБП ИЛИ РегПрогнозОтгрузка.ТипыФактов = &Оплата И РегПрогнозОтгрузка.Период <= &КонПериода ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ РегПДЗ.Договор КАК Договор, 0 СуммаДЗ, РегПДЗ.Сумма КАК СуммаПДЗ ИЗ РегистрСведений.ТГ_ПросроченнаяДебиторскаяЗадолженность.СрезПоследних(&КонПериода, Сумма>0) КАК РегПДЗ ) КАК ТабДебиторка СГРУППИРОВАТЬ ПО ТабДебиторка.Договор ИМЕЮЩИЕ СУММА(ТабДебиторка.СуммаДЗ)>0 ИЛИ СУММА(ТабДебиторка.СуммаПДЗ)>0 ) КАК Таб ГДЕ Таб.Договор.Организация.Код <> """" И Таб.Договор.Код <> """" |
|||
|
67
chelentano
16.02.10
✎
15:14
|
(66) да также
|
|||
|
68
Bober
16.02.10
✎
15:30
|
проверка нужна на пустую ссылку или на битую ссылку?
|
|||
|
69
chelentano
16.02.10
✎
15:33
|
(68) проверка нужна на непустой код, т.е. Организация.Код<>"" И Контрагент.Код<>""
|
|||
|
70
DUDE
16.02.10
✎
15:38
|
если все же вопрос с исследованием причин закрыт, то предложу (54) как способ решения
|
|||
|
71
chelentano
16.02.10
✎
15:41
|
(70) способ решения уже давно найден :)) вопрос именно в причине, любопытно, что происходит... причём происходит на уровне именно SQL уже
|
|||
|
72
DUDE
16.02.10
✎
16:20
|
(59) Странно.
У меня тестовый запрос ВЫБРАТЬ ПоступлениеТоваровУслуг.Контрагент ИЗ Документ.ПоступлениеТоваровУслуг КАК ПоступлениеТоваровУслуг ГДЕ ПоступлениеТоваровУслуг.Контрагент.Код ПОДОБНО "%00243%" транслировался в SELECT _Document336_Q_000_T_001._Fld7098RRef AS f_1 FROM _Document336 _Document336_Q_000_T_001 WITH(NOLOCK) LEFT OUTER JOIN _Reference63 WITH(NOLOCK) ON _Document336_Q_000_T_001._Fld7098RRef = _Reference63._IDRRef WHERE _Reference63._Code LIKE N'%00243%'. |
|||
|
73
Dem1urg
16.02.10
✎
17:24
|
А сколько строк данных возвращет запрос?
|
|||
|
74
chelentano
17.02.10
✎
07:40
|
(72) что странного? где тут внутреннее соединение? :) всё правильно он у тебя транслировался, не придерёшься :)
(73) в данный момент 1347 |
|||
|
75
DUDE
17.02.10
✎
08:36
|
(74) Просто соединение-то все же делается, пусть и не внутреннее(оно тут и не нужно, конечно, ведь итак все записи из правой части найдутся в левой). Вот попробуй перестроить свой запрос явно на соединения, имхо, сразу разница будет видна.
|
|||
|
76
chelentano
17.02.10
✎
08:40
|
(75) что значит "перестроить запрос явно на соединения"?
а это что: ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ДоговорыКонтрагентов КАК СпрДоговоры ПО Таб.Договор = СпрДоговоры.Ссылка ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК СпрКонтрагенты ПО СпрДоговоры.Владелец = СпрКонтрагенты.Ссылка ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Организации КАК СпрОрганизации ПО СпрДоговоры.Организация = СпрОрганизации.Ссылка ГДЕ СпрОрганизации.Код <> """" И СпрДоговоры.Код <> """" или имеешь ввиду что-то другое? |
|||
|
77
DUDE
17.02.10
✎
08:45
|
*из левой части запроса найдутся в правой.
Одно дело просто "запрос1" и запрос1 лев.соед. таб1 по запрос1.поле1 = таб1.поле1 лев.соед. таб2 по запрос1.поле2 = таб2.поле1 Кстати, заметь, что условие накладывается уже на результат, причем на пристыковываемую таблицу. Будут временно выбраны и твои поля запроса1 и обеих таблиц. |
|||
|
78
DUDE
17.02.10
✎
08:47
|
(76) извини, не посмотрел выше. Думаю, по времени оба запроса одинаково выполняются, так?
|
|||
|
79
chelentano
17.02.10
✎
08:53
|
(78) ага, одинаково. то ли он там что то перестраивает при сравнении то ли что. экспериментальным путём (в данном случае) было выяснено кстати, что ГДЕ ЕСТЬNULL(СпрОрганизации.Код,"")<>"""" отрабатывает быстрее, чем СпрОрганизации.Код <> """"
|
|||
|
80
DUDE
17.02.10
✎
08:55
|
похоже вопрос темы реально к знатокам внутренних механизмов sql
надо поискать инфу по Clustered Index Scan :) |
|||
|
81
chelentano
17.02.10
✎
08:57
|
(80) угу, похоже да :) 1с тут не при чём, мне уже в принципе дали более-менее внятное объяснение, но я ещё не достиг того уровня просветления, чтобы полностью усвоить его и понять, что происходит при сравнении СпрОрганизации.Код <> """" :))))
|
|||
|
82
DUDE
17.02.10
✎
08:58
|
"ГДЕ ЕСТЬNULL(СпрОрганизации.Код,"")<>"""" отрабатывает быстрее"
Имхо, странно. |
|||
|
83
DUDE
17.02.10
✎
09:07
|
(81) "мне уже в принципе дали более-менее внятное объяснение"
Поделись, если не секрет. |
|||
|
84
chelentano
17.02.10
✎
09:10
|
(83) некий Му-Му: "Дело в том что условие <>(например СпрДоговоры.Код <> """" ) в большинстве случаев приводит к сканированию. Это связано с тем что в случае равенства тебе надо найти быстро нужное значение а в случае не равенства перебрать все.
С другой стороны ты же сам и ответил.(наложи в подзапросе)" |
|||
|
85
hhhh
17.02.10
✎
09:12
|
(84) скорее всего это кеш. Если один и тот же запрос выполнить два раза подряд, то второй раз он выполнится в несколько раз быстрее. Потому что он данные берет из кеша.
|
|||
|
86
chelentano
17.02.10
✎
09:14
|
(85) да нет, не должен быть, вроде, если входные параметры меняются, то не из кэша берёт, сейчас проверю ещё раз
|
|||
|
87
chelentano
17.02.10
✎
09:17
|
+(86) нет, дело не в кэше. ГДЕ ЕСТЬNULL(СпрОрганизации.Код,"")<>"""" отрабатывает однозначно быстрее, чем СпрОрганизации.Код <> """"
|
|||
|
88
DUDE
17.02.10
✎
09:20
|
Думаю тоже, что фишка с более быстрым выполнением ЕСТЬNULL(СпрОрганизации.Код,"") - влияние кэша.
(84) чОрт :) про "<>" то я знал, условия неравенства как и не вхождения в список/иерархию всегда приводят к полному перебору. Просто я думал, что про sql server что-то рассказали ) |
|||
|
89
DUDE
17.02.10
✎
09:21
|
(87) здорово :) на будущее нужно будет запомнить
|
|||
|
90
chelentano
17.02.10
✎
09:21
|
+(87) видимо, когда пишу ЕСТЬNULL(СпрОрганизации.Код,"")<>"""", то SQL заведомо отбрасывает все соединения, которым нет соответствия в правой таблице, а когда СпрОрганизации.Код<>"" - то перебирает все записи
|
|||
|
91
chelentano
17.02.10
✎
09:28
|
а сегодня нормально всё. SQL понял, как надо строить запрос???
|
|||
|
92
hhhh
17.02.10
✎
10:01
|
(91) потому что из кеша взялось. Попробуй после перезагрузки компа.
|
|||
|
93
Dem1urg
17.02.10
✎
10:16
|
(92) при работе SQL значительное время тратися не только на саму выборку данных, но и на построение плана запроса.
И если один и тот же запрос выполняется несколько раз, пусть и с разными данными, перестроение плана запроса уже не требуется. Поэтому второй и последующие разы запрос выполняется быстрее. |
|||
|
94
blindedofdesire
08.05.10
✎
05:36
|
53176483939987625860691497018065
|
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |