Tôi đang lưu trữ dữ liệu cảm biến trong bảng SensorValues . Bảng và khóa chính như sau:
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])
Tuy nhiên, khi tôi chọn giá trị cảm biến hợp lệ trong một thời gian cụ thể, kế hoạch thực hiện cho tôi biết nó đang thực hiện sắp xếp. Tại sao vậy?
Tôi đã nghĩ rằng vì tôi lưu trữ các giá trị được sắp xếp theo cột Ngày, nên việc sắp xếp sẽ không xảy ra. Hoặc là do chỉ mục không được sắp xếp duy nhất theo cột Ngày, nghĩa là nó không thể cho rằng tập kết quả được sắp xếp?
SELECT TOP 1 SensorValue
FROM SensorValues
WHERE SensorId = 53
AND DeviceId = 3819
AND Date < 1339225010
ORDER BY Date DESC
Chỉnh sửa: Tôi có thể làm điều này thay thế?
Vì bảng được sắp xếp DeviceId, SensorId, Date và tôi thực hiện CHỌN chỉ định một DeviceId và một SensorId , nên bộ đầu ra phải được sắp xếp theo Ngày DESC . Vì vậy, tôi tự hỏi nếu câu hỏi sau đây sẽ mang lại kết quả tương tự trong tất cả các trường hợp?
SELECT TOP 1 SensorValue
FROM SensorValues
WHERE SensorId = 53
AND DeviceId = 3819
AND Date < 1339225010
Theo @Catcall dưới đây, thứ tự sắp xếp không giống với thứ tự lưu trữ. Tức là chúng ta không thể cho rằng các giá trị được trả về đã được sắp xếp theo thứ tự.
Chỉnh sửa: Tôi đã thử giải pháp CROSS ỨNG DỤNG này, không có may mắn
@Martin Smith đề nghị tôi nên thử RA KHI ỨNG DỤNG kết quả của tôi đối với các phân vùng. Tôi tìm thấy một bài đăng trên blog ( Các chỉ mục không được phân cụm trên bảng được phân vùng ) mô tả vấn đề tương tự này và đã thử giải pháp hơi giống với những gì Smith đề xuất. Tuy nhiên, không có may mắn ở đây, thời gian thực hiện ngang bằng với giải pháp ban đầu của tôi.
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