|
помогите оптимизировать запрос | ☑ | ||
---|---|---|---|---|
0
Serega103
17.10.14
✎
14:04
|
Есть запрос к таблице документов
ВЫБРАТЬ Прием.Ссылка ИЗ Документ.Прием КАК Прием ГДЕ НАЧАЛОПЕРИОДА(Прием.Дата, ДЕНЬ) = &ДатаП И (Прием.ВремяНачала >= &НачП И Прием.ВремяНачала < &КонП ИЛИ Прием.ВремяОкончания > &НачП И Прием.ВремяОкончания <= &КонП) И (НЕ Прием.ПометкаУдаления) И Прием.Доктор = &ДокП И Прием.Ссылка <> &СсылкаП при выполнении на локальном компе замер производительности показывает очень маленький процент, от общего времени проведения, а при проверке на компе который работает по сети, показывает что выполнение запроса занимает 50% всего времени. Можно ли его как то оптимизировать? По полям "Доктор", "ВремяНачала" и "время окончания" проставлено индексирование. |
|||
1
Serega103
17.10.14
✎
14:05
|
Запрос выполняется перед записью документа, чтобы исключить запись на прием в одно и то же время двух пациентов
|
|||
2
Serega103
17.10.14
✎
14:06
|
Видимо из за того что много условий запрос тормозит?
|
|||
3
Serega103
17.10.14
✎
14:08
|
Если этот запрос сделать пакетами, то есть сначала наложить фильтр по дате а потом его ковырять на предмет совпадения времени и врача, даст ли это прирост скорости?
|
|||
4
dubraver
17.10.14
✎
14:10
|
Запросы нужно оптимизировать с использованием sql profiler. Смотреть нужно на показатели duration,reads. Чем меньше будет duration и reads, тем лучше ты оптимизировал запрос.
|
|||
5
Serega103
17.10.14
✎
14:11
|
Дык был бы там еще SQL...
|
|||
6
pessok
17.10.14
✎
14:18
|
(0) помести все приемы проведенные приемы за день в ВТ, а уже потом наложи на ВТ условие по времени. а еще лучше сделать регистр сведений под это дело
|
|||
7
H A D G E H O G s
17.10.14
✎
14:18
|
(4) Глупости. Ну посмотрит он на duration и reads, а дальше.
Надо смотреть, где возникают indexscan, большие промежуточные выборки и "распараллеливание ветвей алгоритма" с дублирующим чтением (и такое бывает). |
|||
8
dubraver
17.10.14
✎
14:28
|
(7) Не глупости. Понятно что нужно смотреть план запроса. Исключать tablescan и добиваться indexseek. Но после оптимизации количество чтений и время выполнения запроса сразу уменьшается.
|
|||
9
H A D G E H O G s
17.10.14
✎
14:29
|
(8) Если статистику обновить.
|
|||
10
Широкий
17.10.14
✎
14:34
|
"НАЧАЛОПЕРИОДА(Прием.Дата, ДЕНЬ) = &ДатаП"
Я бы переделал на Прием.Дата МЕЖДУ НАЧАЛОПЕРИОДА... |
|||
11
Широкий
17.10.14
✎
14:35
|
"Доктор", "ВремяНачала" и "время окончания"
У тебя Дата и так с индексом - больше и не надо |
|||
12
Ник второй
17.10.14
✎
14:35
|
(7) Как бы надо смотреть план запроса целиком и особенно на самые длительные операции. Например сам по себе индекс скан может быть и добром
|
|||
13
Ник второй
17.10.14
✎
14:37
|
(0) Общие рекомендации:
1. ИЛИ переделелать на объединение двух запросов 2. Заменить НАЧАЛОПЕРИОДА(Прием.Дата, ДЕНЬ) = &ДатаП на Между |
|||
14
Ник второй
17.10.14
✎
14:39
|
(13) + Вопрос еще по индексу по реквизиту "Доктор", но в эту сторону надо смотреть с оглядкой, на возникающие здержки при записи документа.
наверняка в плане у тебя индекс скан или индекс seek where |
|||
15
Serega103
17.10.14
✎
15:04
|
С SQL встречаюсь нечасто.
sql profiler это что? Какая то утилита на SQL server? |
|||
16
zdas
17.10.14
✎
15:14
|
сделай индексными реквизиты
ВремяНачала ВремяОкончания Доктор а вообще, надо юзать не документ. а регистр сведений :) |
|||
17
Serega103
17.10.14
✎
15:22
|
(16) они уже индексные,
насчет регистра сведений подумаю, идея неплохая. |
|||
18
Serega103
17.10.14
✎
15:22
|
Спасибо
|
|||
19
Fragster
гуру
17.10.14
✎
15:35
|
поможет тупо замена НАЧАЛОПЕРИОДА(Прием.Дата, ДЕНЬ) = &ДатаП на
Прием.Дата МЕЖДУ &ДатаП И КОНЕЦПЕРИОДА(&ДатаП, ДЕНЬ) остальное даст крохи уже |
|||
20
Fragster
гуру
17.10.14
✎
15:37
|
а вообще - в идеале надо чтобы документ писал, ну допустим, в регистр накопления на начало приема приход 1 и на конец приема расход 1. тогда количество обслуженных в период считается через Рег.КоличествоРасход.
и контролировать пересечение проще |
|||
21
Fragster
гуру
17.10.14
✎
15:38
|
а для особо упоротых^w упорных на регистре расчета можно.
|
|||
22
zdas
17.10.14
✎
15:39
|
может РС с периодом в день, с реквизитами доктор, ДатаН, датаПо - (я так понимаю это жесткие интвералы), и запихнуть это в измерения, тогда точно не даст сохранить с одинаковыми данными :) хота если перод по - будет другой - то даст :)
|
|||
23
Ник второй
17.10.14
✎
15:41
|
(16) ПРосто так делать что то индексным не надо... )
|
|||
24
Ник второй
17.10.14
✎
15:42
|
(17) А в чем разница между регистром сведений и документом? Суть то не изменится ))
|
|||
25
Ник второй
17.10.14
✎
15:42
|
(19) ИЛИ может дать неплохой прирост
|
|||
26
Ник второй
17.10.14
✎
15:43
|
(21) Регистр расчета это сплошной тормоз.
|
|||
27
zdas
17.10.14
✎
15:43
|
(24) просто так не надо, а для выборок и связей по этому реквизиту - надо.
|
|||
28
zdas
17.10.14
✎
15:44
|
(24) ну про разницу между РС и документом думаю это вопрос реторический?;)
|
|||
29
Ник второй
17.10.14
✎
15:44
|
(27) что значит для выборок и связей, это и есть просто так.
Если в одном месте дать индекс, то будет тормозить запись. В итоге просто время перетечет с чтения на запись, а итог тот же. |
|||
30
Ник второй
17.10.14
✎
15:45
|
(28) Конечно нет.... данные они и в Африке данные....
|
|||
31
Fragster
гуру
17.10.14
✎
15:45
|
(25) в данной ситуации Период - кластерный сукаиндекс, и он не используется. остальное не будет использоваться, если в неог попасть, так что ИЛИ даже может быть предпочтительнее, так как один проход будет.
|
|||
32
Ник второй
17.10.14
✎
15:46
|
(31) Надо оценивать, без анализа плана запроса сложно.
|
|||
33
Ник второй
17.10.14
✎
15:47
|
(32) + Время начала и Время окончания явно не Период ))) так что смысл есть.... но опять без сбора симптомов и статистических данных мы гадаем на кофейной гуще.
|
|||
34
zdas
17.10.14
✎
15:47
|
(29) >что значит для выборок и связей, это и есть просто так.
молчу молчу ))))))))))))))) |
|||
35
Ник второй
17.10.14
✎
15:48
|
(34) Вот вот, ради конкретной выборки и/или связи индексы не вешают...
|
|||
36
Fragster
гуру
17.10.14
✎
15:49
|
кстати, я в (31) наврал :) почему-то был уверен, что кластерный по периоду, а он, оказывается, по ссылке. Ну тогда может и по другому будет, но поскольку 1с не умеет делать нормальные индексы на несколько реквизитов, скорее всего оптимально будет сделать индекс на доктора,, но в таком случае на ИЛИ опять пофигу
|
|||
37
zdas
17.10.14
✎
15:49
|
(35) перечитай условие в (0) :) и можешь мне про индексы ничего не говорить)))
|
|||
38
Ник второй
17.10.14
✎
15:50
|
(37) И что в условии (0) такого?
|
|||
39
Ник второй
17.10.14
✎
15:52
|
(36) Все зависит как построится план запроса, возможно, что индексы вообще не будут использоваться.
|
|||
40
Ник второй
17.10.14
✎
15:53
|
(37) Вы явно не вкурсе как строится план запроса. Индексирование может не помочь вообще, как у Автора, так как у него если почитаешь ветку индексы стоят и на доктора и на даты.
|
|||
41
Fragster
гуру
17.10.14
✎
15:53
|
посмотрел в БД. почему-то на документах при индексировании по реквизиту ставится индекс реквизит + ссылка. а в регистрах - реквизит + период + ссылка, так что в случае больших объемов использование регситра даст прирост (если писать начало и конец не одной записью, а двумя)
|
|||
42
H A D G E H O G s
17.10.14
✎
15:53
|
(38) "который работает по сети" :-)
|
|||
43
Fragster
гуру
17.10.14
✎
15:54
|
(41)+ подчиненного регистратору периодического регистра, в случае РС
|
|||
44
zdas
17.10.14
✎
15:54
|
(41) регистр периодический?;)
|
|||
45
Ник второй
17.10.14
✎
15:54
|
(42) Между прочем это важное замечание, не исключено что у автора файловая ))
|
|||
46
Ник второй
17.10.14
✎
15:55
|
(45) ТОгда все наши потуги идут лесом ))))
|
|||
47
zdas
17.10.14
✎
15:55
|
(40) когда я захочу оценить уровень моих знаний - я обязательно обращусь к вам, ладно?:)
|
|||
48
Ник второй
17.10.14
✎
15:56
|
(47) Принимаю по предварительной записи, очередь стоит.
|
|||
49
zdas
17.10.14
✎
15:57
|
(48) ну год на 2040 можете смело делать запись)))
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |