เรามีคลังข้อมูลที่มีจำนวนเรกคอร์ดที่ค่อนข้างใหญ่ (10-20 ล้านแถว) และมักเรียกใช้คิวรีที่นับเร็กคอร์ดระหว่างวันที่แน่นอนหรือนับจำนวนเรกคอร์ดด้วยค่าสถานะที่แน่นอนเช่น
SELECT
f.IsFoo,
COUNT(*) AS WidgetCount
FROM Widgets AS w
JOIN Flags AS f
ON f.FlagId = w.FlagId
WHERE w.Date >= @startDate
GROUP BY f.IsFoo
ประสิทธิภาพไม่น่ากลัว แต่อาจค่อนข้างเชื่องช้า (อาจใช้เวลา 10 วินาทีในแคชเย็น)
เมื่อเร็ว ๆ นี้ฉันค้นพบว่าฉันสามารถใช้GROUP BY
ในมุมมองที่จัดทำดัชนีและลองใช้บางสิ่งที่คล้ายกับต่อไปนี้
CREATE VIEW TestView
WITH SCHEMABINDING
AS
SELECT
Date,
FlagId,
COUNT_BIG(*) AS WidgetCount
FROM Widgets
GROUP BY Date, FlagId;
GO
CREATE UNIQUE CLUSTERED INDEX PK_TestView ON TestView
(
Date,
FlagId
);
ด้วยเหตุนี้ประสิทธิภาพของการสืบค้นแรกของฉันอยู่ที่ <100ms และผลลัพธ์ & ดัชนีการดูคือ <100k (แม้ว่าการนับแถวของเราจะมีขนาดใหญ่ช่วงวันที่และ ID การตั้งค่าสถานะหมายความว่ามุมมองนี้มี 1,000-2,000 แถวเท่านั้น)
ฉันคิดว่าบางทีนี่อาจทำให้ประสิทธิภาพการเขียนลงในตาราง Widget ลดลง แต่ไม่ - ประสิทธิภาพของการแทรกและการปรับปรุงในตารางนี้ค่อนข้างไม่ได้รับผลกระทบมากเท่าที่ฉันจะบอกได้ (รวมถึงการเป็นคลังข้อมูลตารางนี้มีการปรับปรุงบ่อยครั้ง อย่างไรก็ตาม)
สำหรับฉันดูเหมือนว่ามันจะดีเกินไปที่จะเป็นจริง - ใช่ไหม? ฉันต้องระวังอะไรเมื่อใช้มุมมองที่จัดทำดัชนีด้วยวิธีนี้
SELECT
และCREATE VIEW
สคริปต์ผิดเพราะฉันเชื่อว่าเป็นCREATE INDEX
สคริปต์ของคุณ