|
Почему виртуальная таблица регистра (исп. ЗАПИСЬ) намного эффективней физической | ☑ | ||
---|---|---|---|---|
0
DirecTwiX
09.05.13
✎
20:49
|
Нужно было подсчитать количество проводок, сделанных определённым человеком (давайте сейчас опять не будем углубляться в то, зачем мне было нужно это).
Сначала было так:
Решил попробовать переписать через физическую таблицу. Как-то так:
|
|||
12
Пеппи
09.05.13
✎
21:47
|
(11) ЖКК кстати читтть надо))) "Где" отбирает по уже всем отобранным записям а виртуальные сразу отбирают с отбором) Понятно?)
|
|||
13
Флудер
09.05.13
✎
21:50
|
(10) Это частый вопрос на собеседованиях, да) Вопрос де факто на понимание запросов)
|
|||
14
milan
09.05.13
✎
21:51
|
(12) все ослепли от блеска ;)
|
|||
15
DirecTwiX
09.05.13
✎
21:52
|
(12) Желудочно-кишечные кровотечения?
https://www.google.ru/search?q=жкк&aq=f&oq=жкк&aqs=chrome.0.57j0l3j61l2.590j0&sourceid=chrome&ie=UTF-8 В любом случае жесть. Грустно за 1С. На измерения можно было и индекс повесить. А за объяснение Спасибо! |
|||
16
Пеппи
09.05.13
✎
21:52
|
(14) сочувствую)))
(13) бывает что такие глупые вопросы задают что остается что молча встать и уйти с такого собеседования))) |
|||
17
Флудер
09.05.13
✎
21:54
|
(16) Ну всяко бывает. Хотя если спросят сколько будет 2+2, то у 1С это не всегда очевидно)))
|
|||
18
Пеппи
09.05.13
✎
21:56
|
(15) При чем здесь индекс,если отбираются вначале все записи и потом только отбор применяется?
(17) ? |
|||
19
GANR
09.05.13
✎
21:57
|
Профайлер что говорит?
|
|||
20
Пеппи
09.05.13
✎
21:59
|
(19) он молчит))
|
|||
21
Флудер
09.05.13
✎
21:59
|
(18) 2+2=3,999999999999999999999999
|
|||
22
Пеппи
09.05.13
✎
22:02
|
(21) Это не только в 1с!)
|
|||
23
milan
09.05.13
✎
22:05
|
(18) что значит все записи ? В первом запросе отбор только на период установлен, преиодичность регистратор колбасит таблицу движений, то же самое наблюдаем о втором запросе, почему он работает дольше - не очень понятно.
|
|||
24
Пеппи
09.05.13
✎
22:07
|
(23) Из разных таблиц берутся данные все таки.
|
|||
25
milan
09.05.13
✎
22:08
|
(24) брались бы из разных - не возникло бы вопроса
|
|||
26
Пеппи
09.05.13
✎
22:13
|
(25) вопрос от незнания все таки
|
|||
27
DirecTwiX
09.05.13
✎
22:16
|
(22) Где ещё? А как по-твоему тогда индексы используются? Которые являются неотъемлемой частью всех бд?
|
|||
28
Пеппи
09.05.13
✎
22:21
|
(27) лекции читать не собираюсь) уж извини однако) ученье свет!))
|
|||
29
DirecTwiX
09.05.13
✎
22:23
|
(28) На лекцию и не претендую.
Так всё-таки где же ещё такое используется? |
|||
30
Флудер
09.05.13
✎
22:26
|
(29) Таки претендуешь. Почитать инфу о СУБД не предлагать?
|
|||
31
milan
09.05.13
✎
22:27
|
(29) я бы уже начал смотреть как запросы транслируются в скл
И результат запросов одинаковый ? |
|||
32
DirecTwiX
09.05.13
✎
22:30
|
+ И ты хочешь сказать, что время выборки документов за определенную дату будет рости с ростом этих документов? И когда документов станет порядка 5000, запрос будет выполняться больше минуты (как это происходит со вторым запросом. Проводок больше 5к за период было)
|
|||
33
dmpl
09.05.13
✎
22:30
|
(0) Потому что регистры бухгалтерии в 1С 8.x хреново реализованы.
|
|||
34
DirecTwiX
09.05.13
✎
22:30
|
расти*
|
|||
35
dmpl
09.05.13
✎
22:32
|
(32) Я как-то сдуру запустил выборку из РБ на 1 500 000 записей. 48 минут запрос исполнялся. Из виртуальной таблицы те же 1,5 млн. записей выбрались за минуту.
|
|||
36
ДенисЧ
09.05.13
✎
22:32
|
(32) 5к проводов - это ничто
|
|||
37
milan
09.05.13
✎
22:36
|
Странно это все ;)
|
|||
38
DirecTwiX
09.05.13
✎
22:38
|
(36) Суть не в количестве проводок. За определённый период было 5к проводок. Первый запрос выполнялся моментально, второй - около пяти минут.
(30) О чём вообще речь? Хочется поспорить о чём угодно? Я не говорю, что знаю все токности работы индексов, но знаю примерно представляю как они работают и даже уверен, что напишу индекс к базе. (28) Так что на счёт выборки из документов за определённый период? Там сначала тоже все записи выберутся? |
|||
39
Пеппи
09.05.13
✎
22:40
|
(38) выборка из документов? о_О)))
|
|||
40
DirecTwiX
09.05.13
✎
22:43
|
(39) Что такое? Нужно получить все ПТУ за квартал, например. Время будет расти с количеством документов (условие то же: ГДЕ ПТУ.Дата между НП и КП)?
|
|||
41
ilya_i
09.05.13
✎
22:46
|
Может виртуальная таблица лучше использует индекс. Профайлер будешь смотреть?
|
|||
42
dmpl
09.05.13
✎
22:46
|
(41) Судя по скорости работы с реальной таблицей - она вообще не использует индекс.
|
|||
43
milan
09.05.13
✎
22:56
|
(40) так .период между или пту.дата между ?
(42) ну да и скулю не разрешает ;) |
|||
44
DirecTwiX
09.05.13
✎
23:03
|
(43) Период. Про ПТУ - это вопрос на засыпку к Пеппи)
|
|||
45
dmpl
09.05.13
✎
23:08
|
(43) Ну... не запрещает, но активно мешает.
48 минут на выборку всего 1,5 млн. записей - не думаю, что даже при отсутствии индекса это адекватное время для выборки. Потому что те же регистры накопления при непопадании в индекс аналогичный объем записей выбирают 1 минуту максимум. |
|||
46
hhhh
10.05.13
✎
00:08
|
(44) реальная таблица обычно в 60 раз медленнее виртуальной. Очень легко ориентироваться, например в виртиально выполняется 10 секунд, значит в реальной 10 минут. То что у тебя всего в 10 раз разница, так это замечательно, значит регистр спроектирован великолепно.
|
|||
47
DirecTwiX
10.05.13
✎
00:19
|
(46) Так почему так?
Что будет в случае документов из (32) |
|||
48
Andreyyy
10.05.13
✎
00:42
|
(47) Попробуй во второй запрос условие по периоду воткнуть в "ГДЕ"
|
|||
49
Andreyyy
10.05.13
✎
00:43
|
+(48) Конечно же в первый.
|
|||
50
Dethmont
10.05.13
✎
01:08
|
||||
51
Ненавижу 1С
гуру
10.05.13
✎
01:23
|
поставим вопрос прямо: чем отличается нативная таблица, от виртуальной с периодичностью запись с точки зрения оборотов
|
|||
52
hhhh
10.05.13
✎
20:16
|
(47) в реальной таблице может быть 100 строчек, а в виртияльной одна свернутая.
|
|||
53
acsent
10.05.13
✎
21:26
|
Хозрасчетный.Дата
ДАТА?????????? |
|||
54
acsent
10.05.13
✎
21:26
|
Как ты сдал спеца по платформе?????
|
|||
55
acsent
10.05.13
✎
21:27
|
подозреваю, что ты сделал
Хозрасчетный.Регистратор.Дата между &НП и &КП |
|||
56
mihan007
11.05.13
✎
10:12
|
если профайлером посмотреть тогда
там вложенный запрос select ... from (select .. from .. group by ) если условие задать в виртуальной таблице тогда отбор where будет во вложенном запросе, а если задать в ГДЕ то отбор будет во внешнем запросе |
|||
57
Wern
11.05.13
✎
11:17
|
В первом случае строится запрос к таблице оборотов между счетами, во второй к полной таблице проводок. Естественно первый гараздо быстрее
|
|||
58
DirecTwiX
11.05.13
✎
18:22
|
(52) Так стоит режим ЗАПИСЬ. Что там можно свернуть?
(55) Воу-воу, петросян, полегче со знаками вопроса. В начале ответил, что период - писал от руки. Суть не изменилась (56) Вот это больше похоже на правду. А что там за вложенный запрос? В случае документов его, подозреваю, не будет.. Спасибо |
|||
59
milan
11.05.13
✎
19:10
|
(58) не томи общественность, запусти профилер или в консоли какой, которая умеет показывать результирующий запрос
|
|||
60
ИсчадиеADO
11.05.13
✎
19:15
|
запрос к виртуальной таблице построится на основании физической в данном случае. Но в 1ом варианте отбор по дате идет сразу, а во втором идет неявное соединение всех регистраторов, о чем и грил (7).
П.С. Фига ты описался (8)... |
|||
61
ИсчадиеADO
11.05.13
✎
19:16
|
(54) на стенах тоже пишут))
|
|||
62
PR
11.05.13
✎
19:17
|
(0) Что за дата во втором запросе? Почему не период?
|
|||
63
DirecTwiX
11.05.13
✎
20:07
|
(62) Писал сразу в тему. Речь про Период
(60) В обоих запросах "неявное соединение" присутсвует... |
|||
64
ИсчадиеADO
11.05.13
✎
20:17
|
(63) ну вот ты представь себя на месте бедного сервера. Тебе дали 2 задачи: 1ая выбрать документы по дате, а потом к выбранной паре-другой документов сделать соединение; и сделать соединение для всех, а потом выбрать по дате? ты чо для себя ыберешь
|
|||
65
unregistered
11.05.13
✎
20:17
|
Подозреваю, что если убрать из текста обоих запросов
ГДЕ ИмяТаблицы.Регистратор.Ответсвенный = &Ответственный то второй запрос будет выполняться быстрее. PS При чем тут индексы вообще не понял |
|||
66
unregistered
11.05.13
✎
20:26
|
(12) Указание параметров виртуальной таблицы тут вообще не при чем.
Причина тормозов в неявном соединении с таблицами всех документов-регистраторов данного регистра. |
|||
67
DirecTwiX
11.05.13
✎
20:46
|
(66) Так в первом запросе присутсвует такое же соединение. Разве нет?
|
|||
68
DirecTwiX
11.05.13
✎
20:49
|
(64) По-моему, бред. Т.е. если сначала вложенным запросом выбрать по дате, а сверху шлифануть ответсвенным, то время сократится в разу?
|
|||
69
ИсчадиеADO
11.05.13
✎
20:53
|
(68) да
|
|||
70
ИсчадиеADO
11.05.13
✎
20:57
|
(67) в первом а) выбираются доки по индекс (у физич. таблицы индекс в т.ч. по периоду б) строится соединение, причем левые данные по не подошедшим регистраторам откидываются сразу в) для маленькой таблицы выполняется условие
2) а)выбираются все записи б) строятся все соединения в) для всей портянки смотрим условие |
|||
71
Sorm
11.05.13
✎
22:03
|
(0) Хоть бы кто слазил в профайлер - один п..., извиняюсь за выражение. Отличие в запросах - в первом джоин таблиц документов для отбора по "ответственному" происходит к результату отбора(!) таблицы регистра по датам, а во втором случае - джоин таблиц происходит прямо к таблице регистра, и отбор производится в конце. Разумеется, второй случай тяжелее.
|
|||
72
ИсчадиеADO
11.05.13
✎
22:17
|
(71) (70)не?
|
|||
73
Sorm
11.05.13
✎
22:36
|
(72) Не. Первый запрос неправильно описываешь. Вот тебе строка из первого запроса(подзапрос):
"FROM _AccRg462 T2 WITH(NOLOCK) WHERE T2._Active = P1 AND (T2._Period >= @P2 AND T2._Period <= @P3)" Запросы-то и отличаются только соединением таблиц документов: в первом случае - с подзапросом, во втором - со всей таблицей. |
|||
74
ИсчадиеADO
11.05.13
✎
22:39
|
(73) а что не правильно то? Вот и ты написал, сначала выбираются доки по дате, а потом уже к ним идет соединение. я тож самое писал
|
|||
75
viktor_vv
11.05.13
✎
22:40
|
Так скуль-то, по идее, должен сам план нормальный построить для второго, и сначала выгрести по индексу записи, а потом джойнить таблицы документов.
По запросу вы не поймете как конкретно выполняется выборка, надо план выполнения смотреть. |
|||
76
viktor_vv
11.05.13
✎
22:41
|
Он вообще-то декларативный.
Я таки подозреваю криво транслируется обращение через точку к реквизитам регистратора. |
|||
77
ИсчадиеADO
11.05.13
✎
22:42
|
(75) план - это использование/неиспользование индексов и каких
|
|||
78
ИсчадиеADO
11.05.13
✎
22:43
|
(75) а если в запросе написано вот так, то и получаем неоптимальный запрос
|
|||
79
milan
11.05.13
✎
22:44
|
(77) последовательность наложения условий тоже план
|
|||
80
ИсчадиеADO
11.05.13
✎
22:45
|
(76) да и странно было бы, если бы сервер 1с начал достраивать за юзера запрос, не зная что ему нужно. строит тупо соединение или подзапрос и все дела
|
|||
81
ИсчадиеADO
11.05.13
✎
22:46
|
(79) хочешь сказать сиквел сам поменяет условия местами?
|
|||
82
viktor_vv
11.05.13
✎
22:47
|
(79) Причем последовательность наложения решает сам скуль, от того как ты напишешь это в запросе роли не играет.
Автор может поэкспериментировать, разыменовать руками поле регистратор. (80) Пусть (73) покажет во что выливается Хозрасчетнй.Регистратор.Отвественный. Он его не достраивает, а трансоирует, плюс плна строит скуль-сервер. |
|||
83
viktor_vv
11.05.13
✎
22:48
|
(81) Да. В запросе ты не указваешь как выбирать, а указываешь что выбирать.
|
|||
84
Sorm
11.05.13
✎
22:48
|
(74) Он не доки выбирает, а содержимое таблицы:) Пиши точнее.
|
|||
85
ИсчадиеADO
11.05.13
✎
22:49
|
(79) сомневаюсь, ибо чо тогда б раздавали рекомендации, чтобы условия и их порядок попадал в индекс, хотя нужно перечитать талмуды
|
|||
86
viktor_vv
11.05.13
✎
22:49
|
(82)+ Вернее разыменовать поле Хозрасчетный.Регистратор.Ответственный.
|
|||
87
ИсчадиеADO
11.05.13
✎
22:49
|
(84) да, согласен))
|
|||
88
ИсчадиеADO
11.05.13
✎
22:50
|
(82) причем тут разыменовать регистратор? это делает сервер 1с. Конечный запрос то будет тот же
|
|||
89
viktor_vv
11.05.13
✎
22:55
|
(88) Откуда такая уверенность?
(85) Может это актуально для файловой версии или других версий скуля, МС скулю глубоко все равно. |
|||
90
ИсчадиеADO
11.05.13
✎
22:56
|
(75), (82) да и все таки, в данном случае сначало построится джоин, а потом к нему будет применяться отбор. А уж какое из 2ух условий первое будет, тут играет вторую роль, ибо сначала джоин. т.ч. все логично
|
|||
91
Sorm
11.05.13
✎
22:57
|
(75) Движок 1С сам за тебя не может решить, он только транслирует. Поэтому "виртуальная" таблица регистров - подзапрос(или вьюха, если хотите), а "физическая" таблица регистров - "аналог" физической таблицы.
|
|||
92
dmpl
11.05.13
✎
22:58
|
(85) Во многих случаях порядок условий рояля не играет. Но вот иногда оно да - вылезает. Особенно когда подзапросы используются. Такое ощущение, что как только превышается некий лимит - сразу начинает рояль играть.
|
|||
93
ИсчадиеADO
11.05.13
✎
22:58
|
(89) 1ый пункт: достраивать запрос - это функция сервера 1с. Для этого он делает еще запросы к таблице, где хранятся метаданные
2ой пункт спорить не буду. Нужно перечитать |
|||
94
viktor_vv
11.05.13
✎
22:59
|
(91) Я не говорю про движок 1С, я имею ввиду план запроса который построит скуль-вервер.
|
|||
95
Sorm
11.05.13
✎
23:01
|
(79) Наиболее эффективная выборка будет происходить, если поля условий будут входить в индекс... Там ещё "покрытие" индекса будет иметь значение... Но ладно, это уж другие материи.
|
|||
96
viktor_vv
11.05.13
✎
23:01
|
(92) Ну со сложными подзапросами, там просто иногда скулю башку сносит, и он неоптимально строит. Поэтому и рекомендуют временные таблицы юзать. Иногда бывает запрос один и тот же, но от входных параметров меняется план и в даун уходит.
|
|||
97
Sorm
11.05.13
✎
23:05
|
(94) Не прав. Оптимизатор совсем от запроса отойти не может. Он тебе оптимизирует описанный запрос, но по двум запросам одинаковый оптимальный план не построит:) И первый запрос по структуре оптимален. Второй неоптимален.
|
|||
98
viktor_vv
11.05.13
✎
23:09
|
(97) Тут согласен.
Более того, как писал в (96) и для одного и того же запроса может построить разный план, в зависимости от входных параметров. Сталкивался с этим, правда на семерке в прямых запосах. |
|||
99
Sorm
11.05.13
✎
23:16
|
(98) Определение параметров запроса(для SQL-ля), при возможности, должно идти через вторичные таблицы. Недавно исследовали этот вопрос(правда, не для 1с), сами сильно удивлялись оптимизатору. Т.е. не ссылка в параметре, а выборка ссылки из таблицы в параметре. Бред, но планы запросов становятся лучше.
|
|||
100
viktor_vv
11.05.13
✎
23:20
|
(97) А не мог бы показать из профайлера кусок для второго запроса для
Хозрасчетный.Регистратор.Отвественный = &Ответственный помню где-то была тема, что там херова туча union для каждого вида регистратора идет, могу ошибаться. У меня было просто из-за увеличения периода выборки уходил в кросс джойн, правда сильно замороченные соединения были. Переделал на временные таблицы, все стабильно стало. |
|||
101
Sorm
11.05.13
✎
23:23
|
(100) Там что в первом случае, что во втором - херова туча джоинов:
"... LEFT OUTER JOIN _Document161 T2 WITH(NOLOCK) ON T1._RecorderTRef = P1 AND T1._RecorderRRef = T2._IDRRef LEFT OUTER JOIN _Document217 T3 WITH(NOLOCK) ON T1._RecorderTRef = @P2 AND T1._RecorderRRef = T3._IDRRef LEFT OUTER JOIN _Document206 T4 WITH(NOLOCK) ON T1._RecorderTRef = @P3 AND T1._RecorderRRef = T4._IDRRef LEFT OUTER JOIN _Document207 T5 WITH(NOLOCK) ON T1._RecorderTRef = @P4 AND T1._RecorderRRef = T5._IDRRef LEFT OUTER JOIN _Document168 T6 WITH(NOLOCK) ON T1._RecorderTRef = @P5 AND T1._RecorderRRef = T6._IDRRef LEFT OUTER JOIN _Document188 T7 WITH(NOLOCK) ON T1._RecorderTRef = @P6 AND T1._RecorderRRef = T7._IDRRef ..." |
|||
102
Reaper_1c
11.05.13
✎
23:24
|
Все не уйметесь? (0) Предлагаю запрос к реальной таблице с условиями на период засунуть во вложенный запрос, а условие с ответственным применить уже к результату вложенного запроса. Замерить производительность и сделать выводы.
|
|||
103
Sorm
11.05.13
✎
23:25
|
(102) Первый запрос именно так и делает:)
|
|||
104
Sorm
11.05.13
✎
23:27
|
(100) Стандартный способ - разбиение на временные таблицы и их индексация.+ есть ещё способ - написание своих индексов для таблиц 1с.
|
|||
105
Reaper_1c
11.05.13
✎
23:29
|
(103) Я тешу себя надеждой что хотя бы так он поймет, когда система использует Clustured Index Search, а когда Clustured Index Scan, в какой момент неявные соединения становятся явными, и как на их длительность влияет количество строк исходных данных...
|
|||
106
Sorm
11.05.13
✎
23:32
|
(105) Что за Clustured Index Search? Clustured Index Seek?
|
|||
107
viktor_vv
11.05.13
✎
23:34
|
(101) Понятно. А само условие как проверяется ?
|
|||
108
Sorm
11.05.13
✎
23:38
|
(107) Условие на что?
|
|||
109
viktor_vv
11.05.13
✎
23:48
|
Хозрасчетный.Регистратор.Отвественный = &Ответственный
в (101) только сами соединения. |
|||
110
Sorm
12.05.13
✎
00:03
|
(109) "...LEFT OUTER JOIN _Document161 T3 WITH(NOLOCK)
ON T1.RecorderTRef = @P5 AND T1.RecorderRRef = T3._IDRRef..." "...WHERE (CASE WHEN T1.RecorderTRef = 0x000000A1 THEN T3._Fld3713RRef..." "...N'@P1 varbinary(1),@P2 datetime,@P3 datetime,@P4 numeric(1,0),@P5 varbinary(4)..." " 0, 0x000000A1, 0x000000D9, 0x000000CE, 0x000000CF, 0x000000A" |
|||
111
viktor_vv
12.05.13
✎
00:06
|
(110) Спасибо.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |