Вход | Регистрация

  1  2

Простейший запрос и его трасса

Простейший запрос и его трасса
Я
   Sasha_H
 
22.11.18 - 15:04
Добрый день!

1С:Предприятие 8.3 (8.3.13.1513)

Не понимаю почему платформа циклически делает кучу маленьких запросов.

ВЫБРАТЬ

    Номенклатура.ссылка КАК Ссылка
ИЗ
    Справочник.Номенклатура КАК Номенклатура


https://pastenow.ru/42d23fef832175164d851e7c6e24dc3d

Записей в справочнике мало для теста прогоняю 137 записей. В трасе 137 запросов. Я ВШОКЕ как это понимать? Почему запрос не один!?
 
 
   palsergeich
 
101 - 22.11.18 - 21:31
(100) Спасибо, а то уже я думал что у меня мазги разжижились)
   H A D G E H O G s
 
102 - 22.11.18 - 21:33
Я долго не мог понять почему не MergeJoin, даже если мы помогаем SQL, сортируя 1 таблицу через Индексировать.
Но, если исходить из того, что чтение некластерного индекса выгоднее чем чтение кластерного - то и получается, что HashJoin, так как MergeJoin не возможен для результата поиска по индексу без tablespool (надо сохранить результат поиска по индексу в временной таблице), а hashjoin возможен без временного хранения.
   H A D G E H O G s
 
103 - 22.11.18 - 21:35
Но если мы добавим в 2 выборку поле, не входящее ни в один из индексов - оптимизатор решит использовать кластерный индекс и будет MergeJoin при большой 1 выборке и nested loop при маленькой .
   palsergeich
 
104 - 22.11.18 - 21:36
(102) (103) Успокоил, спасибо
   H A D G E H O G s
 
105 - 22.11.18 - 21:38
Самое забавное будет при выборке
ВЫБРАТЬ
    Товары.Поле1 КАК Поле1,
СпрНоменклатура.Код КАК Код ,
    СпрНоменклатура.Наименование КАК Наименование

SQL настолько уверен в калечности кластерного индекса, что будет использовать выборку из 2 некластерных индексов - Индекса по коду и Индекса по наименованию.
   palsergeich
 
106 - 22.11.18 - 21:39
(105) ГГГГГГ, такого еще не видел)
   H A D G E H O G s
 
107 - 22.11.18 - 21:44
Hash Match(Inner Join, HASH:([T1].[_Q_001_F_000RRef])=([T2].[_IDRRef]), RESIDUAL:([Elida].[dbo].[_Reference185].[_IDRRef] as [T2].[_IDRRef]=[tempdb].[dbo].[#tt1].[_Q_001_F_000RRef] as [T1].[_Q_001_F_000RRef]))                                                                                                                                                
  |--Table Scan(OBJECT:([tempdb].[dbo].[#tt1] AS [T1]))                                                                                                                                                                                                                                                                                                          
  |--Merge Join(Inner Join, MERGE:([T2].[_Fld931], [T2].[_IDRRef])=([T2].[_Fld931], [T2].[_IDRRef]), RESIDUAL:([Elida].[dbo].[_Reference185].[_Fld931] as [T2].[_Fld931] = [Elida].[dbo].[_Reference185].[_Fld931] as [T2].[_Fld931] AND [Elida].[dbo].[_Reference185].[_IDRRef] as [T2].[_IDRRef] = [Elida].[dbo].[_Reference185].[_IDRRef] as [T2].[_IDRRef])) 
                                                                                                                   
       |--Sort(ORDER BY:([T2].[_IDRRef] ASC))                                                                                                                                                                                                                                                                                                               
            |--Index Seek(OBJECT:([Elida].[dbo].[_Reference185].[_Reference185_Code] AS [T2]), SEEK:([T2].[_Fld931]=[@P1]) ORDERED FORWARD)                                                                                                                                                                                                                 
       |--Sort(ORDER BY:([T2].[_IDRRef] ASC))                                                                                                                                                                                                                                                                                                                    
            |--Index Seek(OBJECT:([Elida].[dbo].[_Reference185].[_Reference185_Descr] AS [T2]), SEEK:([T2].[_Fld931]=[@P1]) ORDERED FORWARD)
   palsergeich
 
108 - 22.11.18 - 21:46
(107) Спасибо за пример, покажу молодежи.
   H A D G E H O G s
 
109 - 22.11.18 - 21:50
Надо почитать про цену выборки из кластерного и некластерного.

Но простейший запрос вида
ВЫБРАТЬ
    Номенклатура.Наименование КАК Наименование
ИЗ
    Справочник.Номенклатура КАК Номенклатура

всегда вызывал дефакто чтение, деюре поиск в некластерном индексе.

Чтение/поиск - потому что

SELECT
T1._Description
FROM dbo._Reference185 T1
WHERE (T1._Fld931 = P1)


WHERE (T1._Fld931 = P1) - деюре мы ищем,дефакто - находим все записи.
   Sasha_H
 
110 - 22.11.18 - 22:08
Правда не понимаю с чего ты решил, что кластерный идекс калечный :)
 
 Рекламное место пустует
   H A D G E H O G s
 
111 - 22.11.18 - 22:10
(110) Это SQL решает, что он калечный.
   palsergeich
 
112 - 22.11.18 - 22:13
Ладно, всем поки)
   Sasha_H
 
113 - 22.11.18 - 22:13
да это странно почему он не взял данные с кластерного индекса они ведь лежат на верхнем уровне
   palsergeich
 
114 - 22.11.18 - 22:14
(113) Потому что алгоритмы посчитали по другому
   palsergeich
 
115 - 22.11.18 - 22:15
(113) Он посчитал что обратиться к некластерному индексу Наисменование Ссылка 1 раз с хешированием выгоднее чем 122 раза к кластерному
   palsergeich
 
116 - 22.11.18 - 22:18
   H A D G E H O G s
 
117 - 22.11.18 - 22:19
(113) Наверное причина в том, что ему нужно прочитать все колонки таблицы (их дофига у номенклатуры) при чтении кластерного индекса, а при чтении некластерного - только 3 колонки.
   palsergeich
 
118 - 22.11.18 - 22:20
https://docs.microsoft.com/ru-ru/sql/relational-databases/indexes/clustered-and-nonclustered-indexes-described?view=sql-server-2017
А это предложение - вся суть:
Оптимизатор запросов обычно выбирает наиболее эффективный метод при выполнении запросов.
   palsergeich
 
119 - 22.11.18 - 22:21
(117)
Вот тут кстати намек на это
В основном поиск по индексу протекает намного быстрее, чем поиск по таблице, так как в отличие от таблицы индекс часто содержит мало столбцов в каждой строке и строки расположены в отсортированном порядке.
   palsergeich
 
120 - 22.11.18 - 22:22
В части мало столбцов
   palsergeich
 
121 - 22.11.18 - 22:22
Если это было бы не важно, скорее всего это не упомянули бы
   H A D G E H O G s
 
122 - 22.11.18 - 22:24
(119) Я думаю, сайту в (118) можно доверять.
   H A D G E H O G s
 
123 - 22.11.18 - 22:24
Моя вера в SQL возвращается.
   palsergeich
 
124 - 22.11.18 - 22:24
Ибо то. что говорят в мире 1с - строки расположены в отсортированном порядке - называют основным.
   palsergeich
 
125 - 22.11.18 - 22:25
Но скорее всего они не договаривают)
   palsergeich
 
126 - 22.11.18 - 22:26
(122) Я тоже так думаю)
   H A D G E H O G s
 
127 - 22.11.18 - 22:30
За последние 2 недели я в очевидных, незначительных, тривиальных запросах, которые ты никогда не посмотришь под микроскопом, нашел подводных камней больше чем за последний год.
   palsergeich
 
128 - 22.11.18 - 22:38
(113) Большое спасибо Вам за пример.
Приношу извинение за грубость, просто устал.
(127) Вам тоже спасибо.
Всем пока, до завтра)
   Sasha_H
 
129 - 22.11.18 - 22:44
А вот что по этому поводу говорит Вьейра

https://ibb.co/cHaKPq
https://ibb.co/dHYjqV
   Sasha_H
 
130 - 22.11.18 - 22:54
Всем огромное спасибо!
(128)
Если что я тут практически всегда. Скайп oleksandr.homyak
   palsergeich
 
131 - 22.11.18 - 22:55
(129) Но тут всего лишь описано что это такое.
Это есть и тут (116)
Меня лично больше взволновала эти фраза:
так как в отличие от таблицы индекс часто содержит мало столбцов в каждой строке и строки расположены в отсортированном порядке
Кластерный индекс содержит столько же полей как и таблица.
мало столбцов в каждой строке - вот эта вроде бы незначительная фраза, но она очень много что объясняет.
   palsergeich
 
132 - 22.11.18 - 22:57
Зная что просто так в документацию словосочетания не добавляют, можно сделать вывод что это дейсвтительно важно в тех или иных алгоритмах.
Даже вот это (105) поведение становится менее алогичным
   palsergeich
 
133 - 22.11.18 - 22:58
Все во  теперь точно ушел
 
 
   Sasha_H
 
134 - 22.11.18 - 22:58
(132) вот-вот. Я и говорю разрыв шаблона на простейших запросах
   los_hooliganos
 
135 - 23.11.18 - 05:32
Лучше бы взяли и один раз прочитали "Реализация и обслуживание MS SQL" там все разжевано для уровня чайников.
   H A D G E H O G s
 
136 - 23.11.18 - 12:15
(135) Даю 100%, что когда ты почитаешь вот это вот то, что ты там рекомендуешь - ты потрясешь гривой, что да, мол, все понятно и забудешь на следующий день. Если ты дойдешь до этих выводов сам, расследуя ситуацию - ты запомнишь до конца жизни. Именно поэтому я не читают rtfm до последней возможности.
   Sasha_H
 
137 - 23.11.18 - 15:33
(136) абсолютно согласен. У меня и курсы Бурмистрова есть. Все понятно казалось бы. Но это все примеры из книжки. Самому разобрать это совершенно другое.

(135) но лишней литературы не бывает. взял на заметку.
   GANR
 
138 - 23.11.18 - 16:20
(0) Для интереса сделайте на СКД и повторите проверку.
  1  2

Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Рекламное место пустует