Скопировать индекс на постоянно увеличивающийся столбец datetime на таблицу протоколирования?
Я не администратор базы данных ( "Хорошо!", вы сразу подумаете.)
У меня есть таблица данных регистрации данных с этими характеристиками и шаблонами использования:
- Столбец
datetime
для хранения временных меток журнала, значение которых постоянно увеличивается и в основном (но только в основном) уникально
- Частые вставки (скажем, дюжина минут), только в конце диапазона временных меток (регистрируются новые данные)
- Нечасто удаляет, навалом, с начала диапазона временных меток (старые данные очищаются)
- Нет обновлений вообще
- Частый выбор выбирается с использованием столбца временной метки в качестве основного критерия наряду со вторичными критериями для других столбцов.
- Нечасто выбирает использование других столбцов в качестве критериев (и не включает столбец временной метки).
- Хорошее количество данных, но нигде не достаточно, что я очень беспокоюсь о пространстве памяти
Кроме того, в настоящее время имеется ежедневное окно обслуживания, в течение которого я мог бы оптимизировать таблицу.
Я, честно говоря, не ожидаю, что эта таблица вызовет вызов сервера, на котором он будет включен, даже если я неверно проиндексирую его, но, тем не менее, это была хорошая возможность запросить некоторый вклад в кластеризованные индексы SQL Server.
Я знаю, что кластеризованные индексы определяют хранение фактических данных таблицы (данные хранятся в листовых узлах самого индекса) и что некластеризованные индексы являются отдельными указателями на данные. Таким образом, в условиях запроса кластеризованный индекс будет быстрее, чем некластеризованный индекс - как только мы найдем значение индекса, данные прямо там. Существуют затраты на вставку и удаление (и, конечно, обновление, изменяющее значение столбчатого индекса столбца, было бы особенно дорогостоящим).
Но я читаю в этом ответе, который удаляет пробелы в разрешении, которые не очищаются до/если индекс не будет восстановлен.
Все это говорит мне, что я должен:
- Поместите кластеризованный индекс в столбец временной отметки со 100% -ным заполняющим фактором
- Поместите некластеризованные индексы в любой другой столбец, который может использоваться в качестве критерия в запросе, который также не включает кластерный столбец (который может быть любым из них в моем случае)
- Запланировать массовые удаления в течение ежедневного периода обслуживания
- Запланировать перестройку кластерного индекса сразу после массового удаления
- Расслабьтесь и выходите больше.
Неужели я там одинок? Нужно ли мне часто перестраивать индекс таким образом, чтобы избежать большого количества потраченного впустую пространства? Есть ли другие очевидные (для DBA) вещи, которые я должен делать?
Спасибо заранее.
Ответы
Ответ 1
Я согласен с помещением кластерного индекса в столбец timestamp. Мой запрос будет на fillfactor - 100% дает лучшую производительность чтения за счет производительности записи. вы можете пострадать от разрывов страниц. Выбор нижнего заполняющего фильтра приведет к задержке разделения страниц за счет производительности чтения, поэтому его тонкий балансирующий акт станет лучшим для вашей ситуации.
После того, как массовая часть удалит свою ценность, перестройте индексы и обновите статистику. Это не только повышает производительность, но и сбрасывает индексы к указанному заполняющему фактору.
Наконец, да поставьте некластеризованные индексы в другие соответствующие столбцы, но только те, которые очень удобны, например, не бит. Но помните, что чем больше индексов, тем больше это влияет на производительность записи
Ответ 2
Вопреки тому, что, по мнению многих, наличие хорошего кластерного индекса на столе может фактически ускорить операции типа INSERT - да, быстрее!
Отъезд оригинального сообщения в блоге Дискуссия с кластеризованным индексом продолжается. Кимберли Трипп - конечная индексирующая королева.
Она упоминает (примерно в середине статьи):
Вкладыши быстрее в кластеризованных таблицу (но только в "правильном" кластеризованная таблица), чем по сравнению с куча. Основная проблема здесь в том, что поиск в IAM/PFS для определения расположение вставки в куче медленнее, чем в кластеризованной таблице (где местоположение вставки известно, определяемый кластеризованным ключом). Вставки быстрее вставляются в таблицу где порядок определен (CL) и где этот порядок все возрастает.
Решающим моментом является то, что только с правильным кластеризованным индексом вы сможете воспользоваться преимуществами - когда кластеризованный индекс является уникальным, узким, стабильным и оптимально все возрастающим. Это лучше всего использовать с колонкой INT IDENTITY.
У Кимберли Триппа также есть отличная статья о том, как выбрать наилучший возможный ключ кластеризации для ваших таблиц и какие критерии он должен выполнить - см. ее сообщение под названием Ever - увеличение ключа кластеризации - обсуждение кластерного индекса.......... снова!
Если у вас есть такой столбец - например, суррогатный первичный ключ - используйте это для вашего ключа кластеризации, и вы должны увидеть очень хорошую производительность на своем столе - даже на множестве INSERT.
Ответ 3
Существует два способа "лучшей практики" индексирования таблицы регистрации трафика:
- целочисленный столбец идентификатора как основной кластерный ключ
- уникальный идентификатор в качестве первичного ключа с
DEFAULT NEWSEQUENTIALID()
Оба метода позволяют SQL Server эффективно расширять таблицу, поскольку он знает, что дерево индексов будет расти в определенном направлении.
Я бы не помещал никаких других индексов в таблицу или не планировал перестроить индекс, если только не возникает проблема с производительностью.
Ответ 4
Очевидный ответ зависит от того, как вы его запросите. Точка индекса заключается в уменьшении количества сравнений при выборе данных. Кластеризованный индекс помогает, когда вы рассматриваете, какие данные вы будете загружать вместе, и фактор блокировки хранилища (вы можете загрузить кучу данных в блоке размером 64 КБ с одним чтением). Если вы включаете идентификатор и дату-время в качестве первичного ключа, но не используете их в своих критериях выбора, они не будут ничего, кроме как помешать вашей работе. Вот почему люди обычно бросают индексы на объемные вставки перед загрузкой данных.