আমি সেন্সরভ্যালুগুলিতে একটি সারণীতে সেন্সর ডেটা সঞ্চয় করছি । টেবিল এবং প্রাথমিক কী নীচে রয়েছে:
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, তারিখ এবং আমি একটি কি নির্বাচন শুধুমাত্র একটি নির্দিষ্ট DeviceId এবং এক SensorId , আউটপুট সেট ইতিমধ্যে অনুসারে সাজানো হবে তারিখের নিম্নক্রমে । সুতরাং আমি ভাবছি যদি নিম্নলিখিত প্রশ্নটি সব ক্ষেত্রে একই ফলাফল দেয়?
SELECT TOP 1 SensorValue
FROM SensorValues
WHERE SensorId = 53
AND DeviceId = 3819
AND Date < 1339225010
নীচের @ ক্যাটক্যাল অনুসারে বাছাই অর্ডার স্টোরেজ অর্ডারের মতো নয়। অর্থাৎ আমরা ধরে নিতে পারি না যে প্রত্যাবর্তিত মানগুলি ইতিমধ্যে একটি সাজানো ক্রমে রয়েছে।
সম্পাদনা: আমি এই ক্রস প্রয়োগের সমাধানটি চেষ্টা করেছি, কোনও ভাগ্য নেই
@ মার্টিন স্মিথ পরামর্শ দিয়েছিলেন যে আমি পার্টিশনের বিরুদ্ধে আমার ফলাফলটি প্রয়োগ করার চেষ্টা করব। আমি এই জাতীয় সমস্যাটি বর্ণনা করে একটি ব্লগ পোস্ট ( পার্টিশনযুক্ত টেবিলের সাথে নন-ক্লাস্টারযুক্ত সূচিযুক্ত ) খুঁজে পেয়েছি এবং স্মিথের পরামর্শ অনুসারে কিছুটা অনুরূপ সমাধানের চেষ্টা করেছি। তবে, এখানে ভাগ্য নেই, মৃত্যুদন্ড কার্যকর করার সময়টি আমার আসল সমাধানের সাথে সমান।
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