|
Странное поведение запроса из Бух8 | ☑ | ||
---|---|---|---|---|
0
zerik
22.03.24
✎
15:21
|
Добрый день.
Вот при закрытии месяца выполняется один из запросов и вешает клиента на мертво, помогает только сброс текущего серверного вызова, да база в sql 16. Если во втором запросе убрать "ПЕРВЫЕ 1" то запрос выполняется и всё хорошо, на 2.5 млн строк выборка, но выполняет и не тупит. База обслужена, индексы перестроены, статистика обновлена. Далее база выгружена и загружена в чистую, та же история... Далее база загружена в файловую версию, в файловой нет проблем. Кто сталкивался помогите понять... я его уже простил =) ВЫБРАТЬ ПЕРВЫЕ 1 ТаблицаПоследовательности.Регистратор КАК Регистратор, ТаблицаПоследовательности.Период КАК Период, ИСТИНА КАК ЭтоДанныеПоследовательности ИЗ Последовательность.ДокументыОрганизаций КАК ТаблицаПоследовательности ГДЕ ТаблицаПоследовательности.Организация = &Организация И ТаблицаПоследовательности.Период >= &НачинаяСДаты ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ Хозрасчетный.Регистратор, Хозрасчетный.Период, ЛОЖЬ ИЗ РегистрБухгалтерии.Хозрасчетный КАК Хозрасчетный ЛЕВОЕ СОЕДИНЕНИЕ Последовательность.ДокументыОрганизаций КАК ТаблицаПоследовательности ПО Хозрасчетный.Регистратор = ТаблицаПоследовательности.Регистратор ГДЕ Хозрасчетный.Организация = &Организация И Хозрасчетный.Период >= &НачинаяСДаты И НЕ Хозрасчетный.Регистратор ССЫЛКА Документ.ФормированиеЗаписейКнигиПокупок И НЕ Хозрасчетный.Регистратор ССЫЛКА Документ.УведомлениеОбОстаткахПрослеживаемыхТоваров И НЕ Хозрасчетный.Регистратор ССЫЛКА Документ.СправкиНДФЛДляПередачиВНалоговыйОрган И НЕ Хозрасчетный.Регистратор ССЫЛКА Документ.РаспределениеНДС И НЕ Хозрасчетный.Регистратор ССЫЛКА Документ.РезервыПоОплатеТруда И НЕ Хозрасчетный.Регистратор ССЫЛКА Документ.ДепонированиеЗарплаты И НЕ Хозрасчетный.Регистратор ССЫЛКА Документ.УдалитьНачислениеЗарплатыРаботникамОрганизаций И НЕ Хозрасчетный.Регистратор ССЫЛКА Документ.ПерерасчетСтраховыхВзносов И НЕ Хозрасчетный.Регистратор ССЫЛКА Документ.ОперацияНалоговогоУчетаПоНДФЛ И НЕ Хозрасчетный.Регистратор ССЫЛКА Документ.ОперацияСБилетом И НЕ Хозрасчетный.Регистратор ССЫЛКА Документ.УдалитьСписаниеДепонентовВДоходыОрганизаций И НЕ Хозрасчетный.Регистратор ССЫЛКА Документ.СписаниеНДС И НЕ Хозрасчетный.Регистратор ССЫЛКА Документ.АктПроверкиСтраховыхВзносов И НЕ Хозрасчетный.Регистратор ССЫЛКА Документ.УдалитьДепонированиеОрганизаций И НЕ Хозрасчетный.Регистратор ССЫЛКА Документ.НачислениеДивидендов И НЕ Хозрасчетный.Регистратор ССЫЛКА Документ.РегламентнаяОперация И НЕ Хозрасчетный.Регистратор ССЫЛКА Документ.ПерерасчетНДФЛ И НЕ Хозрасчетный.Регистратор ССЫЛКА Документ.ВосстановлениеНДС И НЕ Хозрасчетный.Регистратор ССЫЛКА Документ.ПодтверждениеНулевойСтавкиНДС И НЕ Хозрасчетный.Регистратор ССЫЛКА Документ.КорректировкаЕНС И НЕ Хозрасчетный.Регистратор ССЫЛКА Документ.ФормированиеЗаписейКнигиПродаж И НЕ Хозрасчетный.Регистратор ССЫЛКА Документ.УдалитьОтражениеЗарплатыВУчете И НЕ Хозрасчетный.Регистратор ССЫЛКА Документ.СведенияОбУдержанномНДФЛ И НЕ Хозрасчетный.Регистратор ССЫЛКА Документ.ФормированиеУставногоКапитала И НЕ Хозрасчетный.Регистратор ССЫЛКА Документ.УдалитьРасчетЕСН И НЕ Хозрасчетный.Регистратор ССЫЛКА Документ.НачислениеНДСпоСМРхозспособом И НЕ Хозрасчетный.Регистратор ССЫЛКА Документ.ВосстановлениеНДСПоОбъектамНедвижимости И НЕ Хозрасчетный.Регистратор ССЫЛКА Документ.СчетФактураПолученный И НЕ Хозрасчетный.Регистратор ССЫЛКА Документ.СчетФактураВыданный И ТаблицаПоследовательности.Регистратор ЕСТЬ NULL УПОРЯДОЧИТЬ ПО Период, Регистратор |
|||
1
Волшебник
22.03.24
✎
15:24
|
Такие запросы обязаны вешать базу. В этом их фишка
|
|||
2
zerik
22.03.24
✎
15:25
|
Во втором запросе "ВЫБРАТЬ ПЕРВЫЕ 1", а если убрать то выполняет норм.
|
|||
3
zerik
22.03.24
✎
15:35
|
экспериментальным путём выяснил, что вешается если этот первый 1 "Операция" т.е. получается есть ручная операция и она не в последовательности как это может так работать =((((
|
|||
4
Волшебник
22.03.24
✎
15:37
|
(3) Объясните смысл этого запроса, а уж потом будем разбираться, что в нём переделать. Это вообще зачем?
|
|||
5
Eiffil123
22.03.24
✎
16:03
|
(1) а в чем вы видите проблему с запросом?
|
|||
6
Гена
22.03.24
✎
16:16
|
(4) Список пропускаемых документов соответствует служебным обязанностям замГБ.
Скорее всего она попросила программиста сварганить какой-то отчёт по чужим для неё докам. |
|||
7
Гена
22.03.24
✎
16:19
|
Коллеги, мне непонятно, а что даёт это условие, можете пояснить?
И ТаблицаПоследовательности.Регистратор ЕСТЬ NULL Просто я привык видеть НЕ ЕСТЬ NULL... |
|||
8
Волшебник
22.03.24
✎
16:26
|
(7) Это условие обратное тому, к которому Вы привыкли. Ваш Кэп.
Нижний запрос выберет те документы, которых нет в последовательности. |
|||
9
Garykom
22.03.24
✎
16:51
|
(2) Не вижу у тебя двух запросов
Вижу один запрос с ОБЪЕДИНИТЬ ВСЕ |
|||
10
Garykom
22.03.24
✎
16:52
|
(9)+ два и более запросов это когда между ними есть ";"
|
|||
11
Eiffil123
22.03.24
✎
17:27
|
(3) похоже на платформенный глюк
|
|||
12
Волшебник
22.03.24
✎
17:29
|
(10) Это один пакетный запрос
|
|||
13
Garykom
22.03.24
✎
17:40
|
(12) Угу, который состоит из обычных запросов (не пакетных)
Теоретически да можно сказать что у него сложный запрос с объединить, состоящих из двух простых запросов |
|||
14
ptiz
22.03.24
✎
17:39
|
(0) Если в типовой бухгалтерии дата документа совпадает с датой движений, то в соединение добавь условие:
ПО Хозрасчетный.Период = ТаблицаПоследовательности.Период |
|||
15
Волшебник
22.03.24
✎
21:22
|
(14) А запрос к проводкам для выборки документов для перепроведения Вас не смутил?
|
|||
16
zerik
23.03.24
✎
00:39
|
Это запрос из типовой конфы. Общий модуль РаботаСПоследовательностями функция МоментВремениПервогоДокументаВПоследовательности
эта функция вызывается из функции ПроверитьАктуальность в модуле обработки ЗакрытиеМесяца перед выполнением закрытия. Это происходит в фоновом задании которое зависает при исполнении этого запроса... Если выполняю запрос из консоли запроса, то клиент виснет пока не сброшу серверный вызов. Зачем это так придумано ХЗ. Я не понимаю на, что влияет ПЕРВЫЕ 1. Видимо надо анализировать план запроса, но я в этом не шарю. |
|||
17
zerik
23.03.24
✎
00:42
|
(11) Поймал на платформе 23.2040 обновлял, добрался до актуальной 24.1467 всё также.
|
|||
18
zerik
23.03.24
✎
00:43
|
Лицуха, ИТС, все дела на месте , кроме кукухи... =)
|
|||
19
zerik
23.03.24
✎
00:46
|
(3) <- не актально, вешается если выборка меньше 5, т.е выбрать первые 5 и более ОК, выбрать первые 4 и меньше зависон =(
|
|||
20
youalex
23.03.24
✎
02:43
|
(16) >Видимо надо анализировать план запроса, но я в этом не шарю.
Хороший повод начать) Как минимум посмотреть в профайлере /консоле что там строится на стороне скуля. Ну или экспериментировать. Например - разбить ОБЪЕДИНИТЬ на 2 ВТ (ВЫБРАТЬ ПЕРВЫЕ 1 ... ПОМЕСТИТЬ ВТ1 ... УПОРЯДОЧИТЬ ПО...) дальше выбирать ПЕРВЫЕ 1 из их объединения. Или дикое условие на проверку типа заменить на ТИПЗНАЧЕНИЯ(Регистратор) НЕ В (&МассивТипов) |
|||
21
youalex
23.03.24
✎
02:55
|
(20) * а лучше ТИПЗНАЧЕНИЯ(Регистратор) В (&МассивТипов) , полный массив типов взять можно из Метаданные.РегистрыБухгалтерии.Хозрасчетный.СтандартныеРеквизиты.Регистратор.Тип.Типы() например
|
|||
22
АНДР
23.03.24
✎
08:22
|
Что должно вернуть первые 1 для каждого из выбрать, если упорядочивание применяется к итоговой выборке!?
|
|||
23
АНДР
23.03.24
✎
08:27
|
Где применяется к результату соединения, по этой причине условия на организацию и дату во втором выбрать должны быть в условии соединения и для обеих соединяемых таблиц!!!
Где проверять типы - вопрос дискуссионный. |
|||
24
Фёдор14
23.03.24
✎
09:34
|
(0) А где у тебя упорядочивание в первом запросе?
В чем тогда смысл ВЫБРАТЬ ПЕРВЫЕ 1? |
|||
25
Фёдор14
23.03.24
✎
09:39
|
А, там же объединение...
Ну да, это сложный запрос получится. Неудивительно, что долго работает. |
|||
26
youalex
23.03.24
✎
11:14
|
(23) во втором члене объединения (назовем его так) проверка на типы видимо исключает типы, не входящие в последовательность. С условиями там логически все верно.
|
|||
27
ДедМорроз
23.03.24
✎
11:49
|
Чтобы получить первые,нужно выполнить запрос и сделать упорядочивание,а только потом выбрать первую строку.
Упорядочивание документов,которые в разных таблицах,задача очень непростая. А влияние количества - возможно,что при большом количестве все отдают SQL,а он более оптимизирован,а попытка делать сравнение на лету приводит к поиску по таблицам для каждой строки,то есть получается аналог запроса в цикле. При исполнении в sql цикл получается не по строкам,а по типам документов,так как сравнивать моменты времени можно и без заглядывается в таблицы. |
|||
28
zerik
23.03.24
✎
13:37
|
(24) Так это не у меня, это в типовой бух
|
|||
29
zerik
23.03.24
✎
13:40
|
всем спасибо, разбираться нет времени, перевод в файловую решает, может позже с обновлением платформы верну в скуль проверю
|
|||
30
Гена
23.03.24
✎
15:39
|
(28) Нет в типовой такого кода. Есть другой:
Функция МоментВремениПервогоДокументаВПоследовательности(Организация, Знач НачинаяСДаты, УчитыватьОтложенноеПроведение = Истина) Экспорт
НачинаяСДаты = ДатаНеРанееНачалаУчета(Организация, НачинаяСДаты); Запрос = Новый Запрос; Запрос.УстановитьПараметр("Организация", Организация); Запрос.УстановитьПараметр("НачинаяСДаты", НачинаяСДаты); Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1 | ТаблицаПоследовательности.Регистратор КАК Регистратор, | ТаблицаПоследовательности.Период КАК Период, | ИСТИНА КАК ЭтоДанныеПоследовательности |ИЗ | Последовательность.ДокументыОрганизаций КАК ТаблицаПоследовательности |ГДЕ | ТаблицаПоследовательности.Организация = &Организация | И ТаблицаПоследовательности.Период >= &НачинаяСДаты"; Если НЕ ИспользуетсяОтложенноеПроведение Тогда Запрос.Текст = Запрос.Текст + " | |ОБЪЕДИНИТЬ ВСЕ | |ВЫБРАТЬ ПЕРВЫЕ 1 | Хозрасчетный.Регистратор КАК Регистратор, | Хозрасчетный.Период КАК Период, | ЛОЖЬ КАК ЭтоДанныеПоследовательности |ИЗ | РегистрБухгалтерии.Хозрасчетный КАК Хозрасчетный | ЛЕВОЕ СОЕДИНЕНИЕ Последовательность.ДокументыОрганизаций КАК ТаблицаПоследовательности | ПО Хозрасчетный.Регистратор = ТаблицаПоследовательности.Регистратор |ГДЕ | Хозрасчетный.Организация = &Организация | И Хозрасчетный.Период >= &НачинаяСДаты | И &УсловиеПоРегистратору | И НЕ Хозрасчетный.Регистратор ССЫЛКА Документ.СчетФактураПолученный | И НЕ Хозрасчетный.Регистратор ССЫЛКА Документ.СчетФактураВыданный | И ТаблицаПоследовательности.Регистратор ЕСТЬ NULL"; КонецЕсли; Запрос.Текст = Запрос.Текст + " | |УПОРЯДОЧИТЬ ПО | Период, | Регистратор"; Видно, что у вас там код переписан. И в исключение добавлена своя куча документов. |
|||
31
Гена
23.03.24
✎
15:47
|
Кстати, Волшебник, вот этой строчки раньше в коде не было:
И ТаблицаПоследовательности.Регистратор ЕСТЬ NULL У меня есть релиз БП полугодичной давности - там её нет, она появилась недавно, в 150.29 уже есть Вот чем-то она мне не нравится ) |
|||
32
Гена
23.03.24
✎
15:50
|
т.е. концовка для ранешних платформ была такой:
|ВЫБРАТЬ ПЕРВЫЕ 1
| Хозрасчетный.Регистратор, | Хозрасчетный.Период, | ЛОЖЬ КАК ЭтоДанныеПоследовательности |ИЗ | РегистрБухгалтерии.Хозрасчетный КАК Хозрасчетный |ГДЕ | Хозрасчетный.Организация = &Организация | И Хозрасчетный.Период >= &НачинаяСДаты | И &УсловиеПоРегистратору | И НЕ (Хозрасчетный.Регистратор ССЫЛКА Документ.СчетФактураПолученный) | И НЕ (Хозрасчетный.Регистратор ССЫЛКА Документ.СчетФактураВыданный)"; |
|||
33
Сияющий Асинхраль
23.03.24
✎
19:39
|
(31) Ага, странное условие.
|
|||
34
Волшебник
23.03.24
✎
20:57
|
(31) Мне вообще этот запрос не нравится
|
|||
35
zerik
24.03.24
✎
17:14
|
(30) конфа на замке, этот запрос собирается, я просто готовый текст выкатил который исполняется, "&УсловиеПоРегистратору" заменяется на описание регистраторов. строка 1042 в БП 3.0.147.30
|
|||
36
Волшебник
24.03.24
✎
17:15
|
(35) Гнилые отмазки
|
|||
37
zerik
25.03.24
✎
01:42
|
(36) хех - колбасный цех
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |