Имя: Пароль:
1C
1С v8
План запроса в sql2005
0 Мистикан
 
31.10.18
17:04
Из книжки Настольная книга эксперта по технологическим вопросам.
"Условия в запросе и индексы в базе должны друг другу соответствовать"
Запускаю 1c (ERP 2.4,8.3.10,SQL2005),запускаю профайлер.
Выполняю запрос:

ВЫБРАТЬ
    СвободныеОстаткиОстатки.Номенклатура КАК Номенклатура,
    СвободныеОстаткиОстатки.Склад КАК Склад,
    СвободныеОстаткиОстатки.ВНаличииОстаток КАК ВНаличииОстаток
ИЗ
    РегистрНакопления.СвободныеОстатки.Остатки(, Склад = &Склад) КАК СвободныеОстаткиОстатки

Структура измерений:
Номенклатура,Характеристика,Склад

Профайлер показывает что использует Clastered index seek.
Почему?
1 Мистикан
 
31.10.18
17:09
2 Timon1405
 
31.10.18
17:09
а какой оператор вы ожидаете увидеть?
3 Мистикан
 
31.10.18
17:10
скан
4 palsergeich
 
31.10.18
17:10
Ну дык так и должно быть
5 Мистикан
 
31.10.18
17:10
Запрос.Текст = "ВЫБРАТЬ | ТоварыНаСкладахОстатки.Склад, | ТоварыНаСкпадахОстатки.Номенклатура, | ТоварыНаСкладахОстатки.Качество |ИЗ | РегистрНакопления.ТоварыНаСкпадах.Остатки(, Номенклатура = &Номенклатура) КАК ТоварыНаСкладахОстатки"; В данном случае нарушено требование 2. В условии отсутствует отбор по первому нолю индекса (Склад). Такой запрос не сможет выполниться оптимально. Для его выполнения серверу СУБД придется перебирать (сканировать) все записи таблицы. Время выполнения этой операции напрямую зависит от количества записей в таблице остатков регистра и может быть очень большим (и будет увеличиваться с ростом вшичества данных).
6 palsergeich
 
31.10.18
17:11
Обращается к таблице итогов и по дате получает оперативный
7 Мистикан
 
31.10.18
17:11
это с книжки
8 Мистикан
 
31.10.18
17:12
(6) я тоже это понимаю.
9 palsergeich
 
31.10.18
17:14
10 palsergeich
 
31.10.18
17:15
(5) Вопрос то в чем?
11 Вафель
 
31.10.18
17:15
может на складе ввсего пару позиций?
12 Мистикан
 
31.10.18
17:16
(11) да немного
13 palsergeich
 
31.10.18
17:16
[ОРРХ | ОРНР1 +] Период + Измерение1 + ... + ИзмерениеN (Кластерный) ) + Splitter а он и есть кластерный у таблицы итогов. Все как надо
14 Мистикан
 
31.10.18
17:16
(13) тут по 3 измерению условие а не по 1
15 palsergeich
 
31.10.18
17:17
(14) Оптимизатор решил что так будет правильно
16 Ёпрст
 
31.10.18
17:18
(5) определись ужо, в (0) у тя фильтр по складу, в (5) - по номенклатуре..
а в реальности - хз что
17 Timon1405
 
31.10.18
17:19
(14) если оно индексировано, то читать пункт 2 в РС в (13) до полного просветления
18 Timon1405
 
31.10.18
17:19
* в (9)
19 Мистикан
 
31.10.18
17:19
(16) в книге структура регистра из ут 10  отличается
Там первое измерение склад, в ERP номенклатура
20 H A D G E H O G s
 
31.10.18
17:19
(0) seek по дате, Склад - в остаточном предикате поиска.
21 palsergeich
 
31.10.18
17:19
Оптимизатор основываясь на статистике решает какой план будет в том или ином случае оптимальнее и передает на исполнение. Но то что это будет действительно оптимальный план - гарантий нет
22 Мистикан
 
31.10.18
17:20
(17) оно не индексировано вообще, нет покрывающего.
23 palsergeich
 
31.10.18
17:20
(22) Кластерный индекс - он предоставляется платфорой и будет покрывающим
24 palsergeich
 
31.10.18
17:20
25 Мистикан
 
31.10.18
17:21
(20) Понял спасибо.
26 palsergeich
 
31.10.18
17:21
(25) Это так называемое частичное сканирование индекса. Совершенно нормальная ситуация
27 Мистикан
 
31.10.18
17:22
надо кароч сделать миллиончик движений по регистру и проверить результат
28 palsergeich
 
31.10.18
17:23
Надо не просто миллион а миллион в разных периодах
29 palsergeich
 
31.10.18
17:23
И миллиона мало
30 palsergeich
 
31.10.18
17:25
И номенклатуры побольше разной
31 Tonik992
 
31.10.18
17:32
(14)
При получении остатков период всегда используется, даже если вы его не указали. 1С расщепит запрос понятный для mssql, а там будет дата для получения текущих итогов.
И + вы используете отбор по измерению.
Все под clastered index seek, как доктор прописал.
32 H A D G E H O G s
 
31.10.18
17:33
По ощущениям, из всего форума по теме шарит только palsergeich, да Анатолий, когда валазит из своих java/ бигдата.
33 DrWatson
 
31.10.18
17:37
(32) 1С:Эксперт вообще редкое явление.
34 Tonik992
 
31.10.18
17:37
(33) Нуралиев вообще один
35 Мистикан
 
31.10.18
17:42
(32) хз.. судя по собеседованиям на вакухи в незалежную такое ощущение что эксперты под каждым забором валяются
36 DrWatson
 
31.10.18
17:42
Кстати, в современных типовых всегда есть разделитель данных. Поэтому если и не дата, то сеек должен быть хотя бы по разделителю.
37 Мистикан
 
31.10.18
17:43
И кандидат на вакансию программист за 120к просто ОБЯЗАН знать все о оптимизации и работе СУБД ))))
39 H A D G E H O G s
 
31.10.18
17:58
(37) А сколько получаете вы?
40 gantonio
 
31.10.18
17:59
где вы все работаете ? В аэропортах что ли  ? у меня на работе почти млрд выручка за год на10 пользователей. Вообще никакие запросы не нужны.
41 palsergeich
 
31.10.18
18:16
(37) В МСК на 120 дай бог что бы запросы на практике умел применять. А если еще и СКД то просто огонь.
(37) Все хотят, просто потому что это модно.
42 gantonio
 
31.10.18
18:17
я тоже хочу ..
43 palsergeich
 
31.10.18
18:21
(36) разделитель включается соответствующей опцией же.
На практике кроме фреша не видел что бы этим кто то пользовался
44 xXeNoNx
 
31.10.18
18:22
(32) не скромничай, себя-то посчитай
45 H A D G E H O G s
 
31.10.18
18:25
(44) Это априори.
46 xXeNoNx
 
31.10.18
18:29
(0) а шо показывает rpc:completed?
47 nicxxx
 
31.10.18
18:33
(36) Вы много видели баз, где разделитель реально используется? Не будет Seek по этой колонке, т.к. там всегда 0 (ноль) у подавляющего большинства. Как следствие - статистика по индексам, где есть область данных, в целом бесполезна, т.к. самая левая колонка всегда содержит одно значение. SQL Server строит колоночную статистику по каждой колонке и использует затем её при формировании плана запроса. Посмотрите на статистики с префиксом WA - это оно и есть.
48 xXeNoNx
 
31.10.18
18:44
(45) отсыпь, тож хочу таких ощущений
49 Мистикан
 
01.11.18
09:35
(40) ну знаешь я сейчас в компании работаю тут 5 лярдов и даже никакая 1с 8 не нужна ибо учетная система на 7.7 ))))
50 Мистикан
 
01.11.18
09:37
(39) 60... переферия ((
51 Мистикан
 
01.11.18
09:39
(46) exec sp_executesql N'SELECT
T1.Fld63162RRef,
T1.Fld63164RRef,
T1.Fld63165Balance_
FROM (SELECT
T2._Fld63164RRef AS Fld63164RRef,
T2._Fld63162RRef AS Fld63162RRef,
CAST(SUM(T2._Fld63165) AS NUMERIC(32, 8)) AS Fld63165Balance_
FROM dbo._AccumRgT63169 T2
WHERE ((T2._Fld2124 = P1)) AND (T2._Period = @P2 AND ((T2._Fld63164RRef = @P3)) AND (T2._Fld63165 <> @P4) AND (T2._Fld63165 <> @P5))
GROUP BY T2._Fld63164RRef,
T2._Fld63162RRef
HAVING (CAST(SUM(T2._Fld63165) AS NUMERIC(32, 8))) <> 0.0) T1',N'P1 numeric(10),@P2 datetime,@P3 varbinary(16),@P4 numeric(10),@P5 numeric(10)',0,'Nov  1 5999 12:00:00:000AM',0x8C8900155D505D0A11E88516CE5760B6,0,0
52 gantonio
 
01.11.18
09:41
(49) ну, я и говорю, что как же надо так жить что бы до планов запросов дожить.
53 Cool_Profi
 
01.11.18
09:45
Интересно, как можно работать в 1с, не используя запросов?
54 Nikoss
 
01.11.18
09:49
(53) не используя таких запросов как в (51), вполне себе работается, и таких 1с-ников большинство
55 Мистикан
 
01.11.18
09:51
(54) ты вообще о чем... это тупой запрос остатков с отбором по складу в ERP 2.4, в представлении команд mssql 2005, как его выполняет субд.
56 Мистикан
 
01.11.18
09:52
(53) ваще... я на 7.7 код пишу и блин плачу...
57 Cool_Profi
 
01.11.18
09:53
(56) А когда я писал код в 77, платили мне...
58 Мистикан
 
01.11.18
09:54
(57) не.. я про грусть печаль,тоску, желание убежать и спрятаться
59 Cool_Profi
 
01.11.18
09:55
(58) Ты, главное, в оружейный не беги...
А так я писал приличные ))) скуль-запросы для 77... И всё работало шустренько
60 Мистикан
 
01.11.18
09:56
(59) не.. нафиг.. работа временная...я уже с ними расстаться планирую ближайшее время.. лезть в дебри 1сpp ну его...
61 Мистикан
 
01.11.18
10:00
нет все таки я не понимаю почему seek до конца... тут же вроде не идексированная выборка результатов подзапроса по таблице итогов...
62 H A D G E H O G s
 
01.11.18
11:48
(61) У тебя пропущено измерение в фильтре - вот и seek не до конца.
63 H A D G E H O G s
 
01.11.18
11:52
(61) Посмотри, сколько reads в профайлере на этапе выполнения запроса. Их будет много. Будет считана вся часть таблицы итогов на дату
Nov  1 5999 12:00:00:000AM