Это побочный вопрос из порядка сортировки, указанного в первичном ключе, но сортировка выполняется в SELECT .
@Catcall говорит это на предмет порядка хранения (кластеризованный индекс) и порядка вывода
Многие люди считают, что кластерный индекс гарантирует порядок сортировки на выходе. Но это не то, что он делает; это гарантирует порядок хранения на диске. Смотрите, например, этот пост в блоге .
Я прочитал сообщение в блоге Хьюго Корнелиса и понял, что индекс не гарантирует, что сервер sql читает записи в определенном порядке. И все же мне трудно принять, что я не могу принять это за свой сценарий?
CREATE TABLE [dbo].[SensorValues](
[DeviceId] [int] NOT NULL,
[SensorId] [int] NOT NULL,
[SensorValue] [int] NOT NULL,
[Date] [int] NOT NULL,
CONSTRAINT [PK_SensorValues] PRIMARY KEY CLUSTERED
(
[DeviceId] ASC,
[SensorId] ASC,
[Date] DESC
) WITH (
FILLFACTOR=75,
DATA_COMPRESSION = PAGE,
PAD_INDEX = OFF,
STATISTICS_NORECOMPUTE = OFF,
SORT_IN_TEMPDB = OFF,
IGNORE_DUP_KEY = OFF,
ONLINE = OFF,
ALLOW_ROW_LOCKS = ON,
ALLOW_PAGE_LOCKS = ON)
ON [MyPartitioningScheme]([Date])
Мой оригинальный запрос был такой:
SELECT TOP 1 SensorValue
FROM SensorValues
WHERE SensorId = 53
AND DeviceId = 3819
AND Date < 1339225010
ORDER BY Date DESC
Но я полагаю, что я мог бы также использовать этот (читай ниже для моего объяснения):
SELECT TOP 1 SensorValue
FROM SensorValues
WHERE SensorId = 53
AND DeviceId = 3819
AND Date < 1339225010
Как видите, строки моей таблицы маленькие (16 байт), и у меня есть только один индекс - кластеризованный. В моем сценарии на данный момент таблица состоит из 100 000 000 записей (и это, скорее всего, увеличится в десять раз).
Когда сервер базы данных запрашивает эту таблицу, у него есть два способа найти мои строки, либо он ищет первичный ключ и, таким образом, читает и возвращает мои значения в desc. порядок даты, или он должен сделать полное сканирование таблицы. Мой вывод заключается в том, что полное сканирование таблицы по всем этим записям будет слишком медленным, и поэтому сервер базы данных всегда будет искать таблицу по первичному ключу и, таким образом, возвращать значения, отсортированные поDate DESC
ORDER BY
предложение сильно ударило по производительности ( для получения дополнительной информации прочитайте другой вопрос ). У меня есть решение, которое работает на данный момент, но оно не будет работать, когда и если мой трафик увеличится.
ORDER BY
условие в запросе. Это верно для SQL Server , Oracle , MySQL и любых других СУБД, о которых вы только можете подумать. Попробуйте что-нибудь еще, и вы готовитесь к неожиданной чашке неудач.
ORDER BY
туда, тогда вы знаете, что можете положиться на это. Смотрите № 3 здесь