У меня есть таблица с записями от 1 до 5 миллионов. Небольшая часть этих записей имеет один из битовых столбцов, установленный в «TRUE». Нужно быстро найти эти записи. Я думаю, что индекс может ускорить поиск по этому столбцу, но я боюсь насчет INSERT. Отсюда и мой вопрос.
База данных работает как хранилище данных, поэтому существует множество SELECT и небольших (до 10-20 в день), но довольно больших INSERT (до 200 тысяч записей одновременно). Я боюсь более длительного времени этого импорта в базу данных.
sql-server
sql-server-2005
marioosh
источник
источник
Ответы:
Битовый индекс на 1 миллион записей бесполезен. Оптимизатор никогда не будет его использовать, вы просто заплатите за его поддержку. Гораздо лучшая альтернатива - добавить этот бит как самый левый ключ в кластеризованном индексе.
Но я сделаю слепой выстрел в темноте и угадаю, что у вас есть шаблон очереди: записи сбрасываются в таблицу с битом, установленным в «ИСТИНА» (т. Е. «Needsprocessing = true»), и затем фоновый процесс выглядит для этих записей выполняет некоторую обработку и обновляет бит до FALSE. Это вездесущий паттерн, также известный как «шаблон рецепта катастрофы производительности». Я бы порекомендовал поместить записи в таблицу и одновременно поместить уведомление (может быть таким же простым, как только что вставленный идентификатор записи) в очередь . См. Использование таблиц в качестве очередей .
источник
Как сказал @MartinSmith, если вы когда-нибудь обновитесь до SQL 2008, тогда фильтрованный индекс будет идеальным решением. Однако в то же время в общем случае ЛЮБОЙ добавленный индекс увеличит ваше время загрузки. Маленькие индексы меньше, чем большие.
Одна вещь, на которую я бы обратил внимание, это наличие у вас существующего индекса, который можно изменить. Предполагая, что ваши существующие запросы используют заданный индекс, добавление битового столбца в конец этого индекса должно иметь минимальное влияние на вставки и положительный эффект, который вы просматриваете в своих запросах.
Следующая вещь, на которую стоит обратить внимание: «У меня уже есть много индексов?» Не существует жесткого и быстрого правила относительно того, что такое «много», но я обычно придерживаюсь правила из 10 индексов - это предел, если мне ДЕЙСТВИТЕЛЬНО не нужен новый.
Последняя мысль, проверить это на тестовом экземпляре. Настройте таблицу с несколькими миллионами строк, запустите на ней нагрузку, добавьте индекс, затем снова запустите загрузку и посмотрите, не заметите ли вы значительное увеличение времени загрузки.
Только вы действительно можете решить, что является «значительным». У меня есть машины, где добавление 5 минут к времени загрузки является «значительным», а другие, где я смело могу увидеть увеличение на пару часов.
РЕДАКТИРОВАТЬ:
Другой вариант - разделить ваш стол. Возможно, вам придется использовать многораздельное представление, если вы не используете Enterprise Edition, но даже в этом случае это должно помочь. Вы помещаете свой бит 0 в один раздел, а свой бит 1 в другой. Предполагая, что вы вставляете только одну версию или другую, вы можете даже ускорить вставку.
источник