Имя: Пароль:
1C
1С v8
При обращении к таблице задач SQL сервер сходит с ума
0 camojiet
 
21.09.15
11:25
Конфигурация ERP 2.0 Платформа 2237 MSSQL 2008 64bit
Запрос:
ВЫБРАТЬ
    ЗадачаИсполнителя.Ссылка
ИЗ
    Задача.ЗадачаИсполнителя КАК ЗадачаИсполнителя
ГДЕ
    НЕ ЗадачаИсполнителя.Выполнена
В режиме SQL при его исполнении SQL серер очень быстро сжирает всю память (хотя настроен он на сжирание 3 гб максимум). И в конце концов вылетает с ошибкой, что мало памяти.

В файловом режиме запрос отрабатывает оч быстро.

Кто-нибудь сталкивался с подобным? Таблица задач какая-то особенная? Раньше к ней запросов не делал.
1 vde69
 
21.09.15
11:27
для начала обнови статистику в скуле
2 Гёдза
 
21.09.15
11:28
(1) Статистика вряд ли поможет
3 Гёдза
 
21.09.15
11:28
попробуй checkdbcc сделать
4 vde69
 
21.09.15
11:28
а вообще не понятен смысл данного запроса, может имеет смысл использовать динамический список с отбором
5 Гёдза
 
21.09.15
11:29
может это вообще не этот запрос, а фоновое.
Запусти профайлер и посмотри
6 vde69
 
21.09.15
11:30
и кстати 3 гига для современного скуля - явно мало, реально меньше 10 гигов  не катит...
7 МихаилМ
 
21.09.15
11:31
либо порушились индексы либо данные .
8 Гёдза
 
21.09.15
11:31
(6) Но не для такого же запроса
9 МихаилМ
 
21.09.15
11:41
(0)
без отбора запрос работает ?
10 camojiet
 
21.09.15
11:46
(1) Запустил обновление статистики.
(2) Позже поставлю на проверку/исправление.
(4) это упрощённый запрос, полный нужен для отчета
(5) Это не фоновое.
(6) не в этом дело запрос то плёвый
(7) выгрузка/загрузка дт получается должна порешать проблему если это так? или нет?
(9) Не пробовал, но думаю будет тоже самое.
11 Гёдза
 
21.09.15
11:48
Если по простому сделай ТИИ
12 vde69
 
21.09.15
11:56
>>>это упрощённый запрос, полный нужен для отчета

давай полный запрос, возможно тут хитрости есть, например если это создание временной таблицы, то нужно добавить "выразить(" и т.д.
13 camojiet
 
21.09.15
12:15
(1) Обновление статистики помогло! Браво!
14 vde69
 
21.09.15
12:17
(13) теперь время настраивать регламенты скуля :)
15 camojiet
 
21.09.15
12:20
Да я уже настроил. Сегодня первый день на этом сервере будут запускаться.
И чёт я погорячился с выводами, простой запрос отработал, а чуть сложнее -так же выбил сервак. Вот запрос:
ВЫБРАТЬ
    ЗадачаИсполнителя.Предмет.Ссылка КАК Сделка,
    ЗадачаИсполнителя.Предмет.Партнер КАК Клиент,
    ЗадачаИсполнителя.Предмет.ДатаНачала КАК НачалоСделки,
    ЗадачаИсполнителя.Дата КАК Записана,
    РАЗНОСТЬДАТ(ЗадачаИсполнителя.Дата, &ТекущаяДата, ДЕНЬ) КАК Срок
ИЗ
    Задача.ЗадачаИсполнителя КАК ЗадачаИсполнителя
ГДЕ
    ЗадачаИсполнителя.ТочкаМаршрута = &ТочкаМаршрута
    И ЗадачаИсполнителя.Предмет.Статус = ЗНАЧЕНИЕ(Перечисление.СтатусыСделок.ВРаботе)
    И ЗадачаИсполнителя.Предмет.ВидСделки.ТипСделки = ЗНАЧЕНИЕ(Перечисление.ТипыСделокСКлиентами.ТиповаяПродажа)
    И ЗадачаИсполнителя.Дата <> ДАТАВРЕМЯ(1, 1, 1)
    И НЕ ЗадачаИсполнителя.Выполнена
    И ВЫБОР
            КОГДА &ПревышениеСрока = 0
                ТОГДА ИСТИНА
            ИНАЧЕ &ПревышениеСрока <= РАЗНОСТЬДАТ(ЗадачаИсполнителя.Дата, &ТекущаяДата, ДЕНЬ)
        КОНЕЦ
    И НЕ ЗадачаИсполнителя.ПометкаУдаления
16 vde69
 
21.09.15
13:10
с таким условие у тебя точно будет фул скан таблицы, что само по себе не страшно кроме случая когда у тебя задач дофига...

что в твоем запросе плохо:
1. Использование реквизитов "предмета", например "ЗадачаИсполнителя.Предмет.Статус = ЗНАЧЕНИЕ(Перечисление.СтатусыСделок.ВРаботе)"

тут лучше использовать джойн а не условие, если "предметов" (удовлетворяющих условию) много - то с полной таблицей, если мало то с времянкой

2. ЗадачаИсполнителя.Предмет.ВидСделки.ТипСделки - это очень плохо....

по сколько у тебя "предмет" не меняется логично в задачу добавить поле "ТипСделки" и заполнять его при создании задачи, а потом условие сократить до ЗадачаИсполнителя.ТипСделки = ЗНАЧЕНИЕ(Перечисление.ТипыСделокСКлиентами.ТиповаяПродажа)

3. в данном запросе индекс вообще не должен использоватся и-за диф условия по датам, это плохо

4. РАЗНОСТЬДАТ - довольно медленно работает, лучше вне запроса вычислить некую дату и сравнивать "ЗадачаИсполнителя.Дата" уже с ней.

5. вопрос с индексами - открытый, на вскидку сказать не могу, но вероятно там то-же не все хорошо...
17 camojiet
 
21.09.15
13:24
Чувствую тотальное отсутствие фундамента. Не знаю что есть джоинт и предмет. По колхозному попробую выгрузить только не выполненые во времянку и на времянку накладывать условия. Очень внимательно прочитаю ваш пост, и детально изучу вопрос, но завтра.  Сегодня полное слабоумие.

Если что всего ссылок в этой таблице 9000 всего.
18 camojiet
 
21.09.15
13:33
Внимательно прочитал. Добавлять реквизиты не вариант, так как конфа ещё девственная. А вот оптимизировать запрос вашими рекомендациями можно. Про "предмет" понял. ) Попробую накладывать условия на предмет во времянке. А времянку готовить только по реквизитам таблиц без условий по датам
19 rsv
 
21.09.15
13:42
(0)   А так ЗадачаИсполнителя.Выполнена = Ложь .  Да и вообще ловите его профайлером и смотрите  план .
20 rsv
 
21.09.15
13:44
И ограничте Первые 100 хотя бы . Посмотрите  как живет .
21 vde69
 
21.09.15
13:48
(17) джоин - левое/правое/полное соединение

вообще общий подход такой:
нужно отделить условия которые работают по индексу от остальных, это можно сделать множеством способов...
22 rsv
 
21.09.15
13:48
Задача.ЗадачаИсполнителя т.е.  две таблицы . Попробуйте соединить явно . Куча вариантов .
23 camojiet
 
22.09.15
03:11
Спасибо мужики! Все доводы принял к сведению. Не все реализовал. Но впредь буду стараться писать запросы с учетом ваших указаний.

Вот мой запрос. Работает просто отлично.

ВЫБРАТЬ
    ЗадачаИсполнителя.Предмет,
    ЗадачаИсполнителя.Дата
ПОМЕСТИТЬ Отсеяные
ИЗ
    Задача.ЗадачаИсполнителя КАК ЗадачаИсполнителя
ГДЕ
    ЗадачаИсполнителя.Выполнена = ЛОЖЬ
    И ЗадачаИсполнителя.ПометкаУдаления = ЛОЖЬ
    И ЗадачаИсполнителя.ТочкаМаршрута = &ТочкаМаршрута
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    СделкиСКлиентами.Ссылка КАК Сделка,
    СделкиСКлиентами.Партнер КАК Клиент,
    СделкиСКлиентами.ДатаНачала КАК НачалоСделки,
    Отсеяные.Дата КАК Записана,
    РАЗНОСТЬДАТ(Отсеяные.Дата, &ТекущаяДата, ДЕНЬ) КАК Срок
ИЗ
    Отсеяные КАК Отсеяные
        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.СделкиСКлиентами КАК СделкиСКлиентами
        ПО Отсеяные.Предмет = СделкиСКлиентами.Ссылка
ГДЕ
    СделкиСКлиентами.Статус = ЗНАЧЕНИЕ(Перечисление.СтатусыСделок.ВРаботе)
    И СделкиСКлиентами.ВидСделки.ТипСделки = ЗНАЧЕНИЕ(Перечисление.ТипыСделокСКлиентами.ТиповаяПродажа)
    И Отсеяные.Дата <> ДАТАВРЕМЯ(1, 1, 1)
    И ВЫБОР
            КОГДА &ПревышениеСрока = 0
                ТОГДА ИСТИНА
            ИНАЧЕ &ПревышениеСрока <= РАЗНОСТЬДАТ(Отсеяные.Дата, &ТекущаяДата, ДЕНЬ)
        КОНЕЦ