Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
использование include в индексе.
|
|||
|---|---|---|---|
|
#18+
Добрый день, подскажите пожалуйста в каких случаях следует использовать индекс с include. Такой пример: Таблица1 в которой 15 полей. Поля с 1 по 3 представляют первичный ключ. С таблицей работают только 2 процедуры - процедура 1 добавляет записи и процедура 2 читает. Записи не удаляются. Частота чтений и добавлений примерно одинаковая. Процедура 2 связывает таблицу 1 с таблицей 2 по полям с 4 по 5 и с таблицей 3 по полям 5, 6, 7. Поля 1,2,3, 8 - 15 возвращаются процедурой. DB2 советуетTo improve data-retrieval, add INCLUDE columns to unique indexes. Good candidates are columns that: Are accessed frequently and therefore would benefit from index-only access Are not required to limit the range of index scans Do not affect the ordering or uniqueness of the index key. ( совет находится здесь ) Кажется, что можно было бы создать такие индексы Код: plaintext 1. 2. Правильно ли я понимаю, что раз поля 4,5,6,7 участвуют в соединениях (inner joins) с другими таблицами, то они влияют на диапозон сканируемых индексных ключей и следовательно должны быть исключены из include. В тоже время, индекс по ним нужен, для того чтобы соединения работали быстрее? Целесообразен ли такой сценарий? Я вижу следующие аргументы против: практическое дублирование данных т.к. их приходится хранить как в индексных страницах так и в страницах данных. Так ли это или хранение как-то оптимизируется? Дороговизна insert, т.к. нужно ещё добавлять данные в такой большой индекс. Сильно ли дорожает Insert на самом деле? И ещё такой вопрос - если те поля, которые входят в Include являются по сути некластерным индексом, т.к. они, если я правильно понял, не сортируются, то зачем тогда создавать ещё один некластерный индекс, когда можно просто всё разместить в одном большом индексе: Код: plaintext Помогите пожалуйста разобраться. Что-то подсказывает, что такие большие индескы делать не надо, но в чём тогда смысл совета стараться помещать в индекс поля наиболее часто возвращаемые запросами? Заранее извиняюсь, если путанно изложил свой вопрос и конечно всем заранее огромное спасибо за участие. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2009, 22:30 |
|
||
|
использование include в индексе.
|
|||
|---|---|---|---|
|
#18+
Кажется, я очень запутанно всё изложил. Поставлю вопрос так. Если предположить, что у таблицы есть только один уникальный индекс, который выбирается при исполнении запроса, то насколько имеет смысл делать include и добавлять поля отображаемые в результате запроса. Понятно, что отображение должно работать быстрее, но когда это действительно имеет смысл делать? Например если запрос возвращает с десяток записей, то наверное считать их из страниц данных не займёт много времени. В чём же выигрыш идеи по сравнению с расходами? Насколько сильно при этом страдает insert/update (учитывая, что поля входящие в include вроде бы не упорядочиваются, т.е. перестраиваются только указатели) Заранее спасибо за ответ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.02.2009, 22:18 |
|
||
|
использование include в индексе.
|
|||
|---|---|---|---|
|
#18+
Я думаю так. Индекс с вложенными полями это что типа маленькой таблицы. Допустим у вас есть очень "широкая" таблица. Которая логически может быть разделена на несколько частей. Вот с помощью такого индекса можно ее и разделить. Если объемы маленькие (пару десятков строк) то выигрыш от такого индекса не будет, так как fetch хоть и будет работать медленнее, но не за столько что бы покрыть потери в дисковом пространстве и производительности вставке(изменение\удаление). С другой стороны при больших объемах. Он может вам помочь, что бы не пришлось сканировать всю таблицу, а дергать только нужные поля. в вашем примере, я не знаю, что за запрос у вас там крутится, но Код: plaintext 1. Это все на основе теории, на практике такие индексы применять не приходилось. Самый лучший вариант это сделать тестовый пример и попробовать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2009, 06:54 |
|
||
|
использование include в индексе.
|
|||
|---|---|---|---|
|
#18+
Мысли вслух 1) спроси db2advis и он тебе подскажет целесообразность включения полей в индекс. 2) надо проиграть несколько сценариев с индексами и без. 2) В принципе смысл есть. Однако нужно смотреть на SELECT'ы вы всегда тащите все поля или в большинстве случаев только 2-3? 4) Опять же объемы данных. Если это небольшой справочник порядка 100000 строк почему нет... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2009, 09:16 |
|
||
|
использование include в индексе.
|
|||
|---|---|---|---|
|
#18+
Построение индексов - процесс творческий. Иногда бывает, что предложенные db2asdvis индексы приходится анализировать и некоторые удалять (бывало в практике, удаление индекса ускорило именно выборку). Впрочем, статистику собирать не надо забывать. Надо, пожалуй, почитать, по поводу блокировок при использовании индексов. Хотя, по логике, при выборке хоть из таблицы, хоть из индекса, блокировки таблиц должны быть. Индексы рулят, однако если их штук 100 на большой таблице, приходится задумываться. С include мы используем индексы, но, обычно, включаем мало полей (2-4). А еще можно индексы в разные с таблицей tablespace разносить, хотя я не проверял, насколько это оптимальней и лучше работает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2009, 10:06 |
|
||
|
|

start [/forum/topic.php?fid=43&msg=35812353&tid=1603417]: |
0ms |
get settings: |
10ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
77ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
52ms |
get tp. blocked users: |
2ms |
| others: | 256ms |
| total: | 429ms |

| 0 / 0 |
