|
Один и тот же запрос в разное время работает по-разному | ☑ | ||
---|---|---|---|---|
0
kabanoff
22.05.12
✎
14:25
|
База 90Гб, MS SQL Server 2005, 140 одновременных пользователей.
Ежедневно на сервере проводится апдейт статистики, еженедельно - перестройка индексов. Никак не могу вкурить: один и тот же простой запрос, который вчера работал - сегодня виснет намертво (приходится сбрасывать сеанс). Раньше причину удавалось найти - не отрабатывал апдейт статистики. Сейчас по логам SQL Server план обслуживания отработал корректно. Причем на копии базы, которая делается ежедневно, запрос отрабатывает успешно. Есть тут телепаты? Помогите! Сам запрос вот:
Первый подзапрос отрабатывает в рабочей базе 1,5-2 секунды. Второй подзапрос "повисает", хотя отдельный запрос к регистру "Контактная информация" отрабатывает за конечное время. |
|||
1
mikecool
22.05.12
✎
14:28
|
рестарт серверу 1с еще делай
|
|||
2
mikecool
22.05.12
✎
14:28
|
у меня обычная сличительная клала сервер
|
|||
3
kabanoff
22.05.12
✎
14:28
|
Предвещая вопросы к оптимизации запроса, уточню:
- ДатаОкончания - ресурс регистра ШапкаДСП; - Статус - ресурс регистра СтатусДСП; - Регистр сведений "КонтактнаяИнформация" непериодический, не подчиненный регистратору. |
|||
4
kabanoff
22.05.12
✎
14:30
|
(1) В воскресенье только перегружал.
Как часто рекомендуется это делать? |
|||
5
Никола_
Питерский 22.05.12
✎
14:30
|
А в тех. журнале что пишет последние строки ? на чем виснет ?
Да и платформа то какая ? |
|||
6
mikecool
22.05.12
✎
14:31
|
(4) я хз, когда начинали работать под постгри - каждую ночь, сейчас - по необходимости, когда полная ж.па наблюдается )
|
|||
7
Rovan
гуру
22.05.12
✎
14:32
|
(4) база 1С 60 Гб
1) делаем рестарт сервера 1С кажду ночь 2) тупняк с зависанием бух. отчетов 3 раза решали путем восстановлени БД из dt |
|||
8
andrey153
22.05.12
✎
14:32
|
(0), а прямой запрос такую выборку нормально делает?
|
|||
9
kabanoff
22.05.12
✎
14:34
|
(6) Вот вот, знакомая ситуация :) Полные ж0пы мы тоже периодически наблюдаем.
(5) Тех.журнал еще не смотрел. Щас настрою. Платформа 8.1.14.72. (да, такая старая, потому что мы распределенное звено в большой филиальной сети). |
|||
10
kabanoff
22.05.12
✎
14:37
|
(8) Не знаю, щас попробую.
|
|||
11
Buster007
22.05.12
✎
14:53
|
а почему нельзя это условие перенести в условие соединения?
КонтактнаяИнформация.Тип = ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.Телефон) |
|||
12
Buster007
22.05.12
✎
14:53
|
да и собственно второе условие туда же... )
|
|||
13
ILM
гуру
22.05.12
✎
14:55
|
А ПОДОБНО зачем такое? Одного типа телефон и условия NOT NULL не хватит?
И может у клиента телефонов куча? Перепишите запрос. Условия поменяйте. |
|||
14
Fragster
гуру
22.05.12
✎
14:57
|
получи срезу последних отдельными запросами, а потому уже эти временные таблицы соединяй
|
|||
15
Fragster
гуру
22.05.12
✎
14:59
|
а за такое ПОДОБНО надо руки рубить...
|
|||
16
Axel2009
22.05.12
✎
15:00
|
(0)
скока выдает запрос? ВЫБРАТЬ КОЛИЧЕСТВО(*) ИЗ РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация ПО ВТ_ИсходныеДанные.Контрагент = КонтактнаяИнформация.Объект ГДЕ КонтактнаяИнформация.Тип = ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.Телефон) |
|||
17
Лефмихалыч
22.05.12
✎
15:01
|
(0) Евгений, а соединение-то у тебя внутреннее. Условие из ГДЕ в соединение перенести пробовал?
(15) за те данные, которые ему в этот регистр складывают, надо бы вообще на кол сажать, однако те одержимые поленья еще и зарплату за них получать умудряются |
|||
18
Лефмихалыч
22.05.12
✎
15:02
|
ахёпт, оно ить и внатурально внутреннее. Может в левое переквалифицировать?.. хотя - бред
|
|||
19
Axel2009
22.05.12
✎
15:03
|
(18) так там что левое, что не левое. се равно во внутреннее если что.
|
|||
20
Fragster
гуру
22.05.12
✎
15:04
|
если сделать (14), то это реально поможет
|
|||
21
Axel2009
22.05.12
✎
15:04
|
(20) поможет второму запросу в пакете?
|
|||
22
TENSOR
22.05.12
✎
15:04
|
(0) а как узнали, что именно эта часть запроса подвисает?
|
|||
23
kabanoff
22.05.12
✎
15:05
|
(13) Особого эффекта нет, также виснет намертво.
Условие на представление необходимо, чтобы вычленить из общей массы телефонов телефоны с 10-ю цифрами для дальнейшего анализа regexp'ом (сотовые телефоны). (15) Ну а какие еще варианты? (16) 313503 записи |
|||
24
Axel2009
22.05.12
✎
15:05
|
(0) а если номер будет
а1б2в3г4д5е6ж7з8и9к0ы тоже считываем? |
|||
25
kabanoff
22.05.12
✎
15:05
|
(20) Щас попробую.
|
|||
26
Лефмихалыч
22.05.12
✎
15:06
|
(0) Капитан Очевидность утверждает, что если условие переписать так:
ВЫРАЗИТЬ(КонтактнаяИнформация.Представление КАК СТРОКА(20)) ПОДОБНО "%[0-9]%[0-9]%[0-9]%[0-9]%[0-9]%[0-9]%[0-9]%[0-9]%[0-9]%[0-9]%" то это может (хотя и не обязательно) облегчить жизнь серверу. Ты всё равно больше 20 символов ни где не используешь, зачем их вообще обрабатывать? (24) там дальше нереально хитрожопый механизм на регэкспах их этого говнища телефоны добывает. Так что ответ на твой вопрос - да, это тоже считываем. |
|||
27
Buster007
22.05.12
✎
15:06
|
а если убрать это условие И КонтактнаяИнформация.Представление ПОДОБНО "%[0-9]%[0-9]%[0-9]%[0-9]%[0-9]%[0-9]%[0-9]%[0-9]%[0-9]%[0-9]%" столько же будет выполняться?
|
|||
28
kabanoff
22.05.12
✎
15:07
|
(24) Да. Потом прогоняем через regexp с паттерном на сотовые телефоны. Такой номер не пройдет.
(22) Выполнил поэтапно в консоли запросов. |
|||
29
Axel2009
22.05.12
✎
15:08
|
(28) и сколько записей фильтруется?
|
|||
30
Fragster
гуру
22.05.12
✎
15:08
|
(17) а смысл этого отбора, если там КонтактнаяИнформация.Тип = ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.Телефон) ?
|
|||
31
kabanoff
22.05.12
✎
15:09
|
Бинго, пиляйт! Убрал условие "КонтактнаяИнформация.Представление ПОДОБНО" и запрос отработал за 2,5 секунды!
|
|||
32
Лефмихалыч
22.05.12
✎
15:10
|
(31) и чо ты терь с этим бинго делать будешь?
|
|||
33
kabanoff
22.05.12
✎
15:10
|
Условие "ВЫРАЗИТЬ(КонтактнаяИнформация.Представление КАК СТРОКА(20)) ПОДОБНО" тоже отрабатывает довольно шустро!
Осталось понять, то ли я тут дурак, то ли SQL Server меня таковым считает. |
|||
34
Buster007
22.05.12
✎
15:12
|
(31) ну так )) если условие на вид даже страшное, чего уж говорить про его быстродействие... )) может стоит обрубить возможность кривых номеров перед записью их в базу, а не при выборе?
|
|||
35
Лефмихалыч
22.05.12
✎
15:12
|
(31) мне тут прямо в голову пришло, что тебе надо перед записью телефона всю эту колбасу вертеть с регэкспами и проверкой на вхождение в диапазон сотовых и прочих номеров. Чтобы телефон в регистре был гарантированно правильным (например - совать его в отдельный ресурс, специально под эту цель сделанный).
|
|||
36
Лефмихалыч
22.05.12
✎
15:13
|
+(35) или даже телефон писать в Представление, а дополниельный ресурс должен быть булевским типа ПровереноЭлектроникой, чтобы Скайнет собирал только те записи, где проверено электроникой = истина
|
|||
37
ILM
гуру
22.05.12
✎
15:15
|
Опять ограничением являются мозги разработчика
|
|||
38
kabanoff
22.05.12
✎
15:16
|
Спасибо всем за помощь!)
(34)(35) Да, идея правильная, согласен. У меня даже задачка такая в мантисе висит с пометкой "Сделать когда-нибудь" :) (36) Тогда придется пожертвовать тонной записей с неправильными телефонами. Или преобразовать все такие телефоны в правильные. Во общем, взлетит только после тщательной обработки всех записей контактной информации regexp'ом :) Но все-таки хочу разобраться, почему оптимизатор запроса не справился с таким условием. |
|||
39
Лефмихалыч
22.05.12
✎
15:18
|
(38) толстая обработка регистра будет один раз. Это православно, пусть и долго.
А сервер с запросом не справляется потому, что Представление - неограниченная строка и соединение внутреннее. |
|||
40
ILM
гуру
22.05.12
✎
15:19
|
Ну как бы % говорит о любом количестве знаков, так что сначала была проверка с первого символа, потом со второго, потом с третьего и так далее и 10 раз подряд. Даже я устал писать этот пост.
|
|||
41
kabanoff
22.05.12
✎
15:20
|
(39)(40) Понятно, спасибо! :)
|
|||
42
Axel2009
22.05.12
✎
15:32
|
(39) что за нелюбовь к внутреннему соединению?
|
|||
43
ILM
гуру
22.05.12
✎
15:36
|
(42) Наверно когда учили били по рукам. Если признаться, то мне оно тоже не очень нравится, но хоть применять его не боюсь.
|
|||
44
Buster007
22.05.12
✎
15:37
|
(43) а тебе чем оно не нравится?)
|
|||
45
ILM
гуру
22.05.12
✎
15:47
|
Ну опасно хотя бы тем, что может быть меньше строк в результирующей таблице чем в главной таблице запроса. Ну и сразу не видно тех строк, у которых нет соответствия.
Просто, мне, как-то интуитивно непонятно, зачем брать только общую часть из таблиц. |
|||
46
ILM
гуру
22.05.12
✎
15:47
|
(45) + )))
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |