|
Использование "ИЛИ" в условии запроса. | ☑ | ||
---|---|---|---|---|
0
Goggy
25.02.15
✎
12:10
|
Простенький вопросик для знатоков от зрителей :)
Почему настоятельно не рекомендуется использовать оператор ИЛИ в условии запроса? |
|||
62
H A D G E H O G s
25.02.15
✎
13:45
|
(61) Сходил на семинар и все можно?
Что этот 1Снег себе позволяет? |
|||
63
samozvanec
25.02.15
✎
13:51
|
(62) для тех кто не ходил на семинар, а что там у нас с кешированием в (57)?
|
|||
64
Ник второй
25.02.15
✎
13:55
|
Запрос с простым И
"result (cost=0.00..4.08 rows=1 width=19) (actual time=0.000..0.000 rows=0 loops=1) one-time filter: false -> index only scan using _docum10341_bydocnum_sr on Документ.XXXXXXXXXX t1 (cost=0.00..4.08 rows=1 width=19) (never executed) index cond: (Номер = '000000011'::mvarchar) heap fetches: 0 total runtime: 0.018 ms " "limit (cost=0.00..4.09 rows=1 width=0) (actual time=0.023..0.023 rows=0 loops=1) -> index scan using pg_class_relname_nsp_index on pg_class (cost=0.00..4.09 rows=1 width=0) (actual time=0.022..0.022 rows=0 loops=1) index cond: (relname = 'tt82'::name) filter: (pg_table_is_visible(oid) and (relkind = 'r'::""char"")) total runtime: 0.040 ms " Вместо И установил ИЛИ "bitmap heap scan on Документ.XXXXXXXXXX t1 (cost=4.15..8.11 rows=2 width=19) (actual time=1.536..1.539 rows=2 loops=1) recheck cond: ((Номер = '000000011'::mvarchar) or (Номер = '000000010'::mvarchar)) -> bitmapor (cost=4.15..4.15 rows=2 width=0) (actual time=1.530..1.530 rows=0 loops=1) -> bitmap index scan on _docum10341_bydocnum_sr (cost=0.00..2.07 rows=1 width=0) (actual time=1.517..1.517 rows=1 loops=1) index cond: (Номер = '000000011'::mvarchar) -> bitmap index scan on _docum10341_bydocnum_sr (cost=0.00..2.07 rows=1 width=0) (actual time=0.012..0.012 rows=1 loops=1) index cond: (Номер = '000000010'::mvarchar) total runtime: 1.560 ms " "limit (cost=2.10..9.61 rows=1 width=0) (actual time=0.037..0.037 rows=0 loops=1) -> bitmap heap scan on pg_class (cost=2.10..9.61 rows=1 width=0) (actual time=0.036..0.036 rows=0 loops=1) recheck cond: (relname = 'tt35'::name) filter: (pg_table_is_visible(oid) and (relkind = 'r'::""char"")) rows removed by filter: 2 -> bitmap index scan on pg_class_relname_nsp_index (cost=0.00..2.10 rows=4 width=0) (actual time=0.010..0.010 rows=7 loops=1) index cond: (relname = 'tt35'::name) total runtime: 0.054 ms " |
|||
65
H A D G E H O G s
25.02.15
✎
13:58
|
(64) Еретический план запроса.
Тебя надо предать анафеме. |
|||
66
Ник второй
25.02.15
✎
13:59
|
А вот объединить все
"result (cost=0.00..8.15 rows=2 width=19) (actual time=0.040..0.051 rows=2 loops=1) -> append (cost=0.00..8.15 rows=2 width=19) (actual time=0.040..0.051 rows=2 loops=1) -> index only scan using _docum10341_bydocnum_sr on Документ.ХХХХХХХХХХ t1 (cost=0.00..4.08 rows=1 width=19) (actual time=0.039..0.039 rows=1 loops=1) index cond: (Номер = '000000011'::mvarchar) heap fetches: 1 -> index only scan using _docum10341_bydocnum_sr on Документ.ХХХХХХХХХХ t2 (cost=0.00..4.08 rows=1 width=19) (actual time=0.010..0.010 rows=1 loops=1) index cond: (Номер = '000000010'::mvarchar) heap fetches: 1 total runtime: 0.079 ms " |
|||
67
Ник второй
25.02.15
✎
14:01
|
(66) Не сложно заметить, что второй запрос работает чутка лучше )))
|
|||
68
Ник второй
25.02.15
✎
14:03
|
(65) у меня еще пачка логинов в запасе ))) пффффф
|
|||
69
H A D G E H O G s
25.02.15
✎
14:04
|
(66) Я правильно вижу indexscan в нем?
|
|||
70
Ник второй
25.02.15
✎
14:08
|
Index Scan — используется индекс для условий WHERE, читает таблицу при отборе строк.
Bitmap Index Scan — сначала Index Scan, затем контроль выборки по таблице. Эффективно для большого количества строк. как я понимаю, в постгре чуть по другому идет работа с индексами |
|||
71
Ник второй
25.02.15
✎
14:08
|
(70)
Index Only Scan выполняется быстрее, чем Index Scan за счёт того, что не требуется читать строку таблицы полностью |
|||
72
H A D G E H O G s
25.02.15
✎
14:13
|
(70) (71) В сортах мммм. Постгрии не разбираюсь :-)
|
|||
73
ShoGUN
25.02.15
✎
14:24
|
(72) Ну зря ты так, из бесплатных СУБД, пожалуй, лучшая. То, что 1С её мучает - это проблема заточенности 1С под MS SQL Server(уже говорили в этой ветке).
|
|||
74
Ник второй
25.02.15
✎
14:24
|
Так выглядит не попадание в индекс, то есть дырка в индексах:
"aggregate (cost=4.08..4.08 rows=1 width=19) (actual time=0.035..0.035 rows=1 loops=1) -> index scan using _docum10341_bydocnum_sr on Документ.ХХХХХХХХХХ t1 (cost=0.00..4.08 rows=1 width=19) (actual time=0.022..0.025 rows=1 loops=1) index cond: (Номер = '000082891'::mvarchar) filter: (СтруктурнаяЕдиница = '\\x5d9a0007e932f60411e163a8025e9964'::bytea) total runtime: 0.073 ms " то есть надо обращать внимание на постгре что бы было слово index cond и не было filter... в майстайном сервере это seek ..... where |
|||
75
Ник второй
25.02.15
✎
14:26
|
(72) Пока тоже не разбираюсь, но вот пришлось сталкнуться... даже пришлось собиратель плана запроса от 1С доработать, так как вся линейка продуктов 1С заточена на Win... А с линуксом отказывается работать
|
|||
76
Ник второй
25.02.15
✎
14:29
|
(73) Вполне добротно работает.... если бы не подножки , которые 1С подстроила, а именно отсутствие инструментария если субд расположена на линуксах
|
|||
77
ShoGUN
25.02.15
✎
14:42
|
(76) Ну кабы не работало - никто бы не пользовался )
|
|||
78
vhl
25.02.15
✎
16:14
|
(9) Да чепуха все это, к этим советам надо всегда относиться с известной долей скептицизма и проверять на реальных данных. Те советы писались в махровые 2000 годы такими же "спецами" как вы сами.
|
|||
79
PR
25.02.15
✎
16:55
|
(47) Что нет?
|
|||
80
PR
25.02.15
✎
16:56
|
(52) Приведи годный пример/
|
|||
81
H A D G E H O G s
25.02.15
✎
17:04
|
(80) см. (41) (42)
|
|||
82
DirecTwiX
25.02.15
✎
17:56
|
У меня пару раз возникал следующий вопрос..
Что будет со временем выполнения запроса, если условие с ИЛИ заменить на условие с И? ГДЕ А ИЛИ Б -> ГДЕ НЕ ((НЕ А) И (НЕ Б)) Есть знатоки? |
|||
83
Гёдза
25.02.15
✎
17:59
|
(82) тоже самое
|
|||
84
DirecTwiX
25.02.15
✎
18:27
|
(83) Из-за оптимизатора запроса, который заменит ИЛИ на И?
|
|||
85
1976vas
25.02.15
✎
18:38
|
Битва гигантов, если честно очень познавательно. А вопрос (82) вообще +100500
|
|||
86
tridog
25.02.15
✎
20:10
|
(44) Только иногда этой причиной является timeout.
|
|||
87
MrStomak
25.02.15
✎
20:26
|
(44) В мире нет ничего ВНЕЗАПНОГО. Даже генератор случайных чисел генерирует не случайные числа и вообще вселенная детермеринована.
Однако, когда postgresql выбирает план, выполняющий запрос 30 минут,тогда как 5 лет до этого стабильно выбирал план, выполняющий запрос за 3 секунды - это почему-то оказывается ВНЕЗАПНО |
|||
88
Икогнито
25.02.15
✎
20:27
|
(82) условие НЕ В (&Массив)
|
|||
89
Икогнито
25.02.15
✎
20:30
|
Чтобы не париться с планом запроса по условию ИЛИ, можно выбрать данные в временную таблицу, проиндексировать нужные поля, а потом фильтрануть ее.
|
|||
90
MrStomak
25.02.15
✎
20:31
|
(84) Ну представь себе телефонный справочник, представь, что надо выбрать всех не Ивановых и не Сергеев. Придется перебирать весь справочник фактически. Исключением будут являтся разве что логические типы, где НЕ вернет конкретное значение, которое можно сравнить на эквивалентность и использовать индекс по нему.
|
|||
91
MrStomak
25.02.15
✎
20:33
|
(89) Чтобы не париться с поиском организаций, у которых ИНН заканчивается на 351, я предлагаю переписать из справочника к себе в тетрадочку только те организации, у которых ИНН заканчивается на 351!!!
|
|||
92
Икогнито
25.02.15
✎
20:35
|
Еще можно обойти ИЛИ с помощью CASE When Then.
Скульщики говорят, что утверждение, что Case работает не используя индексы - лживое. |
|||
93
MrStomak
25.02.15
✎
20:36
|
(92) Утверждение, что ИЛИ не использует индексы - тоже лживое.
|
|||
94
Икогнито
25.02.15
✎
20:38
|
(93) глубоко не знаю, но думаю, что построение плана запроса зависит от очень многих факторов. Начиная от собственной статистики скуля по обращению к таблицам и заканчивая их объемами, индексами и прочим.
|
|||
95
H A D G E H O G s
25.02.15
✎
20:40
|
(91) Прекрасно!
|
|||
96
H A D G E H O G s
25.02.15
✎
20:40
|
совет (89) прекрасно иллюстрирует всю сущщность "специалистов".
|
|||
97
Икогнито
25.02.15
✎
20:40
|
Сегодня с таблицей мало работают - план запроса один, завтра куча народу строит отчеты по таблице - план запроса другой.
|
|||
98
H A D G E H O G s
25.02.15
✎
20:41
|
(97) Бред.
|
|||
99
MrStomak
25.02.15
✎
20:42
|
(94) у скуля нет статистики по обращению к таблицам. Есть гистограммы распределения значений индексов, показывающая селективность запроса. Собственно, это и называется статистикой.
|
|||
100
Икогнито
25.02.15
✎
20:42
|
(96) (98) не буду спорить. Оставайся при своем мнении.
|
|||
101
H A D G E H O G s
25.02.15
✎
20:42
|
(94) План запроса зависит от незначительного числа факторов.
|
|||
102
MrStomak
25.02.15
✎
20:45
|
(101) Но эти незначительные факторы могут выливаться в сложные системы, в которых черт ногу сломит и сам оптимизатор забивает, потому что не успевает ниче придумать, и отдаёт всякую хрень.
|
|||
103
Икогнито
25.02.15
✎
20:45
|
(101) это многое объясняет
|
|||
104
H A D G E H O G s
25.02.15
✎
20:45
|
(99) Ты счаст ему ничего не сказал.
Надо показать табличку статистики и сказать, что для значения из этого диапазона будет выбрано примерно столько то X записей из всего объема Y. Ну и показать запросы по полной выборке из всех таблиц при Update statistics with fullscan |
|||
105
MrStomak
25.02.15
✎
20:47
|
(104) Согласен, однако задачи обучить кого-то не стоит.
|
|||
106
DirecTwiX
25.02.15
✎
20:54
|
(90) >Придется перебирать весь справочник фактически
Т.е. про индексы при таком раскладе можно забыть? |
|||
107
MrStomak
25.02.15
✎
20:57
|
(106) Если поле логического типа - нет. В остальных случаях - да. Умение быстро найти в куче нужный тебе элемент ничерта не помогает, когда тебе как раз он то и не нужен.
< или > позволяет гарантированно определить диапазоны с ненужными данными и отсечь их. а <>.... |
|||
108
MrStomak
25.02.15
✎
21:04
|
(107) Ну и еще оговорюсь - все эти мои пассажи относятся не к НЕ, а к имено к <>, который зачастую там получается в итоге
|
|||
109
Икогнито
25.02.15
✎
21:31
|
(106) раз тебе ивановых часто искать надо и их номера, то может механизм полнотекстового поиска тебе поможет в этом?
|
|||
110
MrStomak
25.02.15
✎
21:49
|
(109) Будь внимательнее - речь шла про подмену ИЛИ из конструкций НЕ и И
|
|||
111
viraboy
25.02.15
✎
21:57
|
я бы предложил товарищу в (0) почитать соответствующую литературу, но как, и многие тут, не хочу плодить дешевых и бестолковых конкурентов.
|
|||
112
pescennius
25.02.15
✎
22:10
|
(111) Тот которые пытается что то познать дешевым и бестолковым не будет.
|
|||
113
Икогнито
25.02.15
✎
22:12
|
(110) Без ИЛИ всегда можно обойтись, как и без Полного Внешнего Соединения. Есть масса вариантов и они уже описаны выше.
По своему опыту использую эти вещи крайне редко. |
|||
114
pescennius
25.02.15
✎
22:14
|
(113) Правильно , ИЛИ можно заменить на объединить все.
|
|||
115
Икогнито
25.02.15
✎
22:16
|
(112) очень много ложных знаний и пафосных советчиков, владеющих ими, которые и не знания вовсе.
Хочешь что-то познать - надо читать авторитетную литературу. |
|||
116
pescennius
25.02.15
✎
22:22
|
(115) Советчиков тоже надо слушать, они подталкиваю в верное направление. Ну и конечно книги и конечно самим потрогать...
|
|||
117
Икогнито
25.02.15
✎
22:22
|
:)
|
|||
118
H A D G E H O G s
25.02.15
✎
22:26
|
(109) Механизм полнотекстового поиска - этот ровно тот же механизм индексов, который строит индексы для всех подстрок строки.
Тоесть, есть у нас строка "Индианаполис" обычный индексный поиск построит для нее индекс для значения "Индианаполиc" Этот индекс будет использоваться для условия вида ПОДОБНО "Индиана%" но не для условий ПОДОБНО "%полис" Полнотекстовый индекс построит 100500 индексов, в т.ч. для слова "полис" и в случае поиска по условию ПОДОБНО "%полис" будет использован. Но для обновления данных индексов нужно 100500 времени, поэтому это нечастый процесс. |
|||
119
Ненавижу 1С
гуру
25.02.15
✎
22:38
|
(118) чем я тебя зацепил то?
|
|||
120
Икогнито
25.02.15
✎
22:38
|
(118) есть два индекса в механизме : основной - он долго строится и дополнительный.
Основной самый быстрый, формируется периодически регламентным заданием , а дополнительный - это медленный индекс, в него попадает оперативная информация. Поиск осуществляется сначала в основном, потом в дополнительном. Так называемое обновление данных - это слияние индексов с целью освобождения дополнительного. http://www.vnedriupp.ru/index.php?content=8301 |
|||
121
Икогнито
25.02.15
✎
22:43
|
Полнотекстовый поиск - очень удобная фишка, если нужно выискивать всякий мусор.
Но, мля, встает проблема с отображением информации, которую другие видеть Не должны. |
|||
122
MrStomak
25.02.15
✎
22:50
|
(115) Если бы ты сам читал - не писал бы всякого бреда.
|
|||
123
Икогнито
25.02.15
✎
22:52
|
(122) закусывай
|
|||
124
Икогнито
25.02.15
✎
22:55
|
(122) я, мля одинесом 14 лет занимаюсь. И добуя советчиков читал, которые сидят тут чтобы повыпендриваться
|
|||
125
H A D G E H O G s
25.02.15
✎
22:57
|
(124) Это печально.
|
|||
126
H A D G E H O G s
25.02.15
✎
22:58
|
(120) Это прекрасная статья. Которая не рассказывает про физику процесса. Физика остается черным ящиком.
|
|||
127
Икогнито
25.02.15
✎
23:01
|
(125) уже говорили как-то, что красота кода - это для убеленных сединами старцев. Которые не имеют вала задач и имеют много времени для медитаций.
|
|||
128
H A D G E H O G s
25.02.15
✎
23:03
|
(119) Ничем.
Ты просто забавный со своим ООП, null и, как оказалось, невежеством. |
|||
129
H A D G E H O G s
25.02.15
✎
23:05
|
(127) Годный кот пишут фикси. Ибо они планируют с ним же работать. Кот "наотщепись" пишут фри-фра. Ибо "траванерасти".
Все просто. |
|||
130
H A D G E H O G s
25.02.15
✎
23:07
|
(127) Это печально - это к 14 годам.
К 14 годам занятий 1С-ом нужно разбираться во ВСЕМ. |
|||
131
H A D G E H O G s
25.02.15
✎
23:09
|
До недавнего времени я тоже щитал, что хорошо знаю 1С и инф. системы и они просты как молоток. Как оказалось - 1С - дочерта сложная штука и требует от прогера дозвизды знаний. Просто 95% прогеров об этом не знают.
|
|||
132
Икогнито
25.02.15
✎
23:09
|
(129) завидую тебе, есть время на медитации и вникание в физику процессов...
|
|||
133
H A D G E H O G s
25.02.15
✎
23:09
|
(132) Лучше день потерять, потом за 5 минут долететь.
|
|||
134
Икогнито
25.02.15
✎
23:11
|
(133) ответь мне на вопрос один.
Ты сидишь наверно начальником, ковыряешься в носу и имеешь массу свободного Времени чтобы сидеть на мисте и с высоты своего положения троллить обычных работяг? |
|||
135
H A D G E H O G s
25.02.15
✎
23:17
|
(134) Ну, юридически я простой программист.
В мисту погружен, но не критично. Время есть, потому что: 1) Быстро и без ошибок пишу в своих конфах. 2) Часто работаю дома, по ночам, над несложными/интересными задачами. |
|||
136
H A D G E H O G s
25.02.15
✎
23:18
|
(134) Троллить невежественных 1Сников считаю за долг, невежественные 1Сники бросают тень на блистательный образ автоматизаторов Отечества.
|
|||
137
ShoGUN
25.02.15
✎
23:19
|
(136) Брось, у тебя мания величия :) Троллить и без тебя есть кому.
|
|||
138
GedKo
25.02.15
✎
23:19
|
(133) +1
даже больше, лучше один раз и неделю потерять - зато потом некоторое время быстро знать как правильно. |
|||
139
H A D G E H O G s
25.02.15
✎
23:21
|
(137) Не мешай троллить :-)
|
|||
140
Икогнито
25.02.15
✎
23:22
|
(135) работаю на такой работе, где 60% процентов задач надо по 2-3 раза переделывать. Потому, что постановшику задач глубоко пофигу на то, сколько раз будет переделываться работа, а Заказчик сам часто не знает что ему нужно и связи с ним нет.
Если в такой ситуации изучать индексы, ковыряться в носу и медитировать, то обычный отчет будешь делать месяц. |
|||
141
ShoGUN
25.02.15
✎
23:25
|
(140) Ты вроде тут пытался выпендриться знаниями, а теперь оправдываешься, что времени нет, а потому нет и знаний. Ну ок, но обычно в такой ситуации умные люди слушают и вопросы задают, полезней выходит.
|
|||
142
H A D G E H O G s
25.02.15
✎
23:26
|
"Если в такой ситуации изучать индексы, ковыряться в носу и медитировать, то обычный отчет будешь делать месяц"
Нет. Раз 5 заставь себя прогнать свеженаписанный отчет через профайлер, поправь правильно - потом автоматом будешь прикидывать. как правильно писать. Но все равно через профайлер всегда прогонять надо. Твой отчет неспешно выполниться и пользователя вполне устроит, при этом забьет кэш и нагрузит диск и проц для других юзеров. Мелочь, но когда такие отчеты будут везде... |
|||
143
Икогнито
25.02.15
✎
23:30
|
(141) знаний у меня достаточно для решения задач, которые ставит передо мной работодатель. Это подтверждает мой успешный стаж работы этой области в течении 14 лет.
А то, что вы тут сидите и троллите, говорит о том, что тут тусит масса скучающих бездельников, которые нифига толкового не делают и от безделья трассируют каждый запрос в скуле и теоретизирующих о высших материях там, где их нет. |
|||
144
H A D G E H O G s
25.02.15
✎
23:31
|
Че тут думать, тут прыгать надо...
|
|||
145
ShoGUN
25.02.15
✎
23:33
|
(143) Ну как бы у меня тоже 10 лет опыта, и что с того? Я точно знаю, что я многого не знаю, но стремлюсь это устранить. Гонор ещё никому не помогал.
|
|||
146
Икогнито
25.02.15
✎
23:34
|
(145) сколько помню хадгенога на мисте - вечно в душу нагадить желает.
|
|||
147
H A D G E H O G s
25.02.15
✎
23:34
|
В этом году мне будет 9 лет :-0
|
|||
148
Икогнито
25.02.15
✎
23:34
|
А помню его почти с основания мисты
|
|||
149
H A D G E H O G s
25.02.15
✎
23:35
|
** помнят! чертяки!
|
|||
150
GedKo
25.02.15
✎
23:36
|
(143) чтобы обслуживать/дописывать базу ларька конечно же ничего особого не нужно :)
|
|||
151
Икогнито
25.02.15
✎
23:38
|
(150) я бы твою базу ларька дописывал красиво. Там делать некуй и переписывать код по пять раз не надо.
|
|||
152
ShoGUN
25.02.15
✎
23:39
|
(151) Я не понял, ты гордишься, что код по 5 раз переписываешь?
|
|||
153
H A D G E H O G s
25.02.15
✎
23:39
|
Я основной код наших доработок, оставшихся за предыдущими прогами (связаный с проведением РТУ) переписывал раза 3. Каждый раз считая, что вышла мммм, конфетка.
|
|||
154
GedKo
25.02.15
✎
23:41
|
(151) у меня нет базы ларька :( но, тебе бы доверил :)
|
|||
155
Икогнито
25.02.15
✎
23:43
|
(152) есть такая работа, платят от 200 тыр. Но главное условие: будь готов выкинуть в мусорку результат недельной работы и стараний и начать заново.
|
|||
156
ShoGUN
25.02.15
✎
23:44
|
(155) Депутат?
|
|||
157
H A D G E H O G s
25.02.15
✎
23:56
|
Диллема...
Продать совесть за 200 тыр. Встречайте новый роман Д. Донцовой "Последнее искушение 1Сника", "Продажный код", "Черный властелин 1С. Годы молодости". |
|||
158
К_Дач
26.02.15
✎
00:15
|
вот жеж... вон оно че, Михалыч! надо видимо, брать толстую книжку по sql и читаааать....
так в итоге то как лучше сложные условия использовать в "ГДЕ.."? Вот еще что меня всегда волновало в условиях запроса. Есть выражение А ИЛИ Б. Причем мы заранее знаем, что А верно в 99 процентов случаев, а Б только в 1 проценте. Я верно понимаю, что порядок логических выражений имеет роль и "А ИЛИ Б" отработает быстрее, чем "Б ИЛИ А" ??? |
|||
159
viktor_vv
26.02.15
✎
01:00
|
(158) нет, порядок написания не важен.
|
|||
160
Сти
26.02.15
✎
08:15
|
(159) уточнение - в большинстве случаев не важен, планировщик запроса сам по своей статистике разберется, какое условие лучше проверить первым. Но иногда ошибается, и тогда лучше указать ему хинт. Но это на самом SQL, в 1С это никак не сделать, к сожалению.
(158) Книжку по SQL, конечно же, лучше почитать. Можно также MSDN по SQL серверу поизучать, документацию на postgre и т.п. Все это может помочь при написании запросов в 1С, хотя на SQL-сервер они порой приходят в таком изуродованном виде, что... Впрочем, разработчиков платформы трудно в этом винить, поскольку трансляция языка 1С-эскуэл в нормальный несколько нетривиальный процесс, как мне кажется. |
|||
161
Torquader
26.02.15
✎
19:51
|
Главное, чтобы после замены ИЛИ на объединение не получилось, что сервер выполняет вместо одного полного сканирования несколько.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |