这是主键中指定的排序顺序的一个衍生问题,但排序是在SELECT上执行的。
@Catcall说这关于存储顺序(聚集索引)和输出顺序
许多人认为聚集索引可以保证输出的排序顺序。但这不是它的作用。它保证了磁盘上的存储顺序。 例如,请参阅此博客文章。
我已经阅读了Hugo Kornelis的博客文章,并且了解到索引并不能保证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
,那您就知道可以依靠它了。参见此处的#3