|
При обращении к таблице задач 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 ТОГДА ИСТИНА ИНАЧЕ &ПревышениеСрока <= РАЗНОСТЬДАТ(Отсеяные.Дата, &ТекущаяДата, ДЕНЬ) КОНЕЦ |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |