เสียงเหมือนสถานการณ์ในอุดมคติสำหรับมุมมองที่จัดทำดัชนีซึ่งช่วยให้คุณจ่ายสำหรับการคำนวณและการรวมในเวลาเขียนแทนที่จะเป็นเวลาสอบถาม
CREATE VIEW dbo.MyIndexedView
WITH SCHEMABINDING
AS
SELECT Enroll_Date, UserID, RawCount = COUNT_BIG(*)
FROM dbo.UserTable
GROUP BY Enroll_Date, UserID;
GO
CREATE UNIQUE CLUSTERED INDEX CIX_miv ON dbo.MyIndexedView(Enroll_Date, UserID);
ซึ่งจะใช้เวลาสักครู่ในการสร้างและแน่นอนว่าจะต้องมีการบำรุงรักษาตลอดการดำเนินการ DML ทั้งหมดเช่นเดียวกับดัชนีในตารางฐาน
ตอนนี้คิวรีที่เทียบกับมุมมองนี้จะค่อนข้างคล้ายกัน - แต่ละแถวในมุมมองตอนนี้แสดงคอมโบของผู้ใช้ / วันที่ที่แตกต่างกันดังนั้นตัวเลขสามารถคำนวณได้ด้วย COUNT (*) เดียวในขณะที่จำนวนแถวทั้งหมดในตารางฐานคือ รวมแล้วบางส่วนสำหรับคุณตอนนี้คุณเพียงแค่ต้องเพิ่มพวกเขาโดยใช้ SUM ต่อวัน:
SELECT Enroll_Date,
[Record #] = SUM(RawCount),
[User #] = COUNT(*)
FROM dbo.MyIndexedView WITH (NOEXPAND)
GROUP BY Enroll_Date;
เพิ่ม NOEXPAND คำใบ้หลังจากจดจำนี้และนี้
ฉันสามารถบอกคุณได้อย่างไม่ต้องสงสัยเลยว่าการค้นหานี้จะเร็วกว่าการสืบค้นปัจจุบันของคุณ (แต่ไม่มากเท่าไร) ยกเว้นในกรณีที่ไม่ค่อยเกิดขึ้นซึ่งคุณมีผู้ใช้หนึ่งคนในแต่ละวัน (ในกรณีนี้ข้อมูลจำนวนเดียวกันจะมี อ่านได้) และคอลัมน์ที่เรารู้จักเป็นคอลัมน์เดียวในดัชนีของตารางฐาน ไม่ว่าการเพิ่มประสิทธิภาพในเวลาอ่านจะคุ้มค่ากับงานพิเศษที่จะส่งผลต่อส่วนการเขียนของภาระงานของคุณหรือไม่เป็นสิ่งที่เราไม่สามารถบอกคุณได้คุณจะต้องทดสอบเพื่อวัดการแลกเปลี่ยน (ไม่มีดัชนีฟรี)
และถ้าคุณใช้คำสั่ง WHERE ทั่วไปร่วมกันที่เหมือนกันกับ Enroll_Date สำหรับช่วงที่กำหนดไว้ชัดเจน (เช่นไตรมาสปัจจุบันหรือปีปัจจุบัน) คุณสามารถเพิ่มดัชนีที่กรองที่ตรงกันซึ่งลด I / O ให้มากขึ้น (แต่มีเสมอ การออก)
คุณอาจพิจารณาวางดัชนีคลัสเตอร์บนตารางฐาน นี่ไม่ใช่กรณีการใช้งานที่หายากซึ่งได้รับประโยชน์จากฮีป