คำถามเกี่ยวกับประสิทธิภาพของ "SELECT TOP"


18

ฉันมีข้อความค้นหาที่ทำงานเร็วขึ้นมากเมื่อเลือกtop 100และช้ากว่าโดยไม่top 100เลือก จำนวนระเบียนที่ส่งคืนคือ 0 คุณสามารถอธิบายความแตกต่างในแผนคิวรีหรือแชร์ลิงก์ที่อธิบายความแตกต่างดังกล่าวได้หรือไม่

แบบสอบถามที่ไม่มีtopข้อความ:

SELECT --TOP 100
*
FROM InventTrans
     JOIN
     InventDim
     ON InventDim.DATAAREAID = 'dat' AND 
        InventDim.INVENTDIMID = InventTrans.INVENTDIMID
WHERE InventTrans.DATAAREAID = 'dat' AND 
      InventTrans.ITEMID = '027743' AND 
      InventDim.INVENTLOCATIONID = 'КзРЦ Алмат' AND 
      InventDim.ECC_BUSINESSUNITID = 'Казахстан';

แผนแบบสอบถามสำหรับข้างต้น (ไม่รวมtop):

https://pastebin.com/cbtJpxFf

ป้อนคำอธิบายรูปภาพที่นี่

สถิติ IO และ TIME (ไม่รวมtop):

SQL Server parse and compile time: 
   CPU time = 0 ms, elapsed time = 0 ms.

 SQL Server Execution Times:
   CPU time = 0 ms,  elapsed time = 0 ms.
SQL Server parse and compile time: 
   CPU time = 0 ms, elapsed time = 0 ms.

(0 row(s) affected)
Table 'INVENTDIM'. Scan count 0, logical reads 988297, physical reads 0, read-ahead reads 1, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'INVENTTRANS'. Scan count 1, logical reads 1234560, physical reads 0, read-ahead reads 14299, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

(1 row(s) affected)

 SQL Server Execution Times:
   CPU time = 6256 ms,  elapsed time = 13348 ms.
SQL Server parse and compile time: 
   CPU time = 0 ms, elapsed time = 0 ms.

 SQL Server Execution Times:
   CPU time = 0 ms,  elapsed time = 0 ms.

ดัชนีที่ใช้ (ไม่รวมtop):

1. INVENTTRANS.I_177TRANSIDIDX
   4 KEYS:
 - DATAAREAID
 - INVENTTRANSID
 - INVENTDIMID
 - RECID
2. INVENTTRANS.I_177ITEMIDX
   3 KEYS:
   - DATAAREAID
   - ITEMID
   - DATEPHYSICAL 
3. INVENTDIM.I_698DIMIDIDX
   2 KEYS:
   - DATAAREAID
   - INVENTDIMID

แบบสอบถามด้วยtop:

SELECT TOP 100
*
FROM InventTrans
     JOIN
     InventDim
     ON InventDim.DATAAREAID = 'dat' AND 
        InventDim.INVENTDIMID = InventTrans.INVENTDIMID
WHERE InventTrans.DATAAREAID = 'dat' AND 
      InventTrans.ITEMID = '027743' AND 
      InventDim.INVENTLOCATIONID = 'КзРЦ Алмат' AND 
      InventDim.ECC_BUSINESSUNITID = 'Казахстан';

แผนแบบสอบถาม (พร้อม TOP):

https://pastebin.com/0dyu6QZd

ป้อนคำอธิบายรูปภาพที่นี่


สถิติการค้นหา IO และ TIME (พร้อม TOP):

SQL Server parse and compile time: 
   CPU time = 0 ms, elapsed time = 0 ms.

 SQL Server Execution Times:
   CPU time = 0 ms,  elapsed time = 0 ms.
SQL Server parse and compile time: 
   CPU time = 0 ms, elapsed time = 0 ms.

(0 row(s) affected)
Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'INVENTTRANS'. Scan count 15385, logical reads 82542, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'INVENTDIM'. Scan count 1, logical reads 62704, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

(1 row(s) affected)

 SQL Server Execution Times:
   CPU time = 265 ms,  elapsed time = 257 ms.
SQL Server parse and compile time: 
   CPU time = 0 ms, elapsed time = 0 ms.

 SQL Server Execution Times:
   CPU time = 0 ms,  elapsed time = 0 ms.

ดัชนีที่ใช้ (มี TOP):

 1. INVENTTRANS.I_177TRANSIDIDX
     4 KEYS:
     - DATAAREAID
     - INVENTTRANSID
     - INVENTDIMID
     - RECID
 2. INVENTTRANS.I_177DIMIDIDX
    3 KEYS:
    - DATAAREAID
    - INVENTDIMID
    - ITEMID
 3. INVENTDIM.I_698DIMIDIDX
    2 KEYS:
    - DATAAREAID
    - INVENTDIMID
 4. INVENTDIM.I_698ECC_BUSUNITLOCIDX
    3 KEYS
    - DATAAREAID
    - ECC_BUSINESSUNITID
    - INVENTLOCATIONID

จะซาบซึ้งในความช่วยเหลือในหัวข้อนี้อย่างลึกซึ้ง!


2
ฉันไม่คิดว่าความเร็วของ 'TOP' หากไม่มี 'ORDER BY' สำคัญ ผลลัพธ์ที่ถูกต้องสำคัญกว่าความเร็ว
Dan Guzman

คำตอบ:


15

SQL Server สร้างแผนการดำเนินการที่แตกต่างกันสำหรับ TOP 100 โดยใช้อัลกอริทึมการเรียงลำดับที่แตกต่างกัน บางครั้งมันก็เร็วขึ้นบางครั้งมันก็ช้าลง

สำหรับตัวอย่างที่ง่ายกว่าของมันอ่านวิธีหนึ่งแถวสามารถเปลี่ยนแผนแบบสอบถามได้มากแค่ไหน? ส่วนที่ 1และส่วนที่ 2

สำหรับรายละเอียดทางเทคนิคในเชิงลึกรวมถึงตัวอย่างที่อัลกอริทึม TOP 100 ช้ากว่าจริงอ่านการเรียงลำดับของ Paul White เป้าหมายของแถวและปัญหา 100 อันดับแรก

บรรทัดล่าง: ในกรณีของคุณถ้าคุณรู้ว่าจะไม่มีการส่งคืนแถวดี ... ไม่เรียกใช้แบบสอบถามใช่มั้ย ข้อความค้นหาที่เร็วที่สุดคือคำถามที่คุณไม่เคยทำ อย่างไรก็ตามหากคุณจำเป็นต้องทำการตรวจสอบการมีอยู่เพียงทำ IF EXISTS (ติดแบบสอบถามที่นี่) แล้ว SQL Server จะทำแผนการดำเนินการที่แตกต่างกัน


ขอบคุณฉันจะอ่านแน่นอน ฉันได้สังเกตด้วยว่าการประมาณแถวไม่ถูกต้องในทั้งสองสถานการณ์ มันอาจจะเชื่อมต่อกับอะไร สถิติถ้าดี - ฉันได้อัพเดตด้วยตัวเลือก fullscan บนดัชนีทั้งคลัสเตอร์
จอร์จ K

นอกจากนี้ - มันเหมาะกับกรณีของฉันเพราะฉันไม่มีออเดอร์ใด ๆ ดังนั้นฉันเชื่อว่าจะไม่มีการเรียงลำดับใด ๆ อยู่ในแผนของฉัน
George K

มันจะน่าสนใจมากถ้าดูว่าแผนปฏิบัติการเหมือนกันสำหรับทั้ง TOP 100 และ TOP 101 ถ้าเป็นไปได้โปรดแชร์ ขอบคุณ
Artashes Khachatryan

@GeorgeK ฉันเห็นว่าคุณกำลังใช้ Dynamics AX ระวังการตั้งค่าสถานะการติดตาม [ blogs.msdn.microsoft.com/axinthefield/ซึ่งสามารถนำไปสู่ปัญหาการประมาณการจำนวนมาก หากปิดใช้งานการตั้งค่าสถานะการสืบค้นกลับ 4136 ตรวจสอบว่าคอลัมน์ "พาร์ติชัน" เป็นครั้งแรกในดัชนีของคุณ พาร์ติชันมักมีค่าแตกต่างกันเล็กน้อย
Hans Vader

9

เมื่อดูที่แผนทั้งสองคุณจะต้องค้นหาทั้งสองอย่างพร้อมกับ% ที่แตกต่างกันอย่างมาก หากคุณวางเมาส์เหนือวัตถุคุณจะเห็นจำนวนการประหารชีวิต

การค้นหาคีย์คือการค้นหากลับไปที่ดัชนีคลัสเตอร์เนื่องจากดัชนีที่ใช้ในการค้นหาดัชนี (ด้านบนขวา) ไม่ครอบคลุมทุกคอลัมน์ (เลือก * ดังนั้นต้องใช้ดัชนีคลัสเตอร์)

100 อันดับแรกสามารถรับ 100 แถวที่ต้องการในการอ่านน้อยลงจากดัชนีจากนั้นทำการค้นหา 100 ครั้งแทนที่จะค้นหาทุกแถวในตาราง อธิบายการเพิ่มจำนวนหน้าที่อ่านเมื่อไม่ทำ 'สุดยอด'

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.