|
Проблема со скоростью выполнения запроса | ☑ | ||
---|---|---|---|---|
0
Tester
03.05.19
✎
16:34
|
Всем привет. Может кто подскажет почему один и тот же запрос, получающий выборку данных из временных таблиц с одним и тем же количеством записей чаще выполняется около 5 секунд, но иногда зависает на 1-2 часа?
Выбрать втОтбор.Номенклатура, втОтбор.Размещение, втОтбор.СтруктурнаяЕдиница Из вт_ТаблицаОтбораЛокальная как втОтбор ВНУТРЕННЕЕ СОЕДИНЕНИЕ вт_Родословная_Номенклатура КАК вт_Родословная_Номенклатура ПО вт_Родословная_Номенклатура.ссылка = втОтбор.Номенклатура ВНУТРЕННЕЕ СОЕДИНЕНИЕ вт_Родословная_Размещение КАК вт_Родословная_Размещение ПО вт_Родословная_Размещение.ссылка = втОтбор.Размещение ВНУТРЕННЕЕ СОЕДИНЕНИЕ вт_Родословная_СтруктурнаяЕдиница КАК вт_Родословная_СтруктурнаяЕдиница ПО вт_Родословная_СтруктурнаяЕдиница.ссылка = втОтбор.СтруктурнаяЕдиница Внутреннее соединение втОтборПредковПоЗначениям КАК втРодители По вт_Родословная_Номенклатура.Предок = втРодители.НоменклатураПредок И вт_Родословная_Размещение.Предок = втРодители.РазмещениеПредок И вт_Родословная_СтруктурнаяЕдиница.Предок = втРодители.Структурная_единицаПредок Сгруппировать по втОтбор.Номенклатура, втОтбор.Размещение, втОтбор.СтруктурнаяЕдиница |
|||
40
palsergeich
12.05.19
✎
13:58
|
И какая нахрен деградация индексов?
По теме - с выборкой и помещением в Вт проблем нет. |
|||
41
Tester
12.05.19
✎
14:00
|
(35) (37) спасибо. Тогда нужно только выловить планы и убедиться в этом.
|
|||
42
palsergeich
12.05.19
✎
14:04
|
(41) скажу так, из своей достаточно богатой практики. Единственное стабильное решение это использовать промежуточные объекты БД, я делал очень похожее, вспомогательный РС, заполняемый в подписке ускорил всё на порядки.
Все остальное давало только временный эффект. |
|||
43
palsergeich
12.05.19
✎
14:07
|
Это задача из серии вычислить остатки на каждый день.
Да можно написать запрос. Он первое время будет работать изумительно. А потом в один прекрасный или не очень день все сломается. Потом это оптимизируется и ещё какое то время работает и снова ломается. То что, используются большие ВТ это уже признак того, что решение не стабильно. Сегодня 1кк, завтра 10кк и снова тема на форуме?) |
|||
44
Tester
12.05.19
✎
14:11
|
(43) про архитектуру и логику это тема для отдельной темы :) Ибо этот запрос из блока функционала, в котором используется МВТ с десятками таблиц, кочующий по разным процедурам...
|
|||
45
vde69
12.05.19
✎
14:12
|
(43) >>>То что, используются большие ВТ это уже признак того, что решение не стабильно
+100 Вообще ВТ это не панацея, не надо ее пихать везде... Единственное бесспорное условие необходимости ВТ - это многократное ее использование, все остальное под вопросом :) Ну а по поводу дополнительного регистра на каждый день - я думаю это то-же не самая лучшая идея (пример - производственный календарь в 1с, с ним всегда какие-то траблы вылазят...) хотя конечно все зависит от конкретики |
|||
46
palsergeich
12.05.19
✎
14:14
|
(45) Норм работает в жизни, если грамотно спроектировать.
Вот изменения уже потом идут через боль. |
|||
47
Tester
12.05.19
✎
14:15
|
О блин, пока тут треплюсь уже на 15 минут повис запрос.
|
|||
48
vde69
12.05.19
✎
14:16
|
(47) так сразу смотри очередь к диску и план запроса копируй в скриншоты
|
|||
49
palsergeich
12.05.19
✎
14:19
|
(46) Скажу так за 5 лет по 100 000 позиций (отраслевому справочника аналогичному номенклатуре по сути), вполне себе бодро шуршит, я 1.5 года там не работаю, но на сколько мне известно до сих пор летает.
Другое дело, что в первой редакции мы кое что не учли и пришлось делать схожий регистр но с другим полем. И по факту 2 РС с остатками. Да база пухнет, но заказчик просто рыдал от счастья, когда вместо минут все стало работать менее секунды. |
|||
50
palsergeich
12.05.19
✎
14:22
|
(44) Могу только посочувствовать
|
|||
51
Tester
12.05.19
✎
14:30
|
В активити мониторе есть этот запрос, но план не отображается.
Я еще наверное не сказал, что результат запросе также помещается во временную таблицу. INSERT INTO #tt283 WITH(TABLOCK) (_Q_000_F_000RRef, _Q_000_F_001_TYPE, _Q_000_F_001_RTRef, _Q_000_F_001_RRRef, _Q_000_F_002RRef) SELECT DISTINCT T1.Q_001_F_000RRef, T1.Q_001_F_002_TYPE, T1.Q_001_F_002_RTRef, T1.Q_001_F_002_RRRef, T1.Q_001_F_004RRef FROM (SELECT T2._Q_000_F_000RRef AS Q_001_F_000RRef, T3._Q_000_F_001RRef AS Q_001_F_001RRef, T2._Q_000_F_001_TYPE AS Q_001_F_002_TYPE, T2._Q_000_F_001_RTRef AS Q_001_F_002_RTRef, T2._Q_000_F_001_RRRef AS Q_001_F_002_RRRef, T4._Q_000_F_001_TYPE AS Q_001_F_003_TYPE, T4._Q_000_F_001_RTRef AS Q_001_F_003_RTRef, T4._Q_000_F_001_RRRef AS Q_001_F_003_RRRef, T2._Q_000_F_002RRef AS Q_001_F_004RRef, T5._Q_000_F_001RRef AS Q_001_F_005RRef FROM #tt47 T2 WITH(NOLOCK) INNER JOIN #tt92 T3 WITH(NOLOCK) ON (T3._Q_000_F_000RRef = T2._Q_000_F_000RRef) INNER JOIN #tt90 T4 WITH(NOLOCK) ON (T4._Q_000_F_000_TYPE = T2._Q_000_F_001_TYPE AND T4._Q_000_F_000_RTRef = T2._Q_000_F_001_RTRef AND T4._Q_000_F_000_RRRef = T2._Q_000_F_001_RRRef) INNER JOIN #tt84 T5 WITH(NOLOCK) ON (T5._Q_000_F_000RRef = T2._Q_000_F_002RRef)) T1 INNER JOIN #tt282 T6 WITH(NOLOCK) ON (((CASE WHEN T1.Q_001_F_001RRef IS NOT NULL THEN 0x08 END = T6._Q_000_F_000_TYPE AND CASE WHEN T1.Q_001_F_001RRef IS NOT NULL THEN 0x000000D6 END = T6._Q_000_F_000_RTRef AND T1.Q_001_F_001RRef = T6._Q_000_F_000_RRRef) AND (T1.Q_001_F_003_TYPE = T6._Q_000_F_001_TYPE AND T1.Q_001_F_003_RTRef = T6._Q_000_F_001_RTRef AND T1.Q_001_F_003_RRRef = T6._Q_000_F_001_RRRef)) AND (CASE WHEN T1.Q_001_F_005RRef IS NOT NULL THEN 0x08 END = T6._Q_000_F_002_TYPE AND CASE WHEN T1.Q_001_F_005RRef IS NOT NULL THEN 0x00000125 END = T6._Q_000_F_002_RTRef AND T1.Q_001_F_005RRef = T6._Q_000_F_002_RRRef)) Винт загружен, то там бэкап делается и пересчет статистики. https://b.radikal.ru/b23/1905/a9/b396ee06e8c2.png |
|||
52
palsergeich
12.05.19
✎
14:32
|
(51) Это не план, а текст запроса
|
|||
53
palsergeich
12.05.19
✎
14:33
|
И очередь к диску больше 1
|
|||
54
vde69
12.05.19
✎
14:33
|
(51) причина тормозов - очередь к диску D:,
причина очереди - надо смотреть... ну и кстати пересчет статистики во время тяжолого запроса - не айс точно |
|||
55
palsergeich
12.05.19
✎
14:34
|
(54) Причина - скидывание всякого из ОЗУ на HDD, а потом чтение
|
|||
56
palsergeich
12.05.19
✎
14:35
|
1КК записей уже нормально так весят
|
|||
57
vde69
12.05.19
✎
14:37
|
обращаю внимание, второй джойн идет с условием AND, это скорее всего из-за составного типа.
это условие идет скорее всего мимо индекса.... |
|||
58
palsergeich
12.05.19
✎
14:38
|
(57) AND это не OR и условие равенство
|
|||
59
vde69
12.05.19
✎
14:39
|
(55) правильно, сваливание в своп, о чем я и писал ранее, возможно нужно ограничить SQL выделяемой памятью (но тут смотреть надо, это сейчас не понацея а только один из вариантов). По тому как это не SQL делает а операционка..
|
|||
60
vde69
12.05.19
✎
14:40
|
(58) все равно он в индекс не попадет...
|
|||
61
palsergeich
12.05.19
✎
14:41
|
(60) А не факт что у этой ВТ в принципе есть индекс.
|
|||
62
palsergeich
12.05.19
✎
14:41
|
А если есть, то его создание и хранение - это еще больше свопов
|
|||
63
rphosts
12.05.19
✎
14:42
|
Очередь к диску максимум 2,5 - чуть больше нормы. Так что не клевещите на диск.
Для начала: сделай отбор по каждой табличке во временную (ну может кроме той к которой все присоединяете) и только потом соединение. И да, как тут отметили - базы требуют регулярного обслуживания! |
|||
64
vde69
12.05.19
✎
14:43
|
(61) без индексов будет ЖП. SQL оптимизируя запросы с ВТ сам иногда добавляет не кластерезованные внутрение идексы.
|
|||
65
rphosts
12.05.19
✎
14:45
|
(55) миллион записей скидывается на диск? С той структурой что есть они много мегабайт займут? за 8 часов можно сделалть даже на 5 дюймовые флопы 100500 копий такого свопа
|
|||
66
rphosts
12.05.19
✎
14:46
|
+ (63) если 8.3.Х.Х - неплохо сделать для временных таблиц по полям соединения индексы.
|
|||
67
Tester
12.05.19
✎
14:49
|
А план не могу посмотреть потому что запрос не выполнился?
https://c.radikal.ru/c00/1905/98/f7ca7da686fa.png |
|||
68
rphosts
12.05.19
✎
14:50
|
(67) а из ТЖ?
|
|||
69
rphosts
12.05.19
✎
14:50
|
и да, сделай как написал в (63) + (66)
|
|||
70
rphosts
12.05.19
✎
14:51
|
+(68) сейчас ухожу по делам, но если есть проблема в чтении текстового плана запроса - по возвращению могу посмотреть
|
|||
71
palsergeich
12.05.19
✎
14:52
|
(65) Много мегабайт займут. А если еще постоянное чтение благодоря Nested loops то и по времени очень затратно
(68) (66) там по моему индекс во временных стал кластерным не сначала, а совсем относительно недвано. |
|||
72
Tester
12.05.19
✎
15:01
|
(70) я, млин, не знаю где его посмотреть. В ТЖ ничего нет, хотя включена фиксация всего.
|
|||
73
palsergeich
12.05.19
✎
15:06
|
<plansql/>
|
|||
74
palsergeich
12.05.19
✎
15:07
|
Пример ТЖ со сбором плланов
<config xmlns="http://v8.1c.ru/v8/tech-log"> <dump location="C:\1C_Info\Dumps" create="1" type="2"/> <plansql/> <log location="C:\1C_Info\Logs" history="1"> <event> <eq property="name" value=" DBPOSTGRS"/> <ge property="duration" value="100000"/> </event> <property name="all"/> </log> </config> |
|||
75
vde69
12.05.19
✎
15:11
|
(73) ВЫ его с ТЖ сейчас совсем прибьете :)
(72) на запросе ПКМ и показать план выполнения, если он нам не показывается, то или уже завершен и удален или еще не сформирован |
|||
76
Tester
12.05.19
✎
15:13
|
(74) тьфу, затупил. Фиксировались только EXCP.
(75) план не показывает, выше ссылку на скрин приложил. Запрос висит, но плана нет. |
|||
77
vde69
12.05.19
✎
15:14
|
(75) +
если сейчас идут регламентые операции - то они очень существенно могут замедлить, например перестроение индекса может завесить запрос все время выполнения, бекапы - типовые вроде нет, но уверен, что с кривыми руками можно сервак завесить даже обновлением статистики.... |
|||
78
Tester
12.05.19
✎
15:17
|
(77) сейчас выключил все job'ы - запрос как висел так и висит.
|
|||
79
vde69
12.05.19
✎
15:17
|
||||
81
vde69
12.05.19
✎
15:27
|
||||
82
Tester
12.05.19
✎
15:31
|
(81) спасибо, но предполагаемый план запроса к временным таблицам, созданным в другом соединении не получить. Нужно дождаться выполнения запроса, который уже выполняется 1.5 часа.
|
|||
83
H A D G E H O G s
12.05.19
✎
15:35
|
(82) Есть возможность выложить базу на онлайн диск?
|
|||
84
Tester
12.05.19
✎
15:37
|
(83) нет, к сожалению. База уже 700 Гб.
Перезапустил фоновое - этот же запрос выполнился за 3 секунды. |
|||
85
rphosts
12.05.19
✎
17:04
|
(84) для начала сделай как написано в (69) а там по результату
|
|||
86
Tester
12.05.19
✎
17:15
|
(85) Вынес вложенный запрос в отдельную временную таблицу. Итого пока стабильно выполняется 3 минуты. Это, конечно, медленнее 5 секунд, но быстрее 8 часов ) Итого если будет стабильно выполняться и дальше, то скорость устроит. Поля, по которым соединяется, вроде как проиндексированы.
|
|||
87
palsergeich
12.05.19
✎
17:17
|
(86) А, так это еще и вложенный запрос был?)
|
|||
88
H A D G E H O G s
12.05.19
✎
17:19
|
(86) 3 минуты - это жесть конечно
|
|||
89
H A D G E H O G s
12.05.19
✎
17:21
|
||||
90
rphosts
12.05.19
✎
17:26
|
(88) у него может ещё и базы не дообслуживались. У него и журнал и база на 1 диске и хз сколько там чего и как с базой в это время крутит-вертит. Короче трэш, содом и гоморра и лечить нужно по шагам, имхо.
|
|||
91
Tester
12.05.19
✎
17:27
|
(87) я в самом вначале прикладывал 1 запрос просто с соединениями, потом переделанный с подзапросом (оба выполнялись примерно одинаково). Сейчас попробовал вынести подзапрос в ВТ - пока мониторю.
(88) а что тут такого, если это не бухия на 3 буха, а база 700 ГБ, в спр. Номенклатура 500 тысяч элементов и РИБ > 20 узлов? :) |
|||
92
rphosts
12.05.19
✎
17:31
|
(86) если ты пишешь во временные таблицы то это твоя обязанность создать индексы для них а не вроде хз кого. Но делать замер времени т.к. как ни странно может только ухудшить (такое бывает).
Из (51) видно, что составные поля есть... там точно к 1 типу не сводится? Но это делать вторым шагом когда закончишь с индексами. |
|||
93
palsergeich
12.05.19
✎
17:33
|
(91) Номенклатура 500 тысяч элементов это не так много, в крупных СЦ в год больше миллиона новой номенклатуры вводится и 20 узлов РИБ тоже, они на запрос прямо никак не влияют.
А из 700 ГБ 650 могут оказаться прикрепленными файлами |
|||
94
rphosts
12.05.19
✎
17:35
|
(91) 700 ничё, но если структура продумана, то не на много хуже чем 200 например... у тебя-же наверняка старые записи прошлых лет в первую очередь?
500 тыс и 20+ узлов? у меня есть базы и покруче чем 500 тыс и 20+филиалов и онлайн. Тут не в том вопрос. Стоп!!! у тебя 700Гб и журнал и база на 1 диске? Что за жпо? и для темпов нет своего ССД? А бэкапы не на том-же диске хранишь? |
|||
95
H A D G E H O G s
12.05.19
✎
17:35
|
(91) У тебя в результат запроса выводится 500 кзаписей? Если нет - то это - треш.
|
|||
96
H A D G E H O G s
12.05.19
✎
17:39
|
typical day of 700 Gb database.
Haha, classic http://itd0.mycdn.me/image?id=868876644159&t=20&plc=WEB&tkn=*gqqXZFgKRgR_80NlfufisFRXSRg |
|||
97
Tester
12.05.19
✎
17:40
|
(93) Про 650 ГБ файлов из 700 ГБ - это классная шутка :) Но к сожалению все 700 ГБ - это гребаные нужные данные :(
(94) К сожалению все на 1 физическом диске/массиве - и журнал и база и tempdb. Бэкапы на внешний nas делаются. |
|||
98
Tester
12.05.19
✎
17:41
|
(95) Да, около того.
|
|||
99
H A D G E H O G s
12.05.19
✎
17:45
|
||||
100
rphosts
12.05.19
✎
17:48
|
(99)тоже любопытно?
|
|||
101
H A D G E H O G s
12.05.19
✎
17:50
|
(100) Ставлю на mdop=0
|
|||
102
H A D G E H O G s
12.05.19
✎
17:50
|
Ну или на tablespool
|
|||
103
rphosts
12.05.19
✎
17:53
|
(101) нууу, ну вряд-ли тут параллельность так всё ломает.
(102) это вероятнее, но хз, хотя 1 диск на всё... Автор, а там диск или хотя-бы какой рэйд-массив? |
|||
104
Tester
12.05.19
✎
17:54
|
(99) уже отловил.
План: https://a.radikal.ru/a10/1905/b5/216b5d3d91b7.png Запрос: INSERT INTO #tt246 WITH(TABLOCK) (_Q_000_F_000RRef, _Q_000_F_001RRef, _Q_000_F_002_TYPE, _Q_000_F_002_RTRef, _Q_000_F_002_RRRef, _Q_000_F_003_TYPE, _Q_000_F_003_RTRef, _Q_000_F_003_RRRef, _Q_000_F_004RRef, _Q_000_F_005RRef) SELECT DISTINCT T1._Q_000_F_000RRef, T2._Q_000_F_001RRef, T1._Q_000_F_001_TYPE, T1._Q_000_F_001_RTRef, T1._Q_000_F_001_RRRef, T3._Q_000_F_001_TYPE, T3._Q_000_F_001_RTRef, T3._Q_000_F_001_RRRef, T1._Q_000_F_002RRef, T4._Q_000_F_001RRef FROM #tt8 T1 WITH(NOLOCK) INNER JOIN #tt55 T2 WITH(NOLOCK) ON (T2._Q_000_F_000RRef = T1._Q_000_F_000RRef) INNER JOIN #tt53 T3 WITH(NOLOCK) ON (T3._Q_000_F_000_TYPE = T1._Q_000_F_001_TYPE AND T3._Q_000_F_000_RTRef = T1._Q_000_F_001_RTRef AND T3._Q_000_F_000_RRRef = T1._Q_000_F_001_RRRef) INNER JOIN #tt47 T4 WITH(NOLOCK) ON (T4._Q_000_F_000RRef = T1._Q_000_F_002RRef) |
|||
105
rphosts
12.05.19
✎
17:55
|
+ (103) скорее всего классика: старая статистика, большое расхождение между прогнозом и фактом и соответственно не тот способ соединения
|
|||
106
rphosts
12.05.19
✎
17:55
|
(104) и есть 100500 способов его выполнения (ака планов выполнения этого самого запроса)
|
|||
107
H A D G E H O G s
12.05.19
✎
17:56
|
(104) mdop=0
|
|||
108
H A D G E H O G s
12.05.19
✎
17:57
|
||||
109
Tester
12.05.19
✎
18:02
|
Max Degree of Parallelism = 0
|
|||
110
H A D G E H O G s
12.05.19
✎
18:03
|
(109) Ставь =1, перезагружай SQL (но не уверен, что необходимо) и пробуй заново
|
|||
111
Провинциальный 1сник
12.05.19
✎
18:08
|
(30) "а вообще засады в 8 часов с запросом - это обычно не чисто софтовая проблема, чаще всего это проблема ухода ОЗУ в своп"
С временными таблицами размером в единицы мегабайт? Какой тут своп. Тут нестедлуп в чистом виде. И бороться надо именно с ним. |
|||
112
vde69
12.05.19
✎
18:10
|
(110) при смене паралелизма требуется перезапуск службы
|
|||
113
vde69
12.05.19
✎
18:13
|
из (104) видно, что довольно много времени занимает сортировка, а всего плана и не видно....
|
|||
114
H A D G E H O G s
12.05.19
✎
18:13
|
(112) Не надо. Вот только что попробовал у себя.
|
|||
115
H A D G E H O G s
12.05.19
✎
18:14
|
(113) Вставка в ВТ там половину времени.
|
|||
116
Tester
12.05.19
✎
18:18
|
Ай, короче забейте пока. Этот запрос возвращает 85 млн строк :)
|
|||
117
H A D G E H O G s
12.05.19
✎
18:20
|
(116) зачем тебе столько?
|
|||
118
vde69
12.05.19
✎
18:23
|
(91) имено это я и предлогал....
заодно в вынесеном запросе второй джойн поставь третьим (где составной тип). а вообще можно было-бы лучше спрогнозировать если ты в этом запросе дашь примерный результат по количеству основная + первый ждойн основная + второй джойн основная + третий джойн на основании этого можно подумать как именно собирать результат. и еще в SQL есть понятие что-то вроде плотности индекса (как точно не помню), в краце это некое отношение показывающее эффективность выборки, короче опиши для тех полей по которым джойнится сколько в среднем одинаковых значений в полях которые индексируешь, и примерное соотношение соеднинения например на 1000 записей основной таблицы есть 10 записей вспомогательной, при этом соответсвий всего 2 (два уникальных значения, но записей отбираем 10), при этом мы должны понимать, что в результат попадет не 10 записей а немного больше :), собственно я скорее ставку в сабже сделаю именно на этот вариант..... (так сказать неявное умножение) |
|||
119
vde69
12.05.19
✎
18:25
|
(116) судя по всему я в (118) прав :)
|
|||
120
vde69
12.05.19
✎
18:30
|
а стабильность в 3 минуты ты получил по тому, что ВТ неяным образом удаляет дубли, то есть потратил время на удаление из этих 67 лямов почти всего :)
|
|||
121
rphosts
12.05.19
✎
18:31
|
(109) МЛЯ!!!!
|
|||
122
vde69
12.05.19
✎
18:31
|
кстати вопрос Дмитрию:
при создании ВТ удаляются дубли или происходит свертка? |
|||
123
rphosts
12.05.19
✎
18:33
|
(122) только если создаешь с гроупбай или с безповторяющихся. просто так только кошки....
|
|||
124
rphosts
12.05.19
✎
18:34
|
+ (121) настраивавшему сервер по рукам линейкой... металлической!
|
|||
125
rphosts
12.05.19
✎
18:34
|
+ (123) хотя у Димы может другая версия
|
|||
126
H A D G E H O G s
12.05.19
✎
18:36
|
(122) Ниче не удаляется и не свертывается, что отправилось в ВТ, то и будет в ВТ.
|
|||
127
H A D G E H O G s
12.05.19
✎
18:39
|
(124) Я пока не видел ни одного клиента, у которого был бы настроен SQL полностью по заветам ИТС.
|
|||
128
rphosts
12.05.19
✎
18:42
|
(127) у меня настроено... кое что не гуманно к лиц, но чуть-чуть, но там по другому никак.... ибо что за хрень местами в 1С (например покури внешние источники если субд не сиквел)
|
|||
129
vde69
12.05.19
✎
18:54
|
по поводу составных типов:
мы видели, что составной тип в сабже был оттранслирован в условие с несколькими или, а теперь читаем ИТС https://its.1c.ru/db/content/metod8dev/src/developers/scalability/standards/i8105842.htm?_=1557240526#or Использование логического ИЛИ в условиях Рекомендации Использование логического ИЛИ в секции ГДЕ запроса Не следует использовать ИЛИ в секции ГДЕ запроса. Это может привести к тому, что СУБД не сможет использовать индексы таблиц и будет выполнять сканирование, что увеличит время работы запроса и вероянтность возникновения блокировок. Вместо этого следует разбить один запрос на несколько и объединить результаты. Например, запрос ВЫБРАТЬ Товар.Наименование ИЗ Справочник.Товары КАК Товар ГДЕ Артикул = "001" ИЛИ Артикул = "002" следует заменить на запрос ВЫБРАТЬ Товар.Наименование ИЗ Справочник.Товары КАК Товар ГДЕ Артикул = "001" |ОБЪЕДИНИТЬ ВСЕ |ВЫБРАТЬ Товар.Наименование ИЗ Справочник.Товары КАК Товар ГДЕ Артикул = "002" |
|||
130
Tester
12.05.19
✎
19:50
|
(129) спс, с этим сталкивался лично. Разница в скорости выполнения отличалась в разы.
|
|||
131
nicxxx
13.05.19
✎
05:18
|
(32) Ты серьезно???
https://docs.microsoft.com/ru-ru/sql/t-sql/queries/search-condition-transact-sql?view=sql-server-2017 "Порядок выполнения логических операторов может меняться в зависимости от настроек оптимизатора запросов." |
|||
132
zwolf
13.05.19
✎
06:45
|
(131) Он пытается рассказать о двух вещах сразу - о селективности индекса в зависимости от порядка его полей и о покрывающих индексах. Ну, как может (:
|
|||
133
nicxxx
20.05.19
✎
17:42
|
Вот, нашел где важен порядок. Table hint INDEX(). "The order of the indexes in the index hint is significant." (https://docs.microsoft.com/en-us/sql/t-sql/queries/hints-transact-sql-table?view=sql-server-2017)
|
|||
134
rphosts
20.05.19
✎
18:58
|
(133) из 1С нет возможности передать подсказку оптимизатору.
|
|||
135
H A D G E H O G s
20.05.19
✎
19:01
|
(129) Хороший пример, когда разбивать на несколько запросов по ИЛИ бессмысленно.
|
|||
136
nicxxx
21.05.19
✎
05:54
|
(134) Это лишь ответ на странную фразу vde69 про порядок условий в секции WHERE.
|
|||
137
Nikoss
21.05.19
✎
14:45
|
(135) зачем тогда этот пример написан в ИТС?
|
|||
138
nicxxx
24.05.19
✎
11:15
|
(137) Затем, что это всего лишь пример. Когда структура отбора будет чуть сложней, чем (Артикул = "001" ИЛИ Артикул = "002"), тогда UNION ALL может очень пригодиться. Например, если у тебя там составное поле из нескольких документов, миллион строк и разброс данных очень значительный, а надо найди десяток документов двух видов. Через "ИЛИ" индекс скан будет длиться 60 секунд, а index seek + UNION ALL - 2 секунды.
|
|||
139
Tester
29.05.19
✎
14:39
|
В общем решил проблему переписыванием запроса.
Доказательств, к сожалению, что SQL Server действительно строил неоптимальный план найти не удалось, т.к. подвисания были в нескольких процентах случаев, а в остальных запрос выполнялся пару секунд. Помог вынос результата части запроса во временные таблицы. Оборачивание в подзапрос несколько улучшало ситуацию (подвисания были реже), но все равно были. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |