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





Вы смотрели, как запустить Мастер настройки индекса?? Вы получите предложения по индексам на основе рабочей нагрузки.
Две части недостающей информации: сколько различных значений содержится в каждом столбце и какую СУБД вы используете. Если вы используете Oracle и имеете менее нескольких тысяч различных значений на столбец, вы можете создавать индексы растровых изображений. Они очень компактны и экономичны для точных совпадений.
В противном случае это компромисс: каждый индекс добавит примерно столько же места, сколько и имя из одного столбца, содержащее те же данные, поэтому вы существенно удвоите (возможно, в 2,5 раза) свои требования к пространству. Так что, возможно, 10G, а это не так много данных.
Тогда возникает вопрос, сможет ли ваша СУБД эффективно объединить несколько выборок на основе индексов. Вполне возможно, что этого не произойдет, если вы не выполните самостоятельное объединение для каждого столбца, который вы выбираете.
Лучший ответ: попробуйте его на меньшем наборе данных (чтобы вы не тратили все свое время на создание индексов) и посмотрите, как это работает.
Ответ: Нет. Индексирование каждого столбца отдельно - не лучший вариант. Во многих случаях индексы должны состоять из нескольких столбцов, и существуют разные типы индексов для разных требований.
Мастер настройки, упомянутый в других ответах, - хороший первый вариант (особенно для учащегося).
Не пытайтесь угадать, как это сделать, и не надейтесь, что разбираетесь в сложном анализе - получите совет, соответствующий вашей ситуации. Похоже, здесь идет несколько потоков, которые довольно активны для конкретных ситуаций и оптимизации запросов.
Также не забывайте, что если столбцов много, оптимизатору потребуется больше времени, чтобы определить, какие индексы помогут, а какие нет. Многие, а возможно, и большинство столбцов не нуждаются в индексах; только те, которые активно используются в условиях фильтрации, приносят вам пользу.
@Jon, вот почему в реальных базах данных (например, DB2 :-) есть runstats и тому подобное, чтобы они могли держать оптимизатор в курсе распределения данных в таблицах. Оптимизатор может легко выбрать лучший индекс независимо от того, сколько их существует.
@doofle, в вопросе указано, что каждый столбец подлежит поиску - следовательно, для максимальной скорости они все должны быть проиндексированы, а также, возможно, индексы по группам из нескольких столбцов.
@ Pax, он спрашивает об индексе с одним полем для каждого столбца. И если столбец является первым в составном индексе, ему не нужен другой собственный индекс. Кроме того, например, индексы логических полей игнорируются, поэтому общее правило слишком наивно для таких случаев.
@doofle, прочтите вопрос - битовых полей НЕТ, поиску подлежит КАЖДЫЙ столбец.
@Pax, я не сказал "Бит", я сказал "логическое". "Y" / "N", "1" / "0", видимо, все в varchars. Пожалуйста, постарайтесь сосредоточиться на рассматриваемой проблеме. Вы пытаетесь объяснить количество элементов, если можете лучше. Но суть верна, как бы вы ее ни выразили. Слепое индексирование - плохая политика.
Слепое индексирование - плохая политика, но была предоставлена вся информация: «каждый столбец может быть критерием поиска в запросе». Для максимальной скорости В ЭТОМ СЛУЧАЕ (не обычно), чем больше индексов, тем лучше, включая ключи с несколькими столбцами, если эти типы запросов также возможны.
В целом я согласен с вашими комментариями (я не отрицал, кстати, кстати) - просто в этом случае достаточно информации, чтобы оправдать то, что хотел сделать спрашивающий.
DocId, вероятно, уникален, поэтому индекс не лучше полного сканирования таблицы (если он уникален). Точно так же DocType / DocId в качестве ключа не дает никаких преимуществ перед просто DocType. Итак, если мои предположения верны, вероятно, просто DocType. Еще не все...
Индекс DocId имел бы смысл, если бы размер записи был намного больше, чем ключ, но только с точки зрения «searchitems» на страницу на диске - вы можете загрузить больше ключей, чем записей, с одним вводом-выводом.
Объективный диалоговый вопрос. Два поля - это «Тип документа» и «Идентификатор документа». Есть только два типа документов. Ставите ли вы по одному индексу для каждого, по одному составному индексу для обоих или всех трех? -------------- Имеется поле «Состояние» типа CHAR (1) с активным «I» и активным «A». Индекс?
На этом я заинтересован в том, чтобы понять мою точку зрения. Некоторые поля по своей природе не требуют индексов. Это сложнее, чем «проиндексировать все», о чем я слышал, как он спрашивал. Даже в этом случае который не важен.
Да, я не хочу вводить какие-либо возможные жесткие ограничения, которые SO, возможно, наложил на комментарии к каждому ответу :-). Ваше здоровье.
Вы всегда можете задать такой вопрос. "Каковы жесткие ограничения?" -- Ваше здоровье.
Точно нет.
Вы должны понимать, как работают индексы. Если у вас есть таблица из, скажем, 1000 записей, но это BIT и может быть одно из двух значений, если вы индексируете только этот столбец и только этот столбец, это будет бесполезно, потому что оно не будет достаточно избирательным. Когда вы индексируете столбец, внимательно следите за тем, какие типы выборок будут выполняться в таблице. Когда вы создаете индекс для столбца, будет ли этот индекс достаточно избирательным, чтобы оптимизатор мог эффективно его использовать?
К этому моменту вы вполне можете обнаружить, что несколько тщательно отобранных составных индексов значительно превзойдут по эффективности решение с множеством отдельных индексов для каждого столбца. Золотое правило: от того, как запрашивать базу данных, зависит, как вы должны делать свои индексы.
@Dave, вопрос был для varchars, и каждый столбец был доступен для поиска, поэтому, хотя ваш ответ хорош для общего вопроса об индексах, он на самом деле не применим к этому вопросу. Ваше золотое правило верно, но у вас уже есть необходимая информация для принятия решения.
Тот факт, что в столбце есть VARCHAR, НЕ означает, что индекс является выборочным! Пример BIT был использован просто, чтобы проиллюстрировать то, что явно не могло быть выборочным. То же самое будет верно, если ваш столбец VARCHAR имеет только 2 или 3 значения на 1000 строк ...
Если вы выбираете набор столбцов из таблицы, больший, чем те, которые охватываются столбцами в выбранных индексах, тогда вы неизбежно столкнетесь с поиском закладок в плане запроса, где обработчик запросов должен получить непокрытые столбцы. из кластеризованного индекса с использованием идентификатора ссылки из конечных строк в связанном некластеризованном индексе.
По моему опыту, поиск по закладкам действительно может снизить производительность запроса из-за объема требуемых дополнительных чтений и того факта, что каждая строка в кластеризованном индексе должна обрабатываться индивидуально. Вот почему я стараюсь делать NC-индексы, покрывающие везде, где это возможно, что проще для небольших таблиц, где требуемые планы запросов хорошо известны, но если у вас есть большие таблицы с большим количеством столбцов с ожидаемыми произвольными запросами, то этого, вероятно, не будет. достижимый.
Это означает, что вы получаете прибыль только с NC-индексом любого типа, если индекс покрывает или выбирает достаточно небольшой набор данных, что снижает затраты на поиск по закладкам - действительно, вы можете обнаружить, что оптимизатор запросов не будет даже смотреть на ваши индексы, если стоимость слишком высока по сравнению с сканированием кластерного индекса, когда все столбцы уже доступны.
Поэтому нет смысла создавать индекс, если вы не знаете, что индекс оптимизирует результат данного запроса. Таким образом, значение индекса пропорционально проценту запросов, которые он может оптимизировать для данной таблицы, и это можно определить только путем анализа выполняемых запросов, что и делает за вас мастер настройки индекса.
так в итоге:
1) Не индексируйте каждый столбец. Это классическая преждевременная оптимизация. Невозможно заранее оптимизировать большую таблицу с индексами для всех возможных планов запросов.
2) Не индексируйте столбцы, пока вы не захватите и не запустите базовую рабочую нагрузку с помощью мастера настройки индекса. Эта рабочая нагрузка должна отражать шаблоны использования вашего приложения, чтобы мастер мог определить, какие индексы действительно помогут производительности ваших запросов.
@KiwiBastard (это может быть кто угодно из Новой Зеландии, привет из страны Оз :-), хороший ответ, +1. Выполняет ли мастер статистику «на лету» (чтобы оптимизировать оптимизатор) или просто предлагает новые команды DDL для применения к таблицам? В DB2 есть runstats, которая изменяет пути плана на основе данных в таблицах.