これは、主キーで指定されたソート順から派生した質問ですが、ソートは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バイト)、クラスター化されたインデックスは1つしかありません。私のシナリオでは、テーブルは現時点で100.000.000レコードで構成されています(これはおそらく10倍に増加します)。
データベースサーバーがこのテーブルにクエリを実行するとき、行を見つける方法は2つあります。主キーを探し、それによって値を読み取り、descに返します。日付順、またはテーブル全体をスキャンする必要があります。私の結論は、これらすべてのレコードに対する全テーブルスキャンは非常に遅くなり、データベースサーバーは常に主キーを介してテーブルをシークし、それによってソートされた値を返すということです。Date DESC
ORDER BY
クエリでWHERE句。これは、SQL Server、Oracle、MySQL、およびその他の考えられるすべてのRDBMSに当てはまります。他のことを試してみてください。あなたは突然のFAILに備えています。
ORDER BY
そこに、あなたが知っている、あなたがそれに頼ることができます。ここ#3を参照してください