Кластеризованный индекс, порядок на одном сингле, без предложения order by

#sql #sql-server #indexing #relational-database

#sql #sql-сервер #индексирование #реляционная база данных

Вопрос:

У меня есть таблица транзакций (единый первичный ключ) с миллионами записей, и каждый день добавляются 100 записей.

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

Хотя я создал кластеризованный индекс в столбце ID, но не уверен, должен ли он быть ASC или DESC. Поскольку большая часть обработки выполняется для вновь вставленных записей, я думал заказать индекс как DESC, но не уверен.

Я уже проверил несколько блогов и вопросы по StackOverflow об этом, но все они обсуждают составной кластеризованный индекс с предложением order by . В моем случае существует кластеризованный индекс с одним столбцом и нет требований к порядку by.

Комментарии:

1. Это не имеет значения, SQL Server может просматривать индекс с первой или последней страницы с одинаковой эффективностью.

2. Спасибо @RogerWolf за комментарий. Не могли бы вы поделиться какой-нибудь ссылкой или более подробной информацией об этом.

3. Я не думаю, что вы подберете эти «недавно добавленные» записи с помощью запроса типа select top (1000) * from dbo.Transactions order by Id desc . Если вы это сделаете, вы можете забыть о параллельной обработке и любой эффективности в целом. Вместо этого вы посмотрите на некоторое поле, которое показывает, на каком этапе рабочего процесса транзакция находится в данный момент. И вам понадобится индекс в этом поле, поверьте мне. В этом случае порядок вашего кластеризованного индекса не имеет значения.

4. Я думаю, вы правы. Спасибо, что поделились своими мыслями.

Ответ №1:

Это зависит… Для некоторых операций, таких как ORDER BY, это не имеет значения, поскольку индекс является двунаправленным, поэтому сортировка не требуется.

Но для других операций, таких как ранжирование, сканирование индекса и т. Д., Это имеет значение. Механизм SQL предназначен для выполнения прямого сканирования индекса с параллелизмом, но если оптимизатору запросов требуется обратное сканирование индекса, такая операция является однопоточной. Таким образом, это может повлиять на производительность, если вы выберете неправильный порядок сортировки.

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

Также это может привести к фрагментации индекса, если данные добавляются не в том порядке, в котором порядок сортировки индекса.