ฉันกำลังเปรียบเทียบแบบสอบถามที่สองใน SQL Server 2012 เป้าหมายคือการใช้ข้อมูลที่เกี่ยวข้องทั้งหมดที่มีอยู่จากเครื่องมือเพิ่มประสิทธิภาพแบบสอบถามเมื่อเลือกแบบสอบถามที่ดีที่สุด ข้อความค้นหาทั้งสองรายการให้ผลลัพธ์ที่เหมือนกัน ลำดับสูงสุดสำหรับลูกค้าทั้งหมด
การล้างบัฟเฟอร์พูลเสร็จก่อนดำเนินการค้นหาด้วย FREEPROCCACHE และ DROPCLEANBUFFERS
ใช้ข้อมูลที่ให้ไว้ด้านล่างแบบสอบถามใดเป็นตัวเลือกที่ดีกว่า
-- Query 1 - return the maximum order id for a customer
SELECT orderid, custid
FROM Sales.Orders AS O1
WHERE orderid = (SELECT MAX(O2.orderid)
FROM Sales.Orders AS O2
WHERE O2.custid = O1.custid);
-- Query 2 - return the maximum order id for a customer
SELECT MAX(orderid), custid
FROM Sales.Orders AS O1
group by custid
order by custid
เวลาสถิติ
แบบสอบถาม 1 เวลาสถิติ: เวลา CPU = 0ms, เวลาที่ผ่านไป = 24 ms
แบบสอบถาม 2 เวลาสถิติ: เวลา CPU = 0 ms, เวลาที่ผ่านไป = 23 ms
ข้อมูลสถิติ IO
แบบสอบถาม 1 สถิติ IO: ตาราง 'คำสั่งซื้อ' จำนวนการสแกน 1, การอ่านเชิงตรรกะ 5, การอ่านทางกายภาพ 2, การอ่านล่วงหน้าอ่าน 0, lob ตรรกะอ่าน 0, lob การอ่านทางกายภาพ 0, lob การอ่านล่วงหน้าอ่าน 0
แบบสอบถาม 2 สถิติ IO: ตาราง 'คำสั่งซื้อ' จำนวนการสแกน 1, การอ่านเชิงตรรกะ 4, การอ่านทางกายภาพ 1, การอ่านล่วงหน้าอ่าน 8, lob ตรรกะอ่าน 0, lob การอ่านทางกายภาพ 0, lob การอ่านล่วงหน้าอ่าน 0
แผนการดำเนินการ
เลือกคุณสมบัติ Query 1
คุณสมบัติ SELECT แบบสอบถาม 2
สรุป:
แบบสอบถาม 1
- ชุดค่าใช้จ่าย 48%
- ตรรกะอ่าน 5
- การอ่านทางกายภาพ 2
- อ่านล่วงหน้า: 0
- เวลา CPU: 0ms
- เวลาที่ผ่านไป 24ms
- ราคาทรีย่อยโดยประมาณ: 0.0050276
- CompileCPU: 2
- CompileMemory: 384
- CompileTime: 2
แบบสอบถาม 2
- ชุดค่าใช้จ่าย 52%
- ตรรกะอ่าน 4
- การอ่านทางกายภาพ 1
- อ่านล่วงหน้า: 8
- CPU Time 0
- เวลาที่ผ่านไป 23ms
- ทรีย่อยโดยประมาณ: 0.0054782
- CompileCPU: 0
- CompileMemory: 192
- CompileTime: 0
โดยส่วนตัวแม้ว่า Query 2 จะมีต้นทุนแบตช์ที่สูงกว่าตามแผนกราฟิก แต่ฉันคิดว่ามันมีประสิทธิภาพมากกว่าที่ Query 1 เนื่องจากแบบสอบถาม 2 ต้องการการอ่านเชิงตรรกะน้อยกว่ามีเวลาที่ลดลงเล็กน้อย compilecpu, compilememory และ compiletime ลดลง การอ่านล่วงหน้าคือ 8 สำหรับแบบสอบถาม 2 และ 0 สำหรับแบบสอบถาม 1
อัปเดต 12:03
นิยามดัชนีแบบคลัสเตอร์
ALTER TABLE [Sales].[Orders] ADD CONSTRAINT [PK_Orders] PRIMARY KEY CLUSTERED
(
[orderid] ASC
)WITH (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 [PRIMARY]
GO
ดัชนีที่ไม่เป็นคลัสเตอร์ idx_nc_custid
CREATE NONCLUSTERED INDEX [idx_nc_custid] ON [Sales].[Orders]
(
[custid] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO