24.03.2008, 12:37 | #1 |
Участник
|
CustInvoiceTrans кластерный индекс
Всем доброго времени суток!
Кто нибудь, подскажет, зачем в DAX4 понадобилось создавать кластерный индекс по RecId? Не приведет ли это к снижению производительности при массовой обработки накладных в заказах? Ведь в тройке индекс не был кластерным. Заранее спасибо за пояснения. |
|
24.03.2008, 12:38 | #2 |
Участник
|
Кластерный индекс на таблице CustInvoiceTrans
|
|
24.03.2008, 12:52 | #3 |
Участник
|
Создание кластерных индексов на крупных таблицах, вряд ли оправдано
|
|
24.03.2008, 12:59 | #4 |
SAP
|
Цитата:
Кто нибудь, подскажет, зачем в DAX4 понадобилось создавать кластерный индекс по RecId?
|
|
|
За это сообщение автора поблагодарили: Tarrash (1). |
24.03.2008, 13:09 | #5 |
Moderator
|
Цитата:
Создание кластерных индексов на крупных таблицах, вряд ли оправдано
|
|
24.03.2008, 13:14 | #6 |
Участник
|
А не может быть такой ситуации (пока теоретически).
Допустим первая обработка зарезервировала несколько десятков тысяч значений RecId. В это время другая обработка вставляет уже другие записи (RecId резервируется позднее). После этого вставляются с записи из первой обработки. Причем значения RecId будут меньше, чем из второй обработки. В результате перестроение кластерного индекса. Ведь резервирование RecId осуществляется средствами DAX-а а не SQL |
|
24.03.2008, 13:20 | #7 |
Участник
|
Андре, дело в том что кластерные индексы оправданы в основном для редко изменяемых таблиц (это в основном справочники). И konopello абсолютно прав, если записи вставляются в СТРОГОМ порядке возрастания RecId то обновление кластерного индекса по RecId не приводит к большим затратам по производительности. Но вопрос, всегда ли записи будут вставляться СТРОГО по возрастанию RecId?
|
|
24.03.2008, 13:20 | #8 |
Moderator
|
Цитата:
Не приведет ли это к снижению производительности при массовой обработки накладных в заказах?
|
|
24.03.2008, 13:29 | #9 |
Участник
|
Спасибо за совет, Андре. Мы конечно погоняем тесты в разных варинатах, проанализируем планы выполнения запросов и т. п. и примем решение.
Но все равно интересно, почему именно для этой таблицы CustInvoiceTrans нужно было создавать кластерный индекс (прошу извинения за излишнюю дотошность). По InventTrans, например, нет кластерного индекса. |
|
24.03.2008, 13:34 | #10 |
Злыдни
|
|
|
24.03.2008, 13:38 | #11 |
Участник
|
Yprit, примерно что-то подобное уже обсуждалось
Посмотрите, пожалуйста, Кластерный индекс на InventTrans в AX 4.0 |
|
24.03.2008, 13:42 | #12 |
Участник
|
Yprit, вернее было бы сказать, индекс оправдан для, таблиц для которых значение ключа кластерного индекса монотонно возрастает/убывает или вставка записей в данную таблицу происходит достаточно редко. Прошу извинения, если не четко формулирую проблему. Но вопрос в другом: насколько ОПРАВДАН кластерный индекс ИМЕННО на таблице CustInvoiceTrans?
|
|
24.03.2008, 13:51 | #13 |
Злыдни
|
Tarrash, если ответить прямо на Ваш вопрос - потому что по BP максимально возможное число (если не все) таблицы в БД должны иметь кластерный индекс. В 4-ке попытались приблизиться к этому стандарту, правда не всегда обдуманно и удачно. В случае с CustInvoiceTrans - наверное, это не лучший выход, но ничего старшного в этом я тоже не вижу.
|
|
|
За это сообщение автора поблагодарили: Tarrash (1). |
24.03.2008, 14:01 | #14 |
Moderator
|
Цитата:
по BP максимально возможное число (если не все) таблицы в БД должны иметь кластерный индекс
|
|
24.03.2008, 14:08 | #15 |
Злыдни
|
Ну, когда следование конкретному правилу BP в 90% случаях действительно является оправданным, то я обычно ссылаюсь на BP Можно обсудить, конечно, и преимущества куч перед кластреными индесами, и конкретные случаи выигрыша без использования кластерных индексов. Но это, скорее, для sql.ru уже. Поэтому я просто с Вами соглашусь Ну и ссылочку для комплекта
http://www.microsoft.com/technet/pro.../clusivsh.mspx |
|
24.03.2008, 14:20 | #16 |
Moderator
|
Цитата:
Можно обсудить, конечно, и преимущества куч перед кластреными индесами, и конкретные случаи выигрыша без использования кластерных индексов.
|
|
24.03.2008, 15:23 | #17 |
Moderator
|
А единственный (и основной) минус кластерного индекса состоит в том, что во всех некластерных индексах, вместо RowId хранится ключ кластерного индекса. Поэтому при выборке по некластерному индексу, фактически делается две выборки: Сначала выбираются значения ключей кластерного индекса из обычного индекса, затем по значениям этих ключей, выбираются записи из кластерного индекса. Так что я вот к рекомендации BP отношусь достаточно настороженно; Кластерный индекс однозначно лучше только в том случае, если процентов 70 выборок делается ТОЛЬКО по нему, а все остальные индексы используются только в каких-то экстремальных случаях.
|
|
24.03.2008, 15:32 | #18 |
Злыдни
|
|
|
24.03.2008, 15:41 | #19 |
Moderator
|
Не совсем. В кластерном индексе тоже может быть несколько уровней у дерева. То есть - если у нас все индексы обычные, мы после сканирования получили список rowid и на доступ к каждой записи по rowid нам требуется ОДНО обращение к диску. В случае наличия кластерного индекса, если мы отсканировали обычный индекс, мы получили список ключей кластерного индекса. И потом для поиска каждой такой записи нам нужно минимум ДВА доступа к диску (вырожденный случай, когда у нас вся таблица влезла в одну страницу не рассматриваем). А если записей нас много - то и уровней в кластерном индексе может быть 3-4-5. Соответственно - поиск по обычному индексу занял 3 доступа к диску, а потом еще поиск по кластерному индексу занял 3 доступа к диску. Время поиска выросло почти в два раза...
|
|
24.03.2008, 16:22 | #20 |
Злыдни
|
|
|