Имя: Пароль:
1C
1С v8
Один и тот же запрос в разное время работает по-разному
0 kabanoff
 
22.05.12
14:25
База 90Гб, MS SQL Server 2005, 140 одновременных пользователей.
Ежедневно на сервере проводится апдейт статистики, еженедельно - перестройка индексов.

Никак не могу вкурить: один и тот же простой запрос, который вчера работал - сегодня виснет намертво (приходится сбрасывать сеанс). Раньше причину удавалось найти - не отрабатывал апдейт статистики. Сейчас по логам SQL Server план обслуживания отработал корректно.

Причем на копии базы, которая делается ежедневно, запрос отрабатывает успешно.

Есть тут телепаты? Помогите!

Сам запрос вот:

ВЫБРАТЬ РАЗЛИЧНЫЕ
   ШапкаДСПСрезПоследних.Контрагент КАК Контрагент,
   ШапкаДСПСрезПоследних.Контрагент.Наименование КАК КонтрагентНаименование,
   ШапкаДСПСрезПоследних.Договор КАК Договор,
   ШапкаДСПСрезПоследних.ДатаОкончания КАК ДатаОкончания
ПОМЕСТИТЬ ВТ_ИсходныеДанные
ИЗ
   РегистрСведений.ШапкаДСП.СрезПоследних КАК ШапкаДСПСрезПоследних
       ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СтатусДСП.СрезПоследних КАК СтатусДСПСрезПоследних
       ПО ШапкаДСПСрезПоследних.Договор = СтатусДСПСрезПоследних.Договор
ГДЕ
   НАЧАЛОПЕРИОДА(ШапкаДСПСрезПоследних.ДатаОкончания, ДЕНЬ) = ДОБАВИТЬКДАТЕ(&ТекущаяДата, ДЕНЬ, &КоличествоДней)
   И (СтатусДСПСрезПоследних.Статус ЕСТЬ NULL
           ИЛИ СтатусДСПСрезПоследних.Статус = ИСТИНА)

ИНДЕКСИРОВАТЬ ПО
   Контрагент
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   ВТ_ИсходныеДанные.Контрагент,
   ВТ_ИсходныеДанные.КонтрагентНаименование,
   ВТ_ИсходныеДанные.Договор,
   ВТ_ИсходныеДанные.ДатаОкончания,
   ВЫРАЗИТЬ(КонтактнаяИнформация.Представление КАК СТРОКА(20)) КАК Телефон
ИЗ
   ВТ_ИсходныеДанные КАК ВТ_ИсходныеДанные
       ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация
       ПО ВТ_ИсходныеДанные.Контрагент = КонтактнаяИнформация.Объект
ГДЕ
   КонтактнаяИнформация.Тип = ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.Телефон)
   И КонтактнаяИнформация.Представление ПОДОБНО "%[0-9]%[0-9]%[0-9]%[0-9]%[0-9]%[0-9]%[0-9]%[0-9]%[0-9]%[0-9]%"
;

////////////////////////////////////////////////////////////////////////////////
УНИЧТОЖИТЬ ВТ_ИсходныеДанные

Первый подзапрос отрабатывает в рабочей базе 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) + )))
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух. Фредерик Брукс-младший