|
Оптимизация запроса | ☑ | ||
---|---|---|---|---|
0
ArtemKolos
04.04.12
✎
16:46
|
Здравствуйте, вот прочитал статью http://1cexpo.ru/metodiki/20-tipichnye-prichiny-neoptimalnoj-raboty-zaprosov-i-metody-optimizaczii.html и есть один вопрос, думаю тут быстрей всего ответят
Есть запрос Запрос.Текст = "ВЫБРАТЬ | ТоварыНаСкладахОстатки.Склад, | ТоварыНаСкладахОстатки.Номенклатура, | ТоварыНаСкладахОстатки.Качество |ИЗ | РегистрНакопления.ТоварыНаСкладах.Остатки( | , | Качество = &Качество | И Склад = &Склад) КАК ТоварыНаСкладахОстатки"; В данном случае нарушено требование 3. Между измерениями «Склад» и «Качество» в структуре регистра находится измерение «Номенклатура», которое не задано в условии запроса. Этот запрос так же не сможет выполняться оптимально. При его выполнении СУБД выполнит поиск по первому полю индекса, но затем вынужденно просканирует некоторую его часть. Сканирование приведет к увеличению времени выполнения запроса и к блокировке избыточных записей в таблице, то есть к снижению общей пропускной способности системы. Варианты оптимизации: Добавить в запрос условие по измерению «Номенклатура» Убрать из запроса условие по измерению «Качество» Перенести «Номенклатуру» из измерений в реквизиты Поменять местами измерения «Номенклатура» и «Качество И запрос Запрос.Текст = "ВЫБРАТЬ | ТоварыНаСкладахОстатки.Склад, | ТоварыНаСкладахОстатки.Номенклатура, | ТоварыНаСкладахОстатки.Качество, | ТоварыНаСкладахОстатки.КоличествоОстаток |ИЗ | РегистрНакопления.ТоварыНаСкладах.Остатки( | , | Номенклатура = &Номенклатура | И Склад = &Склад) КАК ТоварыНаСкладахОстатки"; В этом случае требования соответствия индекса и запроса не нарушены. Данный запрос будет выполнен СУБД оптимальным способом. Обратите внимание на то, что порядок следования условий в запросе не обязан совпадать с порядком следования полей в индексе. Это не является проблемой и будет нормально обработано СУБД. Почему второй запрос правильный когда в нем тоже не установлен один параметр (качество)? Объясните? |
|||
1
hhhh
04.04.12
✎
17:13
|
какие-то придурки. А если нужно по всей номенклатуре получить остатки?
|
|||
2
mirosh
04.04.12
✎
17:14
|
(1) сам такой. Рекомендации дельные.
|
|||
3
hhhh
04.04.12
✎
17:16
|
(2) ну вот, допустим, мне нужно получить остатки товаров на складе? Я должен по-твоему залезть в конфигуратор и перенести в регистре номенклатуру из измерений в реквизит? Это дельно?
|
|||
4
Kashemir
04.04.12
✎
17:18
|
(3) Реквизит ? Оо тут же обращение к виртуальной таблице
|
|||
5
JLeys
04.04.12
✎
17:19
|
менять местами реквизиты - чревато, ты уверен, что больше нигде нет ни одного запроса к этому регистру, а то разом они все станут не оптимальными
|
|||
6
rs_trade
04.04.12
✎
17:20
|
(0) порядок следования полей в индексе имеет значение
|
|||
7
JLeys
04.04.12
✎
17:20
|
(5) Измерения
|
|||
8
hhhh
04.04.12
✎
17:21
|
(4) ну тогда остается вариант вставить всё-таки в запрос условие Номенклатура = &Номенклатура и запустить в цикле.
У меня будет тысяча запросов в цикле, но зато СУБД нигде не запнется, оптимально всё сосканирует. |
|||
9
JLeys
04.04.12
✎
17:22
|
(8) за такое надо руки отрывать
|
|||
10
Domanoff26
04.04.12
✎
17:24
|
обьясните пожлста поподробнее почему при пропуске одного измерения в условии, запрос медленнее работает? спасибо.
|
|||
11
ArtemKolos
04.04.12
✎
17:24
|
(6) Можно поподробнее?
|
|||
12
mirosh
04.04.12
✎
17:24
|
(3) ты что-то не так понял из рекомендаций.
|
|||
13
Kashemir
04.04.12
✎
17:25
|
(10) Индексы в упрощенном виде строятся так:
Измерение1 Измерение1+2 Измерение1+2+3... и т.д. Потому если пропустить 2 измерение отбор пойдет по индексам только по 1 измерению, а для 3 будет сканирование. |
|||
14
mirosh
04.04.12
✎
17:25
|
(5) реквизиты можешь менять как хочешь, они не индексируются
|
|||
15
Господин ПЖ
04.04.12
✎
17:25
|
>обьясните пожлста поподробнее почему при пропуске одного измерения в условии, запрос медленнее работает? спасибо.
читаем буквари по sql... |
|||
16
artbear
04.04.12
✎
17:27
|
(0) Хорошие и давно известные рекомендации.
(1) думаем над текстом, а не торопимся писать про придурков. Варианты приведены разные специально, чтобы можно было правильно выбрать в соответствующей ситуации. |
|||
17
JLeys
04.04.12
✎
17:27
|
(14) измерения, опечатался, см (7)
|
|||
18
mirosh
04.04.12
✎
17:28
|
(17) да, менять местами порядок измерений чревато.
|
|||
19
Buster007
04.04.12
✎
17:28
|
насколько я знаю, индексы в таблице остатков регистра накопления строятся следующим образом:
Период + Измерение1 + ... + ИзмерениеN + Разделитель и если опираться на теорию по индексам, то можно сказать таким образом, т.к. измерения идут в порядке Склад, Номенклатура, Качество и т.д. (исходя из ссылки), то прекрасно можно представить, что при использовании отбора на Склад и Номенклатуру мы точно получим положение указателя с которого нам надо сканировать для поиска... В случае когда мы будем устанавливать отбор по Складу и Качеству, то в таком случае SQL не сможет точно определить такое соответствие в индексе и следовательно, он поставит указатель для поиска в ту точку, где начинается именно такой Склад, а все остальное будет сканироваться и сравниться на условие отбора по качеству. Короче говоря, при использовании композитного индекса возможно их использовании только при условии, когда накладывается отбор последовательно (т.е. так, как задано в конфигураторе) |
|||
20
Domanoff26
04.04.12
✎
17:28
|
(13) а сканирование имеется ввиду без индекса поиск что ль?
|
|||
21
Buster007
04.04.12
✎
17:28
|
(+19) ну и Измерение + Период
|
|||
22
rs_trade
04.04.12
✎
17:30
|
копипаста с ИТС
Требования к индексу, перечисленные в рекомендациях, связаны с физической структурой индекса в СУБД. Эта структура представляет собой дерево значений проиндексированных полей. На первом уровне дерева находятся значения первого поля индекса, на втором - второго и так далее. Такая структура позволяет достичь высокой эффективности при поиске по индексу. Кроме того, она гарантирует отсутствие деградации производительности индекса с ростом количества данных. Однако индекс такой структуры, очевидно, может быть использован только строго определенным образом. Сначала необходимо провести поиск по значению первого поля индекса, затем - второго и так далее. Если, например, условие по первому полю индекса не указано, то индекс уже не сможет обеспечить быстрый поиск. Если указано условие по нескольким первым полям индекса, а затем одно или несколько полей индекса не задано, то индекс может быть использован только частично. |
|||
23
artbear
04.04.12
✎
17:30
|
(13) Неправ, так строятся только индексы для тех таблиц, в которых либо нет индексированных полей, либо только первое поле индексировано.
Пример для РС Строится индекс ИзмерениеN + Измерение1 + [Измерение2 +...] ЕСЛИ Измерению "ИзмерениеN" задано свойство "Индексировать" или свойство "Ведущее" и при этом это не первое и не единственное измерение. Индекс, включающий все измерения. Первое поле - ИзмерениеN, затем все остальные измерения в том порядке, в котором они заданы при конфигурировании. |
|||
24
JLeys
04.04.12
✎
17:31
|
Вопрос автору, для чего он выполняет запрос и что предполагается дальше с ним делать, в рамках какой задачи?
|
|||
25
Kashemir
04.04.12
✎
17:32
|
(23) Я же указал что это лишь примитивная модель, лень расписывать
|
|||
26
Дикообразко
04.04.12
✎
17:33
|
тупая реклама статьи...
забаньте автора за спам |
|||
27
ArtemKolos
04.04.12
✎
17:33
|
(24) вопрос для общего развития, после прочтения статьи возникли вопросы
|
|||
28
Buster007
04.04.12
✎
17:35
|
(24) нормальный вопрос... исходя из этого можно проектировать регистр накопления, например )
|
|||
29
Kashemir
04.04.12
✎
17:35
|
(20) Один из видов обхода таблиц плана запроса, в моем контексте имелось ввиду методы обхода не использующие индексы.
|
|||
30
ArtemKolos
04.04.12
✎
17:35
|
(26) если бы не скинул ссылку, уже б начали орать что скопипастил без ссылки, и тд.
|
|||
31
Дикообразко
04.04.12
✎
17:36
|
(27) не всякое сканирование вредно,
а лишь то, что наложит блокировку |
|||
32
Дикообразко
04.04.12
✎
17:37
|
тут дело не в производительности, а в масштабируемости системы
|
|||
33
ArtemKolos
04.04.12
✎
17:40
|
Тоесть в данном примере поиск идет так:
Ищет в: Склад, Потом в:Склад+Номенклатура, Потом в:Склад+Номенклатура+Качество и так для каждого параметра? правильно? |
|||
34
Buster007
04.04.12
✎
17:41
|
||||
35
Дикообразко
04.04.12
✎
17:42
|
индекс это как правило дерево
|
|||
36
Дикообразко
04.04.12
✎
17:43
|
номенклатура 1
- склад 1 - качество 1 - склад 2 - качество 2 номенклатура 2 - склад 1 - склад 2 |
|||
37
krbIso
04.04.12
✎
17:43
|
есть сканы которые не накладывают блокировку? это как?
|
|||
38
ArtemKolos
04.04.12
✎
17:53
|
(34) Пасиб, интересно и не заумно
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |