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 -> SQL and Database Changes
View previous topic :: View next topic  
Author Message
admin
Администратор
Администратор



Joined: 01 Sep 2007
Posts: 1639

PostPosted: Mon Feb 25, 2008 2:44 pm    Post subject: Когда нужно создавать индексы Reply with quote

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

Индексы улучшают производительность тех запросов, которые выбирают небольшой процент строк из таблицы. Как общее правило, вы должны создавать индексы по таблицам, из которых часто выбирается 2-4% строк. Это правило основывается на следующих предположениях:

  • Строки с одинаковыми значениями того столбца, на котором построен запрос, равномерно распределены между блоками данных, распределенными таблице.
  • Строки в таблице упорядочены случайным образом по отношению к столбцу, на котором построен запрос.
  • Каждый блок данных, распределенный таблице, содержит по меньшей мере 10 строк.
  • Таблица содержит относительно малое количество столбцов.
  • Большинство запросов по таблице имеют относительно простые фразы WHERE.

Если эти предположения не характеризуют данные в вашей таблице и запросы, выбирающие их, то процент выбираемых строк, при котором индекс полезен, может возрасти вплоть до 25%.

Как выбирать столбцы для индекса

При выборе столбцов для индекса руководствуйтесь следующими правилами:

  • Индексируйте столбцы, которые часто используются в фразах WHERE.
  • Индексируйте столбцы, которые часто используются для соединения таблиц в предложениях SQL.
  • Индексируйте лишь столбцы, обладающие хорошей селективностью. СЕЛЕКТИВНОСТЬ столбца - это процент строк, имеющих одинаковое значение для индексированного столбца. Селективность столбца хороша, если мало строк имеют одинаковые значения для этого столбца. Заметьте, что ORACLE неявно создает индексы по столбцам, определенным (через ограничения целостности) как первичные или уникальные ключи. Такие индексы наиболее селективны и наиболее эффективны для оптимизации производительности.
    Вы можете определить селективность столбца, поделив число строк в таблице на число различных индексированных значений. Вы можете получить эти значения с помощью команды ANALYZE. Селективность, вычисленная таким способом, должна трактоваться как процент.
  • Не индексируйте столбцы, имеющие мало различающихся значений. Такие столбцы обычно имеют низкую селективность, и потому не оптимизируют производительность, если только часто выбираемые значения столбца не встречаются намного реже, чем остальные значения этого столбца.
    Например, рассмотрим столбец, который содержит равные количества значений 'YES' и 'NO'. Индексирование такого столбца обычно не приводит к улучшению производительности. Однако, если значение 'YES' встречается относительно редко, а ваше приложение часто опрашивает на 'YES', то индексирование такого столбца может улучшить производительность.
  • Не индексируйте столбцы, которые часто модифицируются. Предложения UPDATE, модифицирующие индексированные столбцы, и предложения INSERT и DELETE, модифицирующие индексированные таблицы, выполняются дольше, чем если бы индекса не было. Такие предложения SQL должны модифицировать данные в индексах, когда они модифицируют данные в таблице.
  • Не индексируйте столбцы, которые появляются в фразах WHERE только с функциями или операторами. Фраза WHERE, использующая с индексированным столбцом функцию (отличную от MIN или MAX) или оператор, не делает возможным путь доступа, использующий индекс по этому столбцу.
  • Индексируйте внешние ключи, входящие в ограничения ссылочной целостности, в тех случаях, когда большое количество одновременных предложений INSERT, UPDATE и DELETE обращаются к родительской и порожденной таблицам. Такой индекс позволяет ORACLE модифицировать данные в порожденной таблице, не блокируя родительскую таблицу.

Решая, индексировать ли данный столбец, учитывайте, компенсирует ли выигрыш в производительности, достигаемый для запросов, тех потерь производительности, которые будут иметь место для предложений INSERT, UPDATE и DELETE, а также той памяти, которая будет затрачена на индекс. Вы можете провести эксперименты и сравнить время обработки ваших предложений SQL с индексами и без них. Время обработки можно измерять с помощью средства трассировки SQL.

Как выбирать составные индексы

СОСТАВНОЙ ИНДЕКС - это индекс, состоящий из более чем одного столбца. Составные индексы могут предоставлять дополнительные преимущества по сравнению с одностолбцовыми индексами:

1) лучшая селективность. Иногда можно скомбинировать два или более столбцов, каждый из которых обладает низкой селективностью, в составной индекс, имеющий хорошую селективность.

2) дополнительный источник данных. Если все столбцы, выбираемые запросом, входят в составной индекс, то ORACLE может возвратить эти значения прямо из индекса, не обращаясь к таблице.

SQL запрос может использовать путь доступа, включающий составной индекс, если это предложение содержит конструкты, которые используют ведущую порцию индекса. ВЕДУЩАЯ ПОРЦИЯ индекса - это один или несколько столбцов, которые были специфицированы первыми и подряд в списке столбцов предложения CREATE INDEX, с помощью которого был создан индекс. Рассмотрим следующее предложение CREATE INDEX:

CREATE INDEX comp_ind ON tab1(x, y, z)

Следующие комбинации столбцов являются ведущими порциями этого индекса: X, XY и XYZ. Другие комбинации столбцов, например, XZ, YZ или Z, не являются ведущими порциями этого индекса.
При выборе столбцов для составных индексов руководствуйтесь следующими правилами:


  • Создавайте составной индекс по тем столбцам, которые часто используются вместе в условиях фразы WHERE, будучи соединены операторами AND, особенно если их комбинированная селективность лучше, чем индивидуальная селективность каждого столбца по отдельности. Если некоторые из столбцов, составляющих индекс, используются в фразах WHERE более часто, не забудьте обеспечить, чтобы эти столбцы составляли ведущую порцию индекса, с тем, чтобы предложения, использующие только эти столбцы, могли использовать доступ через индекс.
  • Если существует ряд запросов, базирующихся на одном и том же наборе столбцов, рассмотрите возможность создания составного индекса, в который вошли бы все эти столбцы, образуя его ведущую порцию.
  • Если составной индекс должен использоваться в запросах, базирующихся на значениях нескольких столбцов, то упорядочение этих столбцов от более селективного к менее селективному в предложении CREATE INDEX лучше всего повышает производительность запросов.

Разумеется, необходимо учитывать и вопросы, касающиеся общих преимуществ и недостатков индексов, которые рассматривались в предыдущих секциях.
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 -> SQL and Database Changes 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.