Кластеризировать индекс на постоянно увеличивающемся столбце даты и времени на регистрирующейся таблице?

Я не DBA ("Хороший!", Вы будете думать через мгновение.)

У меня есть таблица регистрации данных с этими характеристиками и шаблонами использования:

  • A datetime столбец для хранения журнала устанавливает метку времени, чье значение является постоянно увеличивающимся и главным образом (но только главным образом) уникальный
  • Частый выход вставляет (скажите, дюжина в минуту), только в конце диапазона метки времени (новые регистрируемые данные)
  • Нечастый удаляет, оптом, с начала диапазона метки времени (старые очищаемые данные)
  • Никакие обновления вообще
  • Частый выход выбирает использование столбца метки времени как основной критерий, наряду со вторичными критериями на других столбцах
  • Нечастые выборы с помощью других столбцов в качестве критериев (и не включая столбец метки времени)
  • Хороший объем данных, но нигде около достаточно, что я волнуюсь очень о пространстве памяти

Кроме того, в настоящее время существует ежедневное окно обслуживания, во время которого я мог сделать оптимизацию таблицы.

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

Я знаю, что кластерные индексы определяют устройство хранения данных фактических данных таблицы (данные хранятся в вершинах самого индекса), и что некластерные индексы, разделяют указатели на данные. Таким образом в терминах запроса, кластерный индекс будет быстрее, чем некластерный индекс - после того как мы нашли индексное значение, данные тут же. Существуют затраты на вставке и удаляют (и конечно обновление, изменяющее значение столбца кластерного индекса, было бы особенно дорогостоящим).

Но я читал в этом ответе, который удаляет разрывы отпуска, которые не становятся очищенными, пока/если индекс не восстановлен.

Все это предлагает мне, чтобы я был должен:

  • Поместите кластерный индекс на столбец метки времени с 100%-м коэффициентом заполнения
  • Поместите некластерные индексы на любой другой столбец, который может использоваться в качестве критерия в запросе, который также не включает сгруппированный столбец (который может быть любым из них в моем случае),
  • Расписание объем удаляет для появления в течение ежедневного интервала обслуживания
  • Расписание a восстанавливает кластерного индекса для появления сразу после того, как объем удалит
  • Ослабьтесь и выйдите больше

Я дико от основы там? Я должен часто восстанавливать индекс как этот для предотвращения большого количества потраченного впустую пространства? Есть ли другие очевидные (к DBA) вещи, которые я должен делать?

Заранее спасибо.

15
задан Community 23 May 2017 в 12:26
поделиться

4 ответа

Я согласен поставить кластерный индекс в столбец времени. Мой запрос будет на fillfactor - 100% дает лучшую производительность чтения за счет производительности записи. Вы можете пострадать от разбиения страниц. Выбор более низкого коэффициента заполнения задержит дробление страницы в ущерб производительности чтения, так что это прекрасный баланс, чтобы получить лучшее в вашей ситуации.

После того, как bulk удалит свою ценность, перестройте индексы и обновите статистику. Это не только увеличивает производительность, но и сбрасывает индексы в указанный коэффициент заполнения.

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

.
3
ответ дан 1 December 2019 в 04:47
поделиться

Очевидный ответ - это зависит от того, как вы его будете запрашивать. Цель индекса - уменьшить количество сравнений при выборе данных. Кластерный индекс помогает, если вы считаете, какие данные вы будете загружать вместе, и коэффициент блокировки хранилища (вы можете загрузить группу данных в блоке размером 64 КБ за одно чтение). Если вы включите идентификатор и дату и время в качестве первичного ключа, но не используете их в критериях выбора, они ничего не сделают, кроме как снизят вашу производительность. Вот почему люди обычно сбрасывают индексы при массовой вставке перед загрузкой данных.

0
ответ дан 1 December 2019 в 04:47
поделиться
echo str_replace('//', '/', $str);
-121--4106629-

Вы можете попытаться использовать ctypes для непосредственного взаимодействия с libdisasm вместо прохождения уровня SWIG. Это может занять больше времени, но AFAIK вы должны иметь возможность получить доступ к базовой функциональности с помощью ctypes.

-121--3995713-

Существует два "оптимальных" способа индексации таблицы регистрации трафика:

  1. столбец целочисленного идентификатора в качестве первичного кластерного ключа
  2. столбец уникального идентификатора в качестве первичного ключа с DEFAULT NEWSEQUENTIALID ()

Оба метода позволяют SQL Server эффективно наращивать таблицу, поскольку

Я бы не ставил никаких других индексов в таблицу или не планировал перестроения индекса, если нет конкретной проблемы с производительностью.

3
ответ дан 1 December 2019 в 04:47
поделиться

Вопреки тому, что думают многие люди, наличие хорошего кластерного индекса для таблицы может фактически ускорить такие операции, как INSERT, - да, быстрее!

Прочтите основополагающее сообщение в блоге Дебаты по кластеризованному индексу продолжаются .... Кимберли Трипп - величайшей королевы индексирования.

Она упоминает (примерно в середине статьи):

Вставки выполняются быстрее в кластерной таблице (но только в "правой" кластерной таблице), чем в куча. Основная проблема здесь заключается в том, что поиск в IAM / PFS для определения места вставки в куче медленнее, чем в кластерной таблице (где insert местоположение известно, определяется кластеризованным ключом). Вставки выполняются быстрее при вставке в таблицу , где определен порядок (CL) и где этот порядок постоянно увеличивается.

Ключевой момент: только с правильным кластеризованным индексом вы сможете воспользоваться преимуществами - когда кластерный индекс уникален, узок, стабилен и оптимально постоянно растет. Лучше всего использовать столбец INT IDENTITY.

У Кимберли Трипп также есть отличная статья о том, как выбрать наилучший ключ кластеризации для ваших таблиц и каким критериям он должен соответствовать - см. Ее сообщение под названием Постоянно растущий ключ кластеризации - дебаты по кластеризованному индексу ... .......очередной раз!

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

6
ответ дан 1 December 2019 в 04:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: