センサーデータをSensorValuesテーブルに格納しています。テーブルと主キーは次のとおりです。
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
編集:代わりにこれを行うことはできますか?
テーブルはDeviceId、SensorId、Dateでソートされているため、1つのDeviceIdと1つのSensorIdのみを指定してSELECTを実行するため、出力セットはすでにDate DESCでソートされているはずです。だから、次の質問がすべての場合に同じ結果をもたらすのだろうか?
SELECT TOP 1 SensorValue
FROM SensorValues
WHERE SensorId = 53
AND DeviceId = 3819
AND Date < 1339225010
以下の@Catcallによると、ソート順は保存順と同じではありません。つまり、返された値が既にソートされた順序にあるとは想定できません。
編集:私はこのCROSS APPLYソリューションを試してみましたが、運はありません
@Martin Smithは、パーティションに対して結果を適用することを提案しました。この類似の問題について説明しているブログ投稿(パーティション化されたテーブルの非クラスター化インデックス)を見つけ、スミスが提案したものとやや似たソリューションを試しました。ただし、ここで運はありません。実行時間は元のソリューションと同等です。
WITH Boundaries(boundary_id)
AS
(
SELECT boundary_id
FROM sys.partition_functions pf
JOIN sys.partition_range_values prf ON pf.function_id = prf.function_id
WHERE pf.name = 'PF'
AND prf.value <= 1339225010
UNION ALL
SELECT max(boundary_id) + 1
FROM sys.partition_functions pf
JOIN sys.partition_range_values prf ON pf.function_id = prf.function_id
WHERE pf.name = 'PF'
AND prf.value <= 1339225010
),
Top1(SensorValue)
AS
(
SELECT TOP 1 d.SensorValue
FROM Boundaries b
CROSS APPLY
(
SELECT TOP 1 SensorValue
FROM SensorValues
WHERE SensorId = 53
AND DeviceId = 3819
AND "Date" < 1339225010
AND $Partition.PF(Date) = b.boundary_id
ORDER BY Date DESC
) d
ORDER BY d.Date DESC
)
SELECT SensorValue
FROM Top1