|   |   | 
| 
 | Медленно выполняется простой запрос | ☑ | ||
|---|---|---|---|---|
| 0
    
        Dimon1C 04.06.25✎ 11:53 | 
        Добрый день. Есть документ Протокол, к нему запрос 
 ВЫБРАТЬ Протокол.Ссылка, Протокол.НеИсполнен ИЗ Документ.Протокол КАК Протокол ГДЕ Протокол.Карта = &Карта И Протокол.НеИсполнен = ЛОЖЬ И Протокол.Вид В(&ВидыПротоколов) И Протокол.Проведен = ИСТИНА И Протокол.Дата <= &НаДату УПОРЯДОЧИТЬ ПО Протокол.Дата Индексы стоят на Карта, ранее стояли на НеИсполнен и Вид (но были убраны, так как на булево не рекомендуют, а Вид - до 1 тыс записей, тоже не рекомендуют. Но это не помогло) Последнее время периодически данный простой запрос стал формироваться по 20 и более секунд, хотя обычно формировался 0,01сек. В выборке примерно 1-5 документов. Тормоза начинаются примерно в одно время когда пользователи начинают активно использовать данный запрос (пользователей 10-15). Самое странное, если меняешь часть запроса, например, переставляешь местами условие, или добавляешь/убираешь поле в ВЫБРАТЬ, то запрос начинает формировать быстро, и после перезахода пользователей в программу все ОК. Но на след день все снова повторяется, и опять приходится чуток модифицировать запрос. | |||
| 1
    
        butterbean 04.06.25✎ 11:53 | 
        В(&ВидыПротоколов) - вот тут проблема     | |||
| 2
    
        maxab72 04.06.25✎ 11:54 | 
        база серверная или файловая?     | |||
| 3
    
        Dimon1C 04.06.25✎ 11:56 | 
        (2) серверная, объем большой данной таблицы, но в разрезе Карта - не так много записей (100-200)     | |||
| 4
    
        Dimon1C 04.06.25✎ 11:57 | 
        (1) Виды протоколов - массив, обычно там 1 элемент, иногда чуть больше     | |||
| 5
    
        Мультук гуру 04.06.25✎ 11:57 | 
        (2) 
 Спорим он ответит - серверная. Но ни имени sql-сервера, ни его версию не напишет ? Обновляется ли статистка ? | |||
| 6
    
        butterbean 04.06.25✎ 11:59 | 
        (3) попробуй переделать на табл значений и внутреннее соединение     | |||
| 7
    
        Dimon1C 04.06.25✎ 12:01 | 
        (5) Что там соединять? данные выбираются из одной таблицы.     | |||
| 8
    
        maxab72 04.06.25✎ 12:01 | 
        (7) ВидыПротоколов это справочник?     | |||
| 9
    
        H A D G E H O G s 04.06.25✎ 12:01 | 
        ВЫБРАТЬ
 Протокол.Ссылка Поместить Протоколы ИЗ Документ.Протокол КАК Протокол ГДЕ Протокол.Карта = &Карта; ВЫБРАТЬ Протоколы.Ссылка, Протоколы.Ссылка.НеИсполнен ИЗ Протоколы КАК Протоколы ГДЕ Протоколы.Ссылка.НеИсполнен = ЛОЖЬ И Протоколы.Ссылка.Вид В(&ВидыПротоколов) И Протоколы.Ссылка.Проведен = ИСТИНА И Протоколы.Ссылка.Дата <= &НаДату УПОРЯДОЧИТЬ ПО Протоколы.Ссылка.Дата | |||
| 10
    
        Волшебник 04.06.25✎ 12:01 | 
        Первым запросом выбрать по Карта и положить во временную таблицу. Вторым запросом наложить остальные условия     | |||
| 11
    
        Волшебник 04.06.25✎ 12:02 | 
        (9) точно так     | |||
| 12
    
        RomanYS 04.06.25✎ 12:02 | 
        (1)(3) если утверждения верны, то ВТ или вложенный запрос без этого условия исправят ситуацию     | |||
| 13
    
        H A D G E H O G s 04.06.25✎ 12:02 | 
        Оптимизатор не может решить, сканировать ли ему кластерный индекс или искать по некластерному с keylookup. Давайте поможем Даше.     | |||
| 14
    
        Dimon1C 04.06.25✎ 12:03 | 
        (5) MS SQL 2012, статистика обновляется каждую неделю. Вроде как рекомендуют каждый день, переделаем     | |||
| 15
    
        RomanYS 04.06.25✎ 12:04 | 
        (9) Почему не выбрать нужные реквизиты в первом запросе? "Ссылка.<...>" режет глаза))     | |||
| 16
    
        Dimon1C 04.06.25✎ 12:05 | 
        (9) Спасибо, понял идею.     | |||
| 17
    
        H A D G E H O G s 04.06.25✎ 12:08 | 
        (15) Потому что они не входят в некластерный индекс и за ними надо лезть в кластер, что соблазнит оптимизатор использовать кластер     | |||
| 18
    
        RomanYS 04.06.25✎ 12:13 | 
        (17) Я не про условия. Условие оставляем как есть, а в поля первого запроса добавляем нужные для отбора во втором.
 Ну или уж заменить второй запрос на явное внутреннее соединение. | |||
| 19
    
        toypaul гуру 04.06.25✎ 12:19 | 
        Описание из (0) похоже на то как будто не настроено обновление статистики. СУБД какая?     | |||
| 20
    
        toypaul гуру 04.06.25✎ 12:20 | 
        (14) раз в неделю при активной работе очень мало     | |||
| 21
    
        arsik гуру 04.06.25✎ 12:21 | 
        (18) Ну тогда больше ненужных данных придется тянуть, т.к. нужна будет одна запись из двухсот.     | |||
| 22
    
        Широкий 04.06.25✎ 12:22 | 
        (17) Правильно ли я понял , проблема в условиях 
 " И Протокол.Проведен = ИСТИНА И Протокол.Дата <= &НаДату" Скуль сначала кластер смотрит? | |||
| 23
    
        H A D G E H O G s 04.06.25✎ 12:33 | 
        (18) "а в поля первого запроса добавляем нужные для отбора во втором"
 Откуда SQL добудет эти поля? | |||
| 24
    
        H A D G E H O G s 04.06.25✎ 12:35 | 
        (22) Нет. Проблема и в условиях и в полях, которых нет в некластерном индексе "Протокол.Карта", и поэтому SQL предпочитает его, этот некластерный индекс не использовать, как только статистика начинает устаревать.     | |||
| 25
    
        H A D G E H O G s 04.06.25✎ 12:35 | 
        Старайтесь думать, как SQL     | |||
| 26
    
        maxab72 04.06.25✎ 12:44 | 
        кстати, буквально на днях обновили
 https://its.1c.ru/db/metod8dev/content/1590/hdoc | |||
| 27
    
        Dimon1C 04.06.25✎ 12:56 | 
        (0) Забыл еще добавить, Карта - реквизит составного типа (2 справочника)     | |||
| 28
    
        RomanYS 04.06.25✎ 12:58 | 
        (23) из таблицы документа. Бывает по-другому? В твоем случае SQL возьмет данные только из индекса без обращения к основной таблице?     | |||
| 29
    
        RomanYS 04.06.25✎ 13:03 | 
        (21) Что значит ненужных, они нужны для последующего отбора? Выбрать три колонки в по 100-200 документам явно эффективнее чем ещё одно левое соединение во втором запросе... или не эффективнее по причинам указанным в (15).
 Было бы на чем проверить, у меня эти утверждения вызывают сомнения. | |||
| 30
    
        H A D G E H O G s 04.06.25✎ 13:17 | 
        (28) Если SQL возьмет эти поля из таблицы документа - это может склонит его использовать таблицу документа для поиска, не лезя в индекс, как было в исходном запросе.
 Поэтому мы будем оперировать только с полями, которые есть в индексе, отберем по нему 10-20 записей. А потом 2-м запросом вытащим левым соединением эти поля для 10-20 записей из таблицы данных. | |||
| 31
    
        RomanYS 04.06.25✎ 13:36 | 
        (30) Для меня само утверждение, что SQL может использовать только таблицу индекса без обращения основной таблице, несколько неожиданно. Отсюда сомнения.
 А неявное левое соединение в условиях с наложением условия на правую таблицу вызывает возмущение)) Не исключаю, что это реально работает, но на первый взгляд выглядит дико. (0) Готов затестить пару-тройку запросов? | |||
| 32
    
        Garykom гуру 04.06.25✎ 13:46 | 
        Не понимаю какого хрена спорите о неких индексах
 Когда у ТС явные проблемы многозадачности и возможно блокировок | |||
| 33
    
        Garykom гуру 04.06.25✎ 13:48 | 
        Выполнение 1 запроса монопольно
 И одновременно 10-15 этих же запросов параллельно Да еще возможно когда в табличку пишут - накладывается блокировка на чтение | |||
| 34
    
        timurhv 04.06.25✎ 13:50 | 
        (31) Может, даже добавили возможность настраивать в 1С Корп
 https://wonderland.v8.1c.ru/blog/povyshenie-gibkosti-nastroyki-indeksov/ | |||
| 35
    
        RomanYS 04.06.25✎ 13:52 | 
        (34) 1С здесь вроде вообще не при чём, это же всё внутри SQL.     | |||
| 36
    
        Маленький Вопросик 04.06.25✎ 13:53 | 
        (0) в запросе нет проблем, похоже что-то с базой - либо документов много слишком!!! тогда да... будет висеть     | |||
| 37
    
        timurhv 04.06.25✎ 13:56 | 
        (35) по ссылке из (34) если вытаскиваешь запросом Поставщик + Валюта, то используется индексная таблица. Чтобы не обращаться к основной таблице за данными "Склад" и "Организация" добавили возможность их дополнять.
 Раньше такого не было, так что 1С еще как причем. | |||
| 38
    
        maxab72 04.06.25✎ 13:56 | 
        (34) в КОРП 8.3.27 уже добавили     | |||
| 39
    
        Dimon1C 04.06.25✎ 14:09 | 
        (33) На проведение документов пользователи не жаловались, ошибок блокировок не видел, ручные блокировки не используем     | |||
| 40
    
        Dimon1C 04.06.25✎ 14:11 | 
        (39) здесь явное непопадание в индекс, думаю ВТ решит проблему     | |||
| 41
    
        Garykom гуру 04.06.25✎ 14:44 | 
        Если говоришь что перестановка условий местами помогает
 Ну так начни динамически формировать текст запроса, каждый раз меняя порядок условий случайным образом )) | |||
| 42
    
        Dimon1C 04.06.25✎ 14:56 | 
        (41) Стеб? Сам был удивлен, что перестановка условий влияет на скорость выполнение запроса, вот и спрашиваю у коллективного разума 1Сников, как такое может быть     | |||
| 43
    
        timurhv 04.06.25✎ 14:57 | 
        (42) SQL запомнил что с таким запросом ему будет лучше прочитать всю физическую таблицу без индексов.
 Пришел другой запрос, глянул в статистику - воспользовался таблицей индексов. Запомнил на будущее, что новый запрос идет с индексами. И тд | |||
| 44
    
        timurhv 04.06.25✎ 15:01 | 
        В общем, профайлер надо смотреть в MSSQL     | |||
| 45
    
        Garykom гуру 04.06.25✎ 15:01 | 
        (42) Такое не может быть
 Есть дополнительные внешние влияющие факторы Например табличка индексов слишком занята другими параллельными запросами а физическая таблица без индексов нет - и СУБД решила сканить ее или другие таблички индексов сначала а затем вернуться к первой | |||
| 46
    
        Garykom гуру 04.06.25✎ 15:02 | 
        (45)+ А когда перестает тормозить - вероятно помогает выгон пользователей и остановка/очистка очереди запросов скуля     | |||
| 47
    
        arsik гуру 04.06.25✎ 15:05 | 
        (45) А может просто кеш     | |||
| 48
    
        Dimon1C 04.06.25✎ 15:05 | 
        (46) Я прямо в консоле отчетов корректирую запрос, пользователей не выгоняя. С одним текстом быстро, с другим долго     | |||
| 49
    
        Garykom гуру 04.06.25✎ 15:09 | 
        (48) Ну так логично, когда с другим долго - его сейчас юзают другие юзеры например     | |||
| 50
    
        katamoto 05.06.25✎ 06:34 | 
        (42) При перестановке получается, по сути, новый запрос под который генерится новый план, который может быть удачнее старого. Тут уже планы надо бы вытаскивать и сравнивать чтоб понять почему. 
 (45) Нет, субд не анализируют текущую занятость индексов запросами. Во всяком случае, mssql и postgres точно так не делают | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |