Оптимизация для постоянно растущего ключа в SQL - PullRequest
0 голосов
/ 26 июня 2019

Сама проблема довольно проста:

  • У меня есть большое количество пар меток времени и значений
  • Временные метки с некоторыми исключениями (<1%) постоянно увеличиваются и являются уникальными </li>
  • Я использую метку времени как кластерный индекс

Как я могу обеспечить, чтобы система БД пыталась вставить значение до конца, и если это не удается (не идет вправо (большая сторона) в B-дереве, которое может быть проверено по времени) только тогда, то выполните бинарный поиск для правильного размещения?

Целевая система: MSSQL 2016 или 2017

1 Ответ

3 голосов
/ 26 июня 2019

Либо вы хотите, чтобы timestampt был кластеризованным индексом, либо нет. Кластерный индекс «на полпути» отсутствует.

Итак, если вы хотите, чтобы он был кластеризован, оставьте дополнительное место на каждой странице на случай, если позднее будет добавлено новое значение. Вы можете контролировать это с помощью fill_factor (задокументировано здесь ). Это позволяет кластерному индексу (более) эффективно вставлять значения, которые не находятся в конце.

Если вам не нужен кластеризованный индекс для timestampt, используйте столбец identity для идентификации каждой строки. Это гарантирует, что строки вставляются только в «конец» (то есть на последнюю страницу) таблицы, что делает вставки более эффективными. Для эффективного доступа у вас все еще может быть обычный индекс на timestampt.

На самом деле, я предпочитаю второй метод. Я был бы обеспокоен дубликатами в timestampt, и я предпочел бы иметь кластеризованный индекс, который уникально идентифицирует каждую строку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...