ฉันจัดเก็บข้อมูลเซ็นเซอร์ในตาราง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 วันและฉันทำSELECTระบุเพียงหนึ่งDeviceIDและเป็นหนึ่งในSensorIdชุดที่ส่งออกควรจะเรียงแล้วโดยวันที่ DESC ดังนั้นฉันสงสัยว่าคำถามต่อไปนี้จะให้ผลลัพธ์เดียวกันในทุกกรณีหรือไม่
SELECT TOP 1 SensorValue
FROM SensorValues
WHERE SensorId = 53
AND DeviceId = 3819
AND Date < 1339225010
ตาม @Catcall ด้านล่างลำดับการจัดเรียงนั้นไม่เหมือนกับใบสั่งจัดเก็บ นั่นคือเราไม่สามารถสรุปได้ว่าค่าที่ส่งคืนนั้นเรียงตามลำดับแล้ว
แก้ไข: ฉันได้ลองใช้โซลูชัน CROSS นี้แล้วไม่มีโชค
@ มาร์ตินสมิ ธ แนะนำให้ฉันลองนำผลของฉันไปเปรียบเทียบกับพาร์ติชั่น ฉันพบโพสต์บล็อก ( จัดทำดัชนีที่ไม่ใช่คลัสเตอร์ในตารางที่แบ่งพาร์ติชัน ) อธิบายปัญหาที่คล้ายกันนี้และลองวิธีแก้ปัญหาที่คล้ายกันบ้างกับสิ่งที่ 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