Индексы базы данных: только выбор!

Добрый день,

У меня около 4 ГБ данных, разделенных примерно на 10 разных таблиц. В каждой таблице много столбцов, и каждый столбец может быть критерием поиска в запросе. Я вообще не администратор базы данных и не очень разбираюсь в индексах, но хочу максимально ускорить поиск. Важным моментом является то, что никаких обновлений, вставок или удалений не будет ни в какой момент (таблицы заполняются раз в 4 месяца). Уместно ли создавать индекс для каждого столбца? Помните: ни вставки, ни обновления, ни удаления, только выбор! Кроме того, если я могу сделать все эти столбцы целыми числами вместо varchar, смогу ли я изменить скорость?

Большое тебе спасибо!


person Community    schedule 08.12.2008    source источник


Ответы (5)


Ответ: Нет. Индексирование каждого столбца в отдельности - не лучший вариант. Во многих случаях индексы должны состоять из нескольких столбцов, и существуют разные типы индексов для разных требований.

Мастер настройки, упомянутый в других ответах, - хороший первый вариант (особенно для учащегося).

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

person dkretz    schedule 09.12.2008
comment
Кроме того, не забывайте, что если столбцов много, оптимизатору потребуется больше времени, чтобы определить, какие индексы помогут, а какие нет. Многие, а возможно, и большинство столбцов не нуждаются в индексах; только те, которые активно используются в условиях фильтрации, приносят вам пользу. - person Jonathan Leffler; 09.12.2008
comment
@Jon, вот почему в реальных базах данных (например, DB2 :-) есть runstats и тому подобное, чтобы они могли держать оптимизатор в курсе распределения данных в таблицах. Затем оптимизатор может легко выбрать лучший индекс независимо от того, сколько их существует. - person paxdiablo; 09.12.2008
comment
@doofle, в вопросе указано, что поиску подлежит каждый столбец - следовательно, для максимальной скорости все они должны быть проиндексированы, а также, возможно, индексы по группам из нескольких столбцов. - person paxdiablo; 09.12.2008
comment
@ Pax, он спрашивает об индексе с одним полем для каждого столбца. И если столбец является первым в составном индексе, ему не нужен другой собственный индекс. Кроме того, например, индексы логических полей игнорируются, поэтому общее правило слишком наивно для таких случаев. - person dkretz; 09.12.2008
comment
@doofle, прочтите вопрос - битовых полей НЕТ, поиску подлежит КАЖДЫЙ столбец. - person paxdiablo; 09.12.2008
comment
@Pax, я не сказал Бит, я сказал логическое. Д / Н, 1/0, видимо все дело в варчарах. Пожалуйста, постарайтесь сосредоточиться на проблеме. Вы пытаетесь объяснить количество элементов, если можете лучше. Но суть верна, как бы вы ее ни выразили. Слепое индексирование - плохая политика. - person dkretz; 09.12.2008
comment
Слепое индексирование - плохая политика, но вся информация была предоставлена: каждый столбец может быть критерием поиска в запросе. Для максимальной скорости В ЭТОМ СЛУЧАЕ (не обычно), чем больше индексов, тем лучше, включая многостолбцовые ключи, если такие типы запросов также возможны. - person paxdiablo; 09.12.2008
comment
Я согласен с вашими комментариями в целом (я не отрицал, кстати,) - просто в этом случае достаточно информации, чтобы оправдать то, что хотел сделать спрашивающий. - person paxdiablo; 09.12.2008
comment
DocId, вероятно, уникален, поэтому индекс не лучше полного сканирования таблицы (если он уникален). Точно так же DocType / DocId в качестве ключа не дает никаких преимуществ перед просто DocType. Итак, если мои предположения верны, вероятно, просто DocType. Еще не все... - person paxdiablo; 09.12.2008
comment
Индекс DocId имел бы смысл, если бы размер записи был намного больше ключа, но только с точки зрения «элементов поиска» на страницу на диске - вы можете загрузить больше ключей, чем записей, с одним вводом-выводом. - person paxdiablo; 09.12.2008
comment
Объективный диалоговый вопрос. Два поля - это тип документа и идентификатор документа. Есть только два типа документов. Ставите ли вы по одному индексу для каждого, по одному составному индексу для обоих или всех трех? -------------- Есть поле состояния CHAR (1) с неактивным и активным. Показатель? - person dkretz; 09.12.2008
comment
На этом я заинтересован в том, чтобы понять мою точку зрения. Некоторые поля по своей природе не требуют индексов. Это сложнее, чем все проиндексировать, как я слышал, он спрашивал. Но даже тогда это не это важный момент. - person dkretz; 09.12.2008
comment
Да, я не хочу вводить какие-либо возможные жесткие ограничения, которые SO, возможно, наложил на комментарии к каждому ответу :-). Ваше здоровье. - person paxdiablo; 09.12.2008
comment
Вы всегда можете задать такой вопрос. Каковы жесткие ограничения? -- Ваше здоровье. - person dkretz; 09.12.2008

Вы смотрели, как запустить Мастер настройки индекса? Даст вам предложения индексов на основе рабочей нагрузки.

person JamesSugrue    schedule 09.12.2008
comment
@KiwiBastard (это может быть кто угодно из Новой Зеландии, привет из страны Оз :-), хороший ответ, +1. Выполняет ли мастер статистику «на лету» (чтобы оптимизировать оптимизатор) или просто предлагает новые команды DDL для применения к таблицам? В DB2 есть runstats, которая изменяет пути плана на основе данных в таблицах. - person paxdiablo; 09.12.2008

Абсолютно нет.

Вы должны понимать, как работают индексы. Если у вас есть таблица из, скажем, 1000 записей, но это BIT и может быть одно из двух значений, если вы индексируете только этот столбец и только этот столбец, это будет бесполезно, потому что оно не будет достаточно избирательным. Когда вы индексируете столбец, внимательно следите за тем, какие типы выборок будут выполняться в таблице. Когда вы создаете индекс для столбца, будет ли этот индекс достаточно избирательным, чтобы оптимизатор мог эффективно его использовать?

К этому моменту вы вполне можете обнаружить, что несколько тщательно отобранных составных индексов значительно превзойдут по эффективности решение с множеством отдельных индексов для каждого столбца. Золотое правило: от того, как запрашивать базу данных, зависит, как вы должны делать свои индексы.

person Dave Markle    schedule 09.12.2008
comment
@Dave, вопрос был для varchars, и каждый столбец был доступен для поиска, поэтому, хотя ваш ответ хорош для общего вопроса об индексах, он не совсем применим к этому вопросу. Ваше золотое правило верно, но у вас уже есть необходимая информация для принятия решения. - person paxdiablo; 09.12.2008
comment
Тот факт, что в столбце есть VARCHAR, НЕ означает, что индекс является выборочным! Пример BIT использовался только для иллюстрации того, что явно не могло быть выборочным. То же самое будет верно, если ваш столбец VARCHAR имеет только 2 или 3 значения на 1000 строк ... - person Dave Markle; 09.12.2008

Две недостающие информации: сколько различных значений содержится в каждом столбце и какую СУБД вы используете. Если вы используете Oracle и имеете менее нескольких тысяч различных значений на столбец, вы можете создавать индексы растровых изображений. Они очень компактны и экономичны для точных совпадений.

В противном случае это компромисс: каждый индекс будет добавлять примерно столько же места, сколько и имя из одного столбца, содержащее те же данные, поэтому вы существенно удвоите (возможно, в 2,5 раза) свои требования к пространству. Так что, возможно, 10G, а это не так много данных.

Тогда возникает вопрос, сможет ли ваша СУБД эффективно объединить несколько выборок на основе индексов. Вполне возможно, что этого не произойдет, если вы не выполните самообъединение для каждого столбца, который вы выбираете.

Лучший ответ: попробуйте его на меньшем наборе данных (чтобы вы не тратили все свое время на создание индексов) и посмотрите, как это работает.

person kdgregory    schedule 09.12.2008

Если вы выбираете набор столбцов из таблицы, больший, чем те, которые покрыты столбцами в выбранных индексах, тогда вы неизбежно столкнетесь с поиском закладок в плане запроса, где обработчик запросов должен получить непокрытые столбцы. из кластеризованного индекса, используя идентификатор ссылки из конечных строк в связанном некластеризованном индексе.

По моему опыту, поиск по закладкам действительно может снизить производительность запроса из-за объема требуемых дополнительных операций чтения и того факта, что каждая строка в кластеризованном индексе должна обрабатываться индивидуально. Вот почему я стараюсь сделать NC-индексы, покрывающие везде, где это возможно, что проще для небольших таблиц, где требуемые планы запросов хорошо известны, но если у вас есть большие таблицы с большим количеством столбцов с ожидаемыми произвольными запросами, то этого, вероятно, не будет. достижимый.

Это означает, что вы получаете прибыль только с NC-индексом любого типа, если индекс покрывает или выбирает достаточно малый набор данных, что снижает затраты на поиск по закладкам - действительно, вы можете обнаружить, что оптимизатор запросов даже не будет смотреть на ваши индексы, если стоимость слишком высока по сравнению с сканированием кластерного индекса, когда все столбцы уже доступны.

Поэтому нет смысла создавать индекс, если вы не знаете, что индекс оптимизирует результат данного запроса. Таким образом, значение индекса пропорционально проценту запросов, которые он может оптимизировать для данной таблицы, и это можно определить только путем анализа выполняемых запросов, что и делает за вас мастер настройки индекса.

итак, вкратце:

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

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

person Community    schedule 10.12.2008