मैं सेंसर डेटा को एक तालिका 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 छांटा गया है और मैं केवल एक DeviceId और एक SensorId का चयन करते हुए चयन करता हूं , इसलिए आउटपुट सेट पहले से ही दिनांक DESC द्वारा क्रमबद्ध होना चाहिए । इसलिए मुझे आश्चर्य है कि यदि निम्नलिखित प्रश्न सभी मामलों में समान परिणाम प्राप्त करेंगे?
SELECT TOP 1 SensorValue
FROM SensorValues
WHERE SensorId = 53
AND DeviceId = 3819
AND Date < 1339225010
नीचे @Catcall के अनुसार, सॉर्ट ऑर्डर स्टोरेज ऑर्डर के समान नहीं है। यानी हम यह नहीं मान सकते कि लौटे मान पहले से ही एक क्रमबद्ध क्रम में हैं।
संपादित करें: मैंने इस क्रॉस एपीपीएलवाई समाधान की कोशिश की है, कोई भाग्य नहीं
@ मर्टिन स्मिथ ने सुझाव दिया कि मैं विभाजन के खिलाफ अपने परिणाम को लागू करने की कोशिश करूंगा। मुझे इसी तरह की समस्या का वर्णन करते हुए एक ब्लॉग पोस्ट ( विभाजन तालिका पर गैर-क्लस्टर किए गए अनुक्रमणिकाएं ) मिलीं और स्मिथ ने जो सुझाव दिया, उसके समान समाधान का प्रयास किया। हालांकि, यहां कोई किस्मत नहीं, निष्पादन समय मेरे मूल समाधान के बराबर है।
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