SAP R/3 форум ABAP консультантов
Russian ABAP Developer's Club

Home - FAQ - Search - Memberlist - Usergroups - Profile - Log in to check your private messages - Register - Log in - English
Blogs - Weblogs News

Порядок полей в индексах БД.



 
Post new topic   Reply to topic    Russian ABAP Developer's Club Forum Index -> ABAP
View previous topic :: View next topic  
Author Message
Igor_34_rus
Специалист
Специалист



Joined: 08 Apr 2009
Posts: 75

PostPosted: Wed Nov 28, 2012 9:12 am    Post subject: Порядок полей в индексах БД. Reply with quote

Приветствую!

Будет ли влиять на скорость выборки порядок расположения полей в индексе БД?

Например:
БД = VBRP
вариант №1
1) MANDT Мандант
2) MATNR Номер материала
3) CHARG Номер партии
вариант №2
1) MANDT Мандант
2) CHARG Номер партии
3) MATNR Номер материала

Я думаю, что да, повлияет. Но хочется узнать мнение, как оно должно быть в теории.

Размышляю так:
При выборке по индексам, анализ записей идёт побитово(аналог binary search при read table). Соответственно, так как материала больше(одинаковых записей с этим полем много тысяч) системе придётся сравнивать большее количество второго поля.
Во втором примере, по партии(одинаковых полей около сотни, максимум) "отсекается" меньше кол-во записей для сравнения второго поля.... => выборка работает быстрее
Back to top
View user's profile Send private message
Armann
Модератор
Модератор



Joined: 01 Jan 2008
Posts: 422
Location: Moscow

PostPosted: Wed Nov 28, 2012 10:01 am    Post subject: Reply with quote

Привет, в общем да, ты прав - в общем случае если записей с одинаковыми значениями материала больше чем с одинаковыми значениями партии - то второй индекс выгодней. Погугли определение 'селективность поля'
Back to top
View user's profile Send private message Blog
alezhu
Специалист
Специалист



Joined: 29 Apr 2012
Posts: 86
Location: Spb

PostPosted: Wed Nov 28, 2012 10:11 am    Post subject: Reply with quote

А по моему одинаково и больше зависит от конкретных данных. Порядок в принципе один. Посмотрите Excel во вложении.
Допустим у нас 2 партии a1,a2 и 8 материалов b1-b8.
2 случая - когда индекс по партии-материалу и когда по материалу партии. Соответственно, расположение записей в Excel - сверху и снизу.
Допустим мы ищем партию a1, материал a7.
В обоих случаях мы найдем запись за 4 шага. Вроде одинаково.

Теперь допустим возьмем ту запись, что нашлась в первом случае(партия-материал) на самом первом шаге - это a1-b8 и попробуем ее найти в случае когда расположение - материал партия. Получается 4 шага вместо 1го.

А теперь сделаем наоборот - найдем запись в первом распределении, которая нашлась за 1 шаг на втором - это запись b4-a2. В первом распределении она находится за 2 шага.

Таким образом количество шагов зависит от конкретных данных, в однмо случае быстрее так, в другом так, в третьем вообще одинаково.



ключу.xls
 Description:

Download
 Filename:   ключу.xls
 Filesize:  34.5 KB
 Downloaded:  565 Time(s)

Back to top
View user's profile Send private message
Armann
Модератор
Модератор



Joined: 01 Jan 2008
Posts: 422
Location: Moscow

PostPosted: Wed Nov 28, 2012 11:48 am    Post subject: Reply with quote

alezhu, это понятно что зависит от данных, но мы рассматриваем более менее конкретную ситуацию. У вас из 16 записей получается 2 партии и 8 материалов, а у Igor_34_rus - наоборот, 8 партий и 2 материала. Если взять ваши данные из экселя (16 записей) и поменять местами поля партия-товар (чтобы соответстовало условиям Igor_34_rus), то в таком случае при выборке с разными индексами:
Индекс материал-партия:
1. найдем 8 записей с указанным материалом
2. из 8 записей получим 1 запись с указанной партией

Индекс партия-материал:
1. найдем 2 записи c указанной партией
2. из 2 записей получим 1 запись с указанным материалом

Как видно, второй индекс здесь выгодней

P.S. а вашу таблицу с алгоритмом если честно не понял
Back to top
View user's profile Send private message Blog
Удав
Гуру
Гуру


Age: 48
Joined: 25 Jan 2008
Posts: 580
Location: Москва

PostPosted: Wed Nov 28, 2012 11:56 am    Post subject: Reply with quote

Необходимо помнить, что отдельные индексы для каждого запроса никто делать не будет.
Поэтому порядок полей в индексе в первую очередь должен определяться частотой использования поля в выборках данных.
Если есть 10 запросов с использованием поля "материал" и 3 запроса - с комбинацией "материал-партия", то поле "MATNR" лучше поставить первым.
Если же принято решение, что номер партии - уникальный и не зависит от материала, то удобнее поле "CHARG" поставить выше.

Если какое-нибудь поле из середины индекса не используется при выборке, то возникает ситуация со skip scan, когда БД будет перебирать все ветки для пропущенного поля индекса.
И чем этих веток меньше, тем быстрее отработает запрос.
Поэтому при построении индексов также необходимо учитывать кардинальность(количество уникальных значений) для полей.

Но это - чистая теория. Оптимизатор СУБД - это "черный ящик".

_________________
С уважением,
Удав.
Back to top
View user's profile Send private message
Igor_34_rus
Специалист
Специалист



Joined: 08 Apr 2009
Posts: 75

PostPosted: Wed Nov 28, 2012 2:20 pm    Post subject: Reply with quote

сделал тест

Последовательно запускал старый(мат-партия) индекс и новый(партия - мат.) - по пять раз.


Armann, материалов больше партий.
Back to top
View user's profile Send private message
Shvetz
Специалист
Специалист



Joined: 05 Oct 2007
Posts: 53

PostPosted: Wed Nov 28, 2012 2:44 pm    Post subject: Reply with quote

Не забывайте данные буферизуются в БД. Подобные замеры, что отображены на скриншоте, могут быть некорректными.
Back to top
View user's profile Send private message
alezhu
Специалист
Специалист



Joined: 29 Apr 2012
Posts: 86
Location: Spb

PostPosted: Wed Nov 28, 2012 8:46 pm    Post subject: Reply with quote

Armann wrote:

Индекс материал-партия:
1. найдем 8 записей с указанным материалом
2. из 8 записей получим 1 запись с указанной партией

Индекс партия-материал:
1. найдем 2 записи c указанной партией
2. из 2 записей получим 1 запись с указанным материалом

Как видно, второй индекс здесь выгодней

Вы думаете, что поиск сначала отсеивает одно поле потом внутри отсеянного следующее и так далее. Это не так.
Все поля объединяются в одно целое и поиск происходит именно по целому. То есть, если у вас партия a1 и материал b4, то не ищется вначале все a1 или все b4 - ищется сразу a1b4, либо b4a1.

Quote:
P.S. а вашу таблицу с алгоритмом если честно не понял

слева сверху и снизу - 2 варианта того как лежат индексы - партия-товар и товар-партия, соответственно. Для примера верхний левый поиск - по партия-товар ищется запись для партии a1 и товара b7. Поиск двоичный. Начало диапазона - b, окончание - e,середина которая сравнивается с искомым значением - m.
Если равна - то нашли.
Если m меньше искомого, значит искомое лежит в диапазоне m-e - переносим b в m и переходим на следующую итерацию.
Если m больше искомого, значит искомое лежит в диапазоне b-m - переносим e в m и повторяем.
И так пока не найдем.

Остальные примеры аналогично. Надеюсь, стало чуть понятнее.
Back to top
View user's profile Send private message
Кодер
Участник
Участник



Joined: 11 Apr 2012
Posts: 27

PostPosted: Wed Nov 28, 2012 10:39 pm    Post subject: Reply with quote

Поддержу Удава: везде говорится о том, что для построения индексов следует использовать поля, которые по факту чаще всего используются в большом количестве выборок или присутствуют в наиболее важной выборке.

2 alezhu: про структуру индекса почти так. Только вот все дело в том, что это сферический конь в вакууме. Это зависит от конкретной СУБД. Например оракл юзает B-tree для хранения индексов. И, как не странно, "B" там не binary, а balanced. Разделение от родительского узла до ветвей не обязательно по степени 2. Кроме того, при необходимости массовой выборки(когда считываются данные реально принадлежащие не одному листу индекса а нескольким) переход к др. листу выполняется без возврата к родительскому узлу за счет того, что листья хранят ссылку на соседние листья
Back to top
View user's profile Send private message
Armann
Модератор
Модератор



Joined: 01 Jan 2008
Posts: 422
Location: Moscow

PostPosted: Thu Nov 29, 2012 10:27 am    Post subject: Reply with quote

alezhu wrote:
Вы думаете, что поиск сначала отсеивает одно поле потом внутри отсеянного следующее и так далее. Это не так.

В моем представлении примерно так работает поиск по дереву индекса Smile Очень конечно упрощенно, да и понимание мое далеко от полного
Back to top
View user's profile Send private message Blog
alezhu
Специалист
Специалист



Joined: 29 Apr 2012
Posts: 86
Location: Spb

PostPosted: Thu Nov 29, 2012 10:37 am    Post subject: Reply with quote

Quote:
Armann
Возможно, Кодер прав и все зависит от конкретной реализации СУБД. Тогда Ваш подход тоже может быть правильным. Мне пока с уровня моих знаний кажется, что он будет медленнее в общем случае.
Back to top
View user's profile Send private message
Удав
Гуру
Гуру


Age: 48
Joined: 25 Jan 2008
Posts: 580
Location: Москва

PostPosted: Thu Nov 29, 2012 11:09 am    Post subject: Reply with quote

alezhu wrote:
Вы думаете, что поиск сначала отсеивает одно поле потом внутри отсеянного следующее и так далее. Это не так.

Как минимум для Oracle это так. Поиск идет именно по листьям дерева, а не по однородному массиву Wink

_________________
С уважением,
Удав.
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic    Russian ABAP Developer's Club Forum Index -> ABAP All times are GMT + 4 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum
You cannot attach files in this forum
You can download files in this forum


All product names are trademarks of their respective companies. SAPNET.RU websites are in no way affiliated with SAP AG.
SAP, SAP R/3, R/3 software, mySAP, ABAP, BAPI, xApps, SAP NetWeaver and any other are registered trademarks of SAP AG.
Every effort is made to ensure content integrity. Use information on this site at your own risk.