Рекомендация по индексу SQL Db
Я пытаюсь понять, может ли использование пользовательского индекса для определенного типа данных уменьшить фрагментацию в моей базе данных.
[Редактировать: мы используем MS SQL Server 2008 R2]
У меня есть база данных SQL, содержащая данные измерений с метками времени. Много данных вставляется постоянно, но после вставки их практически никогда не требуется обновлять. Эти временные метки, однако, не являются уникальными, поскольку несколько устройств (около 50 из них) измеряют данные одновременно.
Это означает, что каждые 50 строк в таблице содержат одинаковые значения меток времени. Эти данные принимаются более или менее одновременно, хотя я мог бы позаботиться о том, чтобы строки записывались как можно более последовательно (если это помогло бы), возможно, сохраняя их в памяти в течение некоторого времени, а затем записывая только при получении данных. со всех устройств за одну отметку времени.
Мы используем NHibernate с Guid.Comb, чтобы избежать поиска по индексу с обычными идентификаторами bigint. В отличие от простых GUID, это должно уменьшить фрагментацию, но для очень многих вставок фрагментация, тем не менее, происходит очень скоро.
Поскольку мои данные имеют временную метку, а данные вставляются почти последовательно (увеличение временных меток), мне интересно, есть ли более умный способ создания первичного ключа с уникальным кластеризованным индексом для этой таблицы. Столбец метки времени в основном представляет собой число bigint (тики.NET DateTime).
Я также заметил, что некластеризованный индекс в том же столбце отметки времени также довольно фрагментирован. Так какую стратегию индекса вы бы порекомендовали для уменьшения фрагментации кучи в этом случае?
2 ответа
Отдельный столбец для ключа не имеет большого смысла для этой таблицы, так как вы не будете обновлять какие-либо данные. Я думаю, что вы будете делать много запросов, хотя, вероятно, на основе этого столбца отметки времени.
Вы можете попробовать сделать первичный ключ комбинацией столбца метки времени и столбца идентификатора устройства. Вы можете попробовать сделать это кластеризованным. Это должно позволить вам писать как можно быстрее. Однако, если вы выполняете запрос по устройству, вам может понадобиться другой индекс по идентификатору устройства и отметке времени (обратный). Я бы не стал делать обратное кластерному, поскольку это приведет к тому, что записи будут происходить по всей таблице, а не на конечных страницах. И если в большинстве запросов используется диапазон дат и более одного устройства, кластеризация по метке времени в первую очередь должна обеспечить максимальную производительность.