|
Возможно ли как-то поторопить запрос? | ☑ | ||
---|---|---|---|---|
0
Галахад
гуру
23.12.14
✎
06:26
|
ВЫБРАТЬ
ПродажиОбороты.Период КАК Период, Ном.Ссылка КАК Номенклатура, ПродажиОбороты.Подразделение КАК Подразделение, ЕСТЬNULL(ПродажиОбороты.КоличествоОборот, 0) КАК КоличествоОборот, ЕСТЬNULL(ПродажиОбороты.СтоимостьОборот, 0) КАК СтоимостьОборот ИЗ Справочник.Номенклатура КАК Ном ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Продажи.Обороты( &Date1, &Date2, Месяц, Номенклатура В (&Номенклатура) И Подразделение В (&Подразделение)) КАК ПродажиОбороты ПО (ПродажиОбороты.Номенклатура = Ном.Ссылка) ГДЕ Ном.Ссылка В(&Номенклатура) УПОРЯДОЧИТЬ ПО ПродажиОбороты.Номенклатура.Наименование ИТОГИ СУММА(КоличествоОборот), СУММА(СтоимостьОборот) ПО Номенклатура, Подразделение |
|||
1
чувак
23.12.14
✎
06:28
|
а соединение зачем?
|
|||
2
Ник второй
23.12.14
✎
06:29
|
Нужно смотреть план запроса. Например можно вынести получение оборотов в отдельную ВТ.
|
|||
3
Ник второй
23.12.14
✎
06:29
|
(1) Не догадываешся? Видимо что бы получить обороты продаж по номенклатуре и нулевой оборот это тоже оборот.
|
|||
4
чувак
23.12.14
✎
06:30
|
"ГДЕ
Ном.Ссылка В(&Номенклатура)" Не знаю точно, но это надо в временной таблице сделать, а потом соединить. По моему соединение происходит до условия |
|||
5
Ник второй
23.12.14
✎
06:35
|
(4) Как оптимизатор решит так и будет, нужно смотреть план запроса.
|
|||
6
Skom
23.12.14
✎
06:37
|
Вот это попробуй убрать
"Номенклатура В (&Номенклатура)" |
|||
7
Skom
23.12.14
✎
06:37
|
фильтр на виртуальную не накладывай. все равно при соединении у тебя отфильтруется, хотя все же лучше план запросов смотреть
|
|||
8
floody
23.12.14
✎
07:09
|
соединение с виртуальной - переделать
|
|||
9
Галахад
гуру
23.12.14
✎
07:29
|
(2) Спасибо, попробовал. Ощутимой разницы нет.
(4) Спасибо, попробовал. Ощутимой разницы нет. (6) Спасибо, попробовал. Выполнилось на порядок медленнее. (8) Что именно переделать? |
|||
10
чувак
23.12.14
✎
07:31
|
(9) А как ты сделал (4) ? Сможешь показать код?
|
|||
11
Галахад
гуру
23.12.14
✎
07:32
|
ВЫБРАТЬ
Ном.Ссылка КАК Номенклатура ПОМЕСТИТЬ тТовары ИЗ Справочник.Номенклатура КАК Ном ГДЕ Ном.Ссылка В ИЕРАРХИИ(&Номенклатура) ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ПродажиОбороты.Период КАК Период, ПродажиОбороты.Подразделение КАК Подразделение, ПродажиОбороты.Номенклатура, ЕСТЬNULL(ПродажиОбороты.КоличествоОборот, 0) КАК КоличествоОборот, ЕСТЬNULL(ПродажиОбороты.СтоимостьОборот, 0) КАК СтоимостьОборот ПОМЕСТИТЬ тПродажи ИЗ РегистрНакопления.Продажи.Обороты( &Date1, &Date2, Месяц, Номенклатура В ИЕРАРХИИ (&Номенклатура) И НЕ Контрагент В ИЕРАРХИИ (&СобственныеКонтрагенты)) КАК ПродажиОбороты ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ПродажиОбороты.Период КАК Период, ПродажиОбороты.Подразделение КАК Подразделение, ЕСТЬNULL(ПродажиОбороты.КоличествоОборот, 0) КАК КоличествоОборот, ЕСТЬNULL(ПродажиОбороты.СтоимостьОборот, 0) КАК СтоимостьОборот, тТовары.Номенклатура ИЗ тТовары КАК тТовары ЛЕВОЕ СОЕДИНЕНИЕ тПродажи КАК ПродажиОбороты ПО тТовары.Номенклатура = ПродажиОбороты.Номенклатура УПОРЯДОЧИТЬ ПО ПродажиОбороты.Номенклатура.Наименование ИТОГИ СУММА(КоличествоОборот), СУММА(СтоимостьОборот) ПО Подразделение |
|||
12
Галахад
гуру
23.12.14
✎
07:33
|
(11) Для (10)
|
|||
13
чувак
23.12.14
✎
07:34
|
(11) Пропустил индексирование во временной таблице
|
|||
14
dmpl
23.12.14
✎
07:35
|
(13) Само проиндексируется как надо.
|
|||
15
чувак
23.12.14
✎
07:36
|
(14) Первый раз слышу
|
|||
16
Галахад
гуру
23.12.14
✎
07:37
|
(13) Добавил индекс. Скорость не изменилась.
|
|||
17
чувак
23.12.14
✎
07:38
|
(16) Тогда некуда дальше оптимизировать :) имхо
|
|||
18
dmpl
23.12.14
✎
07:41
|
(15) ИНДЕКСИРОВАТЬ ПО навредить гораздо легче, чем помочь. Достаточно указать неправильный порядок индексирования полей - и получишь тормоза. Не укажешь ИНДЕКСИРОВАТЬ ПО или укажешь правильный порядок - получишь одинаковую скорость в большинстве случаев.
(16) Что и требовалось доказать. |
|||
19
FireAlex
23.12.14
✎
07:41
|
в параметрах вирт таблицы замени
Номенклатура В ИЕРАРХИИ (&Номенклатура) на выборку из временной таблицы. "в иерархии" тяжелая операция. она у тебя два раза выполняется. |
|||
20
DrZombi
гуру
23.12.14
✎
07:42
|
(11) Зачем тебе "Номенклатура В ИЕРАРХИИ (&Номенклатура)"
Если ты уже получаешь все в ВТ "тТовары" :) |
|||
21
FireAlex
23.12.14
✎
07:42
|
(16) индекс по какому полю добавил?
|
|||
22
Галахад
гуру
23.12.14
✎
07:43
|
(19) В реальном запросе так оно и есть. См (0).
"В иерархии" это что бы в консоли проверить. |
|||
23
Andrewww123
23.12.14
✎
07:49
|
(0) А какое время выполнения запроса?
|
|||
24
break
23.12.14
✎
07:51
|
юзай физическую таблицу РегистрНакопления.Продажи
|
|||
25
Andrewww123
23.12.14
✎
07:52
|
(11) Почему
"УПОРЯДОЧИТЬ ПО ПродажиОбороты.Номенклатура.Наименование" А не "тТовары.Номенклатура.Наименование"? К быстродействию отношения не имеет, но всё же. |
|||
26
чувак
23.12.14
✎
07:53
|
(25) Зачем сортировка, если уже он сортирован?
|
|||
27
Andrewww123
23.12.14
✎
07:56
|
(26) Кто сортирован?
|
|||
28
ИсчадиеADO
23.12.14
✎
07:57
|
измерения и порядок их у регистра какие?
|
|||
29
чувак
23.12.14
✎
08:00
|
(27) По моему при соединении по полю Номенклатура это поле сортируется. К тому же если в регистре у реквизита стоит "Индексировать"
|
|||
30
Skom
23.12.14
✎
08:01
|
(0) за какой период делаешь? долго это сколько?
|
|||
31
SeraFim
23.12.14
✎
08:04
|
(14) >> Само проиндексируется как надо.
а можно поподробнее? Как оно само по себе проиндексируется? Где почитать? |
|||
32
Andrewww123
23.12.14
✎
08:07
|
(29) Да ну, нет такого.
|
|||
33
чувак
23.12.14
✎
08:10
|
(32) Не знаю как толковать Гилева, но он так и написал:
Поиск, при котором данные считываются в определенном порядке. Если результирующий набор данных должен быть отсортирован в порядке кластеризованного индекса, то сортировка не нужна, поскольку результирующий набор данных уже заранее отсортирован. Например, если кластеризованный индекс создан по колонкам lastname (фамилия), firstname (имя), а для приложения требуется сортировка по фамилии и затем по имени, то здесь нет необходимости добавлять инструкцию ORDER BY. Правда при всей полезности индексов, есть одно очень важное НО – индекс должен быть «эффективно используемым» и должен позволять находить данные с использованием меньшего числа операций ввода-вывода и объема системных ресурсов. |
|||
34
чувак
23.12.14
✎
08:12
|
В запросах кода конфигурации использование индексов зависит условий, на которые есть смысл обратить внимание:
ВЫБРАТЬ … ИЗ … ГДЕ <условие> СОЕДИНЕНИЕ … ПО <условие> ВЫБРАТЬ … ИЗ <ВиртуальнаяТаблица>(, <условие>) ИМЕЮЩИЕ <условие> Если в системе нет индекса, который мог бы эффективно использоваться для данного запроса, то необходимо рассмотреть одну из следующих возможностей: Установить свойство «Индексировать» Изменить порядок следования измерений в регистре |
|||
35
Fragster
гуру
23.12.14
✎
08:20
|
ветку не читал, но в запросе из (0) сортировать надо по наименованию из справочника, а не из регистра
|
|||
36
Andrewww123
23.12.14
✎
08:20
|
(33) Может быть, это работает если выбирать данные из одной таблицы регистра накопления? Но в нашем примере же соединение. Если предположить что в таблице "тПродажи" пусто, то как результирующий набор данных отсортируется?
|
|||
37
Fragster
гуру
23.12.14
✎
08:22
|
(35)+ после этого - возможно вынести виртуальную таблицу во временную + индекс по номенклатуре в ней, а её уже соединять со справочником
|
|||
38
чувак
23.12.14
✎
08:25
|
(36) Начнем с того что виртуальная таблица уже отсортирована. Или не согласен?
|
|||
39
Лефмихалыч
23.12.14
✎
08:28
|
(0) явных косяков нет, так что без плана запроса - это гадание на кофейной гуще
|
|||
40
ам794123
23.12.14
✎
08:28
|
Когда я вижу в запросе такие конструкции:
ПродажиОбороты.Номенклатура.Наименование меня прям колбасит. |
|||
41
Andrewww123
23.12.14
✎
08:29
|
(38) Допустим. Но выбираешь строки ты из таблицы "тТовары", которая не отсортирована. А к ней присоединяешь отсортированную виртуальную таблицу. В честь чего в первой таблице изменится порядок строк? :)
|
|||
42
Лефмихалыч
23.12.14
✎
08:32
|
(40) существенно не повлияет даже, если убрать совсем сортировку
|
|||
43
ам794123
23.12.14
✎
08:32
|
(42) да ладно?
|
|||
44
Лефмихалыч
23.12.14
✎
08:35
|
(43) наименование - это индекс. Ну, давай у автора спросим, чтобы не гадать.
АААВТООООР! Пробовал сортировку выкосить? |
|||
45
Матиус
23.12.14
✎
08:36
|
ВЫБРАТЬ БЫСТРО
ПродажиОбороты.Период КАК Период, ... |
|||
46
чувак
23.12.14
✎
08:37
|
(41) Ладно. У меня ща после соединения результат получился отсортированным без оператора сортировки
|
|||
47
Euguln
23.12.14
✎
08:38
|
Можно местами поменять :
Подразделение В (&Подразделение) И Номенклатура В (&Номенклатура) |
|||
48
чувак
23.12.14
✎
08:39
|
(47) А может в регистре они так и расположены?
|
|||
49
Euguln
23.12.14
✎
08:40
|
(48) Значит регистр тупой
|
|||
50
unregistered
23.12.14
✎
08:44
|
(47) >> Можно местами поменять
Тогда уж лучше так: (Подразделение, Номенклатура) В (ВЫБРАТЬ РАЗЛИЧНЫЕ &Подразделение КАК Подразделение, ВременнаяТаблицаНоменклатуры.Номенклатура КАК Номенклатура ИЗ ВременнаяТаблицаНоменклатуры КАК ВременнаяТаблицаНоменклатуры) |
|||
51
Матиус
23.12.14
✎
08:47
|
Вот людям заняться нечем
|
|||
52
Skom
23.12.14
✎
08:48
|
(0) еще раз, в чем вопрос стоит? долго это сколько? запрос выполняется не 3 секунды, а 15-20? для отчета это не существенно.
Стоит ли решение задачи потраченного времени? Потому как сам запрос, как уже сказал (39), вполне правильно составлен. |
|||
53
dk
23.12.14
✎
08:49
|
без упорядочить и итоги скока формируется?
|
|||
54
dmpl
23.12.14
✎
08:51
|
(31) Это опыт. Добавление ИНДЕКСИРОВАТЬ ПО чаще всего ничего не меняет (если грамотно добавлять), иногда ухудшает скорость до нескольких раз (если ошибся с индексами). Улучшения тоже бывают, но весьма редко - когда оптимизатор не справляется.
|
|||
55
чувак
23.12.14
✎
08:53
|
(54) т.е. Гилев не прав? Вот его мнение:
"Обратите внимание на то, что для оптимизации работы запроса почти всегда необходимо проиндексировать создаваемую временную таблицу. Индекс должен быть подобран таким образом, чтобы СУБД могла его использовать при соединении с временной таблицей. То есть, в индексе должны быть перечислены все поля, которые используются в условии соединения." |
|||
56
dk
23.12.14
✎
08:58
|
имхо индексы отлично отрабатывают на таблицах с тысячами записей
а если в таблице до 100 элементов, то может и медленнее получится |
|||
57
SeraFim
23.12.14
✎
08:59
|
(54) имхо, просто объемы не те, чтобы увидеть разницу
|
|||
58
чувак
23.12.14
✎
09:00
|
(56) Ну раз автор решил постит эту ветку походу у него дохренище записей.
|
|||
59
StaticUnsafe
23.12.14
✎
09:07
|
ВЫБРАТЬ ПОБЫСТРЕЕ
|
|||
60
SeraFim
23.12.14
✎
09:13
|
(59) волшебное слово забыл
|
|||
61
AlexITGround
23.12.14
✎
09:23
|
(52) (56) Вот они правильные ответы.
"Оптимизировать код можно бесконечно, надо знать когда остановиться" (с) я не помню чьи слова, сорри |
|||
62
НЕА123
23.12.14
✎
09:35
|
(0)
заменить ГДЕ на И ..... ПО (ПродажиОбороты.Номенклатура = Ном.Ссылка) ГДЕ Ном.Ссылка В(&Номенклатура) ПО (ПродажиОбороты.Номенклатура = Ном.Ссылка) И Ном.Ссылка В(&Номенклатура) |
|||
63
dmpl
23.12.14
✎
09:43
|
(55) Вопрос в том, когда он это писал (для какой версии платформы). Плюс в некоторых сложных случаях прямое указание индексов может быть необходимо, но таких случаев немного.
А вот если сделать ИНДЕКСИРОВАТЬ ПО Организация, Подразделение, а потом используешь поля не в том порядке (типа, Подразделение = Подразделение И Организация = Организация) - то можно словить тормоза из-за того что индекс построить автоматом ты не дал, а сам указал тот индекс, который использовать не получится. (57) 200 Гб база с сотнями тысяч-миллионами записей пойдет? Когда при неправильном указании индекса время выполнения запроса 20-30 секунд, а при правильном - около 1-2 секунд? Статистически разница между правильным индексированием и неуказанным индексом меньше 5% в большинстве случаев. (62) Вылезет вся номенклатура. |
|||
64
чувак
23.12.14
✎
09:47
|
(63) Ну тогда начерти бедному автору окончательный оптимальный запрос. И тему закроем
|
|||
65
H A D G E H O G s
23.12.14
✎
09:50
|
А вот если сделать ИНДЕКСИРОВАТЬ ПО Организация, Подразделение, а потом используешь поля не в том порядке (типа, Подразделение = Подразделение И Организация = Организация) - то можно словить тормоза из-за того что индекс построить автоматом ты не дал, а сам указал тот индекс, который использовать не получится.
Адская глупость |
|||
66
dmpl
23.12.14
✎
09:53
|
(65) Я тоже так думал, пока не столкнулся с тем, что запрос по 30 секунд выполнялся. Меняешь порядок условий через И, или порядок полей в ИНДЕКСИРОВАТЬ ПО - и все летает. Убираешь ИНДЕКСИРОВАТЬ ПО - тоже все летает, все зависимости от порядка условий.
|
|||
67
ViSo76
23.12.14
✎
09:59
|
Попробуй так:
ВЫБРАТЬ ЕСТЬNULL( тзПродажи.Период, &Date1 ) КАК Период, СпрНоменклатура.Ссылка КАК Номенклатура, ЕСТЬNULL( тзПродажи.КоличествоОборот, 0 ) КАК КоличествоОборот, ЕСТЬNULL( тзПродажи.СтоимостьОборот, 0 ) КАК СтоимостьОборот ИЗ Справочник.Номенклатура КАК СпрНоменклатура ЛЕВОЕ СОЕДИНЕНИЕ ( ВЫБРАТЬ НАЧАЛОПЕРИОДА( Период, Месяц ) КАК Период, Подразделение, Номенклатура, СУММА( Количество ) КАК КоличествоОборот, СУММА( Стоимость ) КАК СтоимостьОборот ИЗ РегистрНакопления.Продажи ГДЕ Период МЕЖДУ &Date1 И &Date2 И Номенклатура В ( &Номенклатура ) И Подразделение В ( &Подразделение ) СГРУППИРОВАТЬ ПО Номенклатура, НАЧАЛОПЕРИОДА( Период, Месяц ), Подразделение ) КАК тзПродажи ПО тзПродажи.Номенклатура = СпрНоменклатура.Ссылка ГДЕ СпрНоменклатура.Ссылка В ( &Номенклатура ) УПОРЯДОЧИТЬ ПО СпрНоменклатура.Наименование ИТОГИ СУММА( тзПродажи.КоличествоОборот ), СУММА( тзПродажи.СтоимостьОборот ) ПО СпрНоменклатура.Ссылка, тзПродажи.Подразделение PS: Конфы как у тебя нет, проверить запрос не могу: |
|||
68
AlexITGround
23.12.14
✎
10:05
|
(67) Если таблицы толстые, то срочно "СпрНоменклатура.Ссылка В ( &Номенклатура )" заменить на внутреннее соединение!
|
|||
69
ViSo76
23.12.14
✎
10:20
|
(68) Думаю что это не поможет.
Так как во первых в начале идёт использование индекса периода, а уже потом идёт использование индекса связанного с номенклатурой. Во вторых внутренним результирующий запрос будет уменьшен, что явно не в планах автора, как я понял ему нужна вся номенклатура из списка. Изменённый запрос выглядит примерно так, но я не думаю что он будет быстрее: ВЫБРАТЬ НАЧАЛОПЕРИОДА( ЕСТЬNULL( тзПродажи.Период, &Date1 ), Месяц ) КАК Период, СпрНоменклатура.Ссылка КАК Номенклатура, ЕСТЬNULL( тзПродажи.Количество, 0 ) КАК КоличествоОборот, ЕСТЬNULL( тзПродажи.Стоимость, 0 ) КАК СтоимостьОборот ИЗ Справочник.Номенклатура КАК СпрНоменклатура ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Продажи КАК тзПродажи ПО тзПродажи.Период МЕЖДУ &Date1 И &Date2 И тзПродажи.Номенклатура = СпрНоменклатура.Ссылка И тзПродажи.Подразделение В ( &Подразделение ) ГДЕ СпрНоменклатура.Ссылка В ( &Номенклатура ) СГРУППИРОВАТЬ ПО СпрНоменклатура.Ссылка, НАЧАЛОПЕРИОДА( ЕСТЬNULL( тзПродажи.Период, &Date1 ), Месяц ), тзПродажи.Подразделение УПОРЯДОЧИТЬ ПО СпрНоменклатура.Наименование ИТОГИ СУММА( тзПродажи.КоличествоОборот ), СУММА( тзПродажи.СтоимостьОборот ) ПО СпрНоменклатура.Ссылка, тзПродажи.Подразделение |
|||
70
НЕА123
23.12.14
✎
10:24
|
почему условие
СпрНоменклатура.Ссылка В ( &Номенклатура ) суете в ГДЕ, а не ПО? ЗЫ не понимаю, честно. |
|||
71
eklmn
гуру
23.12.14
✎
10:26
|
"НУ ПОЖАЛУЙСТА" в конце запроса забыли
|
|||
72
ViSo76
23.12.14
✎
10:26
|
До соединения идёт фильтрация номенклатуры ( СпрНоменклатура ), далее происходит соединение с регистром накопления ( тзПродажи ), в начале большую таблицу отсекает по периоду, ну а далее уже идёт урезание до нужных номенклатур в строке
И тзПродажи.Номенклатура = СпрНоменклатура.Ссылка |
|||
73
Любопытная
23.12.14
✎
10:28
|
(72) "До соединения идёт фильтрация номенклатуры ( СпрНоменклатура )" - это где?
|
|||
74
ViSo76
23.12.14
✎
10:29
|
ИЗ
Справочник.Номенклатура КАК СпрНоменклатура ГДЕ СпрНоменклатура.Ссылка В ( &Номенклатура ) Это отрабатывает первым оптимизатором запроса далее идёт соединение |
|||
75
Любопытная
23.12.14
✎
10:30
|
Это для меня что-то новенькое. Всегда была уверена, что условия накладываются на результирующую таблицу, т.е. после соединения
|
|||
76
ViSo76
23.12.14
✎
10:34
|
Проверьте скорость выполнения двух моих запросов на ( холодных данных )
да в первом запросе нужно подправить на: ЕСТЬNULL( тзПродажи.Период, НАЧАЛОПЕРИОДА( &Date1, Месяц ) ) КАК Период, вместо: ЕСТЬNULL( тзПродажи.Период, &Date1 ) КАК Период, |
|||
77
ViSo76
23.12.14
✎
10:38
|
Если можно урезать главную таблицу до соединения, то оптимизатор, я думаю, это сделает, во всяком случае для MSSQL это так, для файловой я думаю что это примерно так же
|
|||
78
Любопытная
23.12.14
✎
10:40
|
(77) Вот здесь для тех, кто блондинки - кто такой оптимизатор? :)
|
|||
79
ViSo76
23.12.14
✎
10:45
|
В начале запрос парсится, то есть переводится с текста в инструкции что нужно делать, далее включается как я его называю оптимизатор, который строит план выполнения запроса, т.е. в какой последовательности исполнять команды, чтобы выборка данных бала максимально быстрой ( если вкратце )
|
|||
80
НЕА123
23.12.14
✎
10:48
|
(79)
проверил бы, для начала. (78)+1 |
|||
81
ViSo76
23.12.14
✎
10:50
|
(80) Нет конфы предлагаю проверить самим, я и так уже в рот положил, а челюстями поработайте пожалуйста сами.
|
|||
82
Любопытная
23.12.14
✎
10:50
|
(79) Ну вот у меня есть консоль запросов, в которой я могу посмотреть анализ вложенных запросов - все таблицы, которые выбираются.
У меня торговли нет под рукой, так что я буду сотрудниками оперировать: ВЫБРАТЬ СотрудникиОрганизаций.Ссылка, РабочееВремяРаботниковОрганизацийОбороты.ДнейОборот, РабочееВремяРаботниковОрганизацийОбороты.ЧасовОборот, РабочееВремяРаботниковОрганизацийОбороты.Организация ИЗ Справочник.СотрудникиОрганизаций КАК СотрудникиОрганизаций ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.РабочееВремяРаботниковОрганизаций.Обороты( &НачалоПериода, &КонецПериода, Период, Сотрудник В (&МассивСотрудников)) КАК РабочееВремяРаботниковОрганизацийОбороты ПО РабочееВремяРаботниковОрганизацийОбороты.Сотрудник = СотрудникиОрганизаций.Ссылка ГДЕ СотрудникиОрганизаций.Ссылка В(&МассивСотрудников) И вот такой вариант: ВЫБРАТЬ СотрудникиОрганизаций.Ссылка ПОМЕСТИТЬ ВТ_Сотрудники ИЗ Справочник.СотрудникиОрганизаций КАК СотрудникиОрганизаций ГДЕ СотрудникиОрганизаций.Ссылка В(&МассивСотрудников) ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ВТ_Сотрудники.Ссылка, РабочееВремяРаботниковОрганизацийОбороты.Организация, РабочееВремяРаботниковОрганизацийОбороты.ДнейОборот ИЗ ВТ_Сотрудники КАК ВТ_Сотрудники ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.РабочееВремяРаботниковОрганизаций.Обороты(&НачалоПериода, &КонецПериода, Период, Сотрудник В (&МассивСотрудников)) КАК РабочееВремяРаботниковОрганизацийОбороты ПО ВТ_Сотрудники.Ссылка = РабочееВремяРаботниковОрганизацийОбороты.Сотрудник |
|||
83
Любопытная
23.12.14
✎
10:52
|
+(82) В первом варианте таблица СотрудникиОрганизаций тупо тащит ВООБЩЕ ВСЕ записи из справочника, а во втором ВТ_Сотрудники имеет уже только то, что отобрано условием
|
|||
84
Любопытная
23.12.14
✎
10:53
|
База у меня файловая естественно. Но вывод для меня совершенно однозначный: условия в запросах отрабатывают ПОСЛЕ соединения таблиц
|
|||
85
НЕА123
23.12.14
✎
10:54
|
(84)
в скуле то же самое. чудес не бывает.(с) |
|||
86
Бубка Гоп
23.12.14
✎
10:54
|
(84) а как же Великий Оптимизатор? он за нас не подумал и не отсек при объединении ненужные строки сотрудников?
|
|||
87
Бубка Гоп
23.12.14
✎
10:55
|
а, у вас левое, тогда не отсек, не заметил =)
|
|||
88
Любопытная
23.12.14
✎
10:56
|
(86) не знаю, не могу посмотреть таблица после соединения, но до условия.
(87) так в (0) тоже левое, в том и соль, что ему весь справочник нужен |
|||
89
Бубка Гоп
23.12.14
✎
11:01
|
(88)
так вместо накладывания условия после объединения ГДЕ Ном.Ссылка В(&Номенклатура) не проще ли использовать внутреннее соединение, например, убрав тем самым лишнее условие? |
|||
90
Любопытная
23.12.14
✎
11:02
|
(89) Эммм... человеку нужно, чтобы номенклатура вывелась даже если движений не было. Вероятно поэтому левое, а не внутреннее
|
|||
91
Бубка Гоп
23.12.14
✎
11:03
|
ему весь справочник нужен
и ГДЕ Ном.Ссылка В(&Номенклатура) никак не могу согласовать в голове две эти вещи |
|||
92
krbIso
23.12.14
✎
11:03
|
хорошо вбросил
а нужно ли его торопить? |
|||
93
Любопытная
23.12.14
✎
11:03
|
(91) ну елки. Не весь справочник, а весь массив номенклатуры. Не придирайтесь к словам
|
|||
94
ViSo76
23.12.14
✎
11:04
|
(89) Нахрена тогда вообще с номенклатурой соединять если нужно тупо то что в обороте уменьшенное на список, а не полный список?
|
|||
95
AlexITGround
23.12.14
✎
11:04
|
(90) Мадам, если пишется конструкция В (&Номенклатура), то это ничто иное как внутреннее соединение.
|
|||
96
НЕА123
23.12.14
✎
11:05
|
(89)
может и так. автор знает. |
|||
97
Бубка Гоп
23.12.14
✎
11:06
|
(94) +
Вот мы и приходим потихоньку к решению проблемы автора |
|||
98
Любопытная
23.12.14
✎
11:07
|
(95) А если эта конструкция левым соединением к справочнику цепляется?
|
|||
99
НЕА123
23.12.14
✎
11:07
|
(95)
скорее всего, да. но не всегда. может оказаться, что в &Номенклатура присутствуют ссылки, которых нет в справочнике (удалены). |
|||
100
Любопытная
23.12.14
✎
11:07
|
(94) Нужно всю нужную номенклатуру вне зависимости от наличия/отсутствия оборотов по ней.
Вы чего? Уже отдыхаете? |
|||
101
Крошка Ру
23.12.14
✎
11:08
|
(95) Оригинальная трактовка внутреннего соединения.
(94) А с номенклатурой соединять, видимо потому, что по списку нужны все обороты, в т.ч. нулевые, а в оборотах их нет. |
|||
102
Любопытная
23.12.14
✎
11:08
|
И вообще, чего я распинаюсь? Накинулись, блин. Грузите мозг ТСу, это его проблемы
|
|||
103
Бубка Гоп
23.12.14
✎
11:08
|
а если тс все же угодно выбирать !весь мать его огромный справочник номенклатура! тогда ускорить данный запрос мы сможем на жалкие доли процента, чтобы мы тут не нафантазировали
|
|||
104
НЕА123
23.12.14
✎
11:09
|
(100)+1
(99) сторно. |
|||
105
Крошка Ру
23.12.14
✎
11:09
|
(99)>>может оказаться, что в &Номенклатура присутствуют ссылки,
которых нет в справочнике (удалены). Случайно забрели из другой базы? |
|||
106
Крошка Ру
23.12.14
✎
11:10
|
(103) Ну вот, первая здравая мысль за всю ветку.
|
|||
107
Бубка Гоп
23.12.14
✎
11:10
|
(100) Вот, мы уже начали ванговать что собственно ТС хотел получить данным запросом =)
|
|||
108
ViSo76
23.12.14
✎
11:10
|
(100) Нет я то как раз в курсе что нужно и 2 моих запроса говорят об этом
|
|||
109
НЕА123
23.12.14
✎
11:11
|
(105)
удалили программно. ну, может движения и "Случайно забрели из другой базы". |
|||
110
Любопытная
23.12.14
✎
11:11
|
(108) Да, мы с вами обсуждали лишь последовательность действий :)
|
|||
111
AlexITGround
23.12.14
✎
11:11
|
(98) Не имеет значения, просто подумайте, что значит "В()". (99) Не будем на столько извращаться :)
|
|||
112
ViSo76
23.12.14
✎
11:13
|
(89) По поводу ГДЕ в запросе с фильтрацией номенклатуры. Кто нибудь может привести план исполнения запроса в MS SQL чтобы явно показать что номенклатура фильтруется после соединения а не до
|
|||
113
AlexITGround
23.12.14
✎
11:14
|
(106) Не первая :) см 52, 56, 61
|
|||
114
IШаман
23.12.14
✎
11:15
|
(111) Я прям замер во внимании, про левое соедение я уже узнал много нового осталось получить альтернативное знание по оператору В
|
|||
115
Жан Пердежон
23.12.14
✎
11:15
|
(0) стандартные советы испробовал: вирт. таблицу поместить во временную с индексом, убрать использование реквизитов через точку (в сортировке) и т.д.?
странно, что еще никто про агрегаты не вспомнил |
|||
116
чувак
23.12.14
✎
11:16
|
(112) в методичках юзай, найдешь
|
|||
117
Любопытная
23.12.14
✎
11:16
|
(111) ЧЕго вы ко мне прицепились?
|
|||
118
AlexITGround
23.12.14
✎
11:17
|
(114) Я не сказал, что оператор В и внутреннее соединение - это одно и тоже, я порекомендовал заменить В на Внутр. соединение, т.к. на больших таблицах это действительно даст ощутимый прирост в производительности. В 95 посте я этого не расписал, сорри, но я думал и так понятно, что это разные вещи.
|
|||
119
H A D G E H O G s
23.12.14
✎
11:19
|
83% времени выполнения уходит на поиск по кластерному индексу по таблице оборотов. Вы жжете ребятушки, что до сих пор профайлер не запустили.
Ускорить практически нереально, единственная сложность - в остаточный предикат поиска почему то попала номенклатура и подразделение, а не только подразделение. |
|||
120
Ksandr
23.12.14
✎
11:21
|
Время выполнения в секундах уже озвучивали?
|
|||
122
H A D G E H O G s
23.12.14
✎
11:22
|
Вот эта строчка
|--Clustered Index Seek(OBJECT:([testbase].[dbo].[_AccumRgTn19349].[_Accum19349_ByDims_TRRRRRRRRRN] AS [T3]), SEEK:([T3].[_Period] > [Expr1047] AND [T3].[_Period] < [Expr1048]), WHERE:([testbase].[dbo].[_AccumRgTn19349].[_Fld19329RRef] as [T3].[_Fld19329RRef]=[@P3] AND [testbase].[dbo].[_AccumRgTn19349].[_Fld19334RRef] as [T3].[_Fld19334RRef]=[@P4]) ORDERED FORWARD) Непонятно вот это: WHERE:([testbase].[dbo].[_AccumRgTn19349].[_Fld19329RRef] as [T3].[_Fld19329RRef]=[@P3] Ибо Номенклатура идет сразу за периодом в кластерном индексе. |
|||
123
Бубка Гоп
23.12.14
✎
11:28
|
(115)
так вроде это уже предлагали, не? |
|||
124
ViSo76
23.12.14
✎
11:32
|
(123) начнём с того что виртуальных таблиц обороты нет и они вычисляются, в моём запросе обращений в базу 1 шт. это уже немного увеличивает скорость, далее у автора непонятно какой построится запрос в результате этого:
УПОРЯДОЧИТЬ ПО ПродажиОбороты.Номенклатура.Наименование и т.д. |
|||
125
Fragster
гуру
23.12.14
✎
11:35
|
а про добавить агрегаты с нужными измерениями и периодичностью кто-нибудь вспомнил? кто-нибудь ими вообще пользуется? ;)
|
|||
126
Жан Пердежон
23.12.14
✎
11:36
|
(125) да, ты немного опоздал; теперь ждем ТС
|
|||
127
чувак
23.12.14
✎
11:37
|
(125) в уже работающей базе накрутить агрегаты разве кошерно?
|
|||
128
ViSo76
23.12.14
✎
11:38
|
(122) Ты можешь план исполнения моих двух запросов привести?
|
|||
129
Fragster
гуру
23.12.14
✎
11:40
|
(127) ну там же есть функции типа
РегистрНакопленияМенеджер.<Имя регистра накопления>.ОпределитьОптимальныеАгрегаты (AccumulationRegisterManager.<Имя регистра накопления>.DetermineOptimalAggregates) РегистрНакопленияМенеджер.<Имя регистра накопления> (AccumulationRegisterManager.<Имя регистра накопления>) ОпределитьОптимальныеАгрегаты (DetermineOptimalAggregates) Синтаксис: ОпределитьОптимальныеАгрегаты(<МаксимальныйОтносительныйРазмер>) Параметры: <МаксимальныйОтносительныйРазмер> (необязательный) Тип: Число. Максимальная сумма размеров агрегатов в % от таблицы движений. Если не указан или равен нулю, то не накладывается ограничений на размер агрегатов. Значение по умолчанию: 0 Возвращаемое значение: Тип: ИнформацияОбАгрегатах. Описание: Выполняет построение оптимальных агрегатов. Доступность: Сервер, толстый клиент, внешнее соединение. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |