নিম্নলিখিত সাধারণ ফর্মের দেওয়া সারণী:
CREATE TABLE Device
(
ID integer PRIMARY KEY
);
CREATE TABLE EventType
(
ID integer PRIMARY KEY,
Name nvarchar(50) NOT NULL
);
CREATE TABLE [Event]
(
ID integer PRIMARY KEY,
[TimeStamp] datetime NOT NULL,
EventTypeID integer NOT NULL REFERENCES EventType,
DeviceID integer NOT NULL REFERENCES Device
);
নিম্নলিখিত সূচক দরকারী:
CREATE INDEX f1
ON [Event] ([TimeStamp], EventTypeID)
INCLUDE (DeviceID)
WHERE EventTypeID IN (2, 5, 7, 8, 9, 14);
প্রশ্নের জন্য:
SELECT
[Event].ID,
[Event].[TimeStamp],
EventType.Name,
Device.ID
FROM
[Event]
INNER JOIN EventType ON EventType.ID = [Event].EventTypeID
INNER JOIN Device ON Device.ID = [Event].DeviceID
WHERE
[Event].[TimeStamp] BETWEEN '2011-01-28' AND '2011-01-29'
AND Event.EventTypeID IN (2, 5, 7, 8, 9, 14);
ফিল্টারটি AND
ধারাটির প্রয়োজনীয়তা পূরণ করে , সূচকের প্রথম কীটি [TimeStamp]
ফিল্টারগুলির জন্য সন্ধান করার অনুমতি দেয় EventTypeIDs
এবং DeviceID
কলামটি সহ সূচিটি আচ্ছাদন করে তোলে (কারণ টেবিলে DeviceID
যোগদানের জন্য প্রয়োজনীয় Device
)।
সূচকের দ্বিতীয় কী - EventTypeID
কঠোরভাবে প্রয়োজন হয় না (এটি একটি INCLUDEd
কলামও হতে পারে ); আমি এটা অন্তর্ভুক্ত করেছেন কী তে জন্য এখানে বিবৃত কারণে । সাধারণভাবে, আমি INCLUDE
একটি ফিল্টার সূচক WHERE
ধারা থেকে কমপক্ষে কলামগুলিতে লোকদের পরামর্শ দিই ।
প্রশ্নের আপডেট হওয়া ক্যোয়ারী এবং কার্যনির্বাহী পরিকল্পনার ভিত্তিতে আমি সম্মত হই যে এসএসএমএস দ্বারা প্রস্তাবিত আরও সাধারণ সূচক সম্ভবত এখানে আরও ভাল পছন্দ, যদি না EventTypeIDs
অ্যারন তার উত্তরে উল্লেখ না করে তবে ফিল্টারগুলির তালিকা স্থির না হয়:
CREATE TABLE Device
(
ID integer PRIMARY KEY,
Name nvarchar(50) NOT NULL UNIQUE
);
CREATE TABLE EventType
(
ID integer PRIMARY KEY,
Name nvarchar(20) NOT NULL UNIQUE,
[Description] nvarchar(100) NOT NULL
);
CREATE TABLE [Event]
(
ID integer PRIMARY KEY,
PLCTimeStamp datetime NOT NULL,
EventTypeID integer NOT NULL REFERENCES EventType,
DeviceID integer NOT NULL REFERENCES Device,
IATA varchar(50) NOT NULL,
Data1 integer NULL,
Data2 integer NULL,
);
প্রস্তাবিত সূচক (উপযুক্ত হলে এটি অনন্য ঘোষণা করুন):
CREATE UNIQUE INDEX uq1
ON [Event]
(EventTypeID, PLCTimeStamp)
INCLUDE
(DeviceID, IATA, Data1, Data2, ID);
সম্পাদন পরিকল্পনা থেকে কার্ডিনালিটির তথ্য (অপ্রকাশিত সিনট্যাক্স, উত্পাদন সিস্টেমে ব্যবহার করবেন না):
UPDATE STATISTICS dbo.Event WITH ROWCOUNT = 4042700, PAGECOUNT = 400000;
UPDATE STATISTICS dbo.EventType WITH ROWCOUNT = 22, PAGECOUNT = 1;
UPDATE STATISTICS dbo.Device WITH ROWCOUNT = 2806, PAGECOUNT = 28;
আপডেট করা ক্যোয়ারী ( টেবিলের IN
জন্য তালিকার পুনরাবৃত্তি EventType
এই নির্দিষ্ট ক্ষেত্রেটি অপ্টিমাইজারকে সহায়তা করে):
SELECT
Event.ID,
Event.IATA,
Device.Name,
EventType.Description,
Event.Data1,
Event.Data2,
Event.PLCTimeStamp,
Event.EventTypeID
FROM
Event
INNER JOIN EventType ON EventType.ID = Event.EventTypeID
INNER JOIN Device ON Device.ID = Event.DeviceID
WHERE
Event.EventTypeID IN (3, 30, 40, 41, 42, 46, 49, 50)
AND EventType.ID IN (3, 30, 40, 41, 42, 46, 49, 50)
AND Event.PLCTimeStamp BETWEEN '2011-01-28' AND '2011-01-29'
AND Event.IATA LIKE '%0005836217%'
ORDER BY Event.ID;
আনুমানিক বাস্তবায়ন পরিকল্পনা:
আপনি যে পরিকল্পনাটি পাবেন তা সম্ভবত ভিন্ন হবে কারণ আমি অনুমান করা পরিসংখ্যান ব্যবহার করছি। সাধারণ বিষয়টি হ'ল অপটিমাইজারটিকে যতটা সম্ভব তথ্য দেওয়া এবং 4-মিলিয়ন সারি [Event]
টেবিলটিতে একটি দক্ষ অ্যাক্সেস পদ্ধতি (সূচক) সরবরাহ করা ।