Câu hỏi về hiệu suất 'CHỌN HÀNG ĐẦU'


18

Tôi có một truy vấn chạy nhanh hơn nhiều với chọn top 100và chậm hơn nhiều mà không có top 100. Số lượng hồ sơ được trả về là 0. Bạn có thể giải thích sự khác biệt trong kế hoạch truy vấn hoặc chia sẻ liên kết nơi sự khác biệt đó được giải thích không?

Truy vấn không có topvăn bản:

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 = 'Казахстан';

Kế hoạch truy vấn cho ở trên (không có top):

https://pastebin.com/cbtJpxFf

nhập mô tả hình ảnh ở đây

Thống kê IO và TIME (không có 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.

Các chỉ số đã qua sử dụng (không có 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

Truy vấn với 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 = 'Казахстан';

Gói truy vấn (có TOP):

https://pastebin.com/0dyu6QZd

nhập mô tả hình ảnh ở đây


Các thống kê truy vấn IO và TIME (có 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.

Các chỉ mục được sử dụng (với 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

Sẽ đánh giá cao bất kỳ sự giúp đỡ về chủ đề này!


2
Tôi không nghĩ tốc độ của 'TOP' mà không có 'ORDER BY'. Kết quả chính xác quan trọng hơn tốc độ.
Dan Guzman

Câu trả lời:


15

SQL Server xây dựng các kế hoạch thực hiện khác nhau cho TOP 100, sử dụng thuật toán sắp xếp khác nhau. Đôi khi nó nhanh hơn, đôi khi nó chậm hơn.

Để biết các ví dụ đơn giản hơn về nó, hãy đọc Bao nhiêu một hàng có thể thay đổi một kế hoạch truy vấn? Phần 1Phần 2 .

Để biết chi tiết kỹ thuật chuyên sâu, cộng với một ví dụ về việc thuật toán TOP 100 thực sự chậm hơn, hãy đọc Sắp xếp, mục tiêu hàng của Paul White và Bài toán TOP 100 .

Điểm mấu chốt: trong trường hợp của bạn, nếu bạn biết rằng sẽ không có hàng nào được trả về, thì ... đừng chạy truy vấn, nhỉ? Truy vấn nhanh nhất là một truy vấn bạn không bao giờ thực hiện. Tuy nhiên, nếu bạn cần thực hiện kiểm tra sự tồn tại, chỉ cần thực hiện NẾU EXISTS (truy vấn dính ở đây), và sau đó SQL Server sẽ thực hiện một kế hoạch thực hiện khác.


Cảm ơn, tôi chắc chắn sẽ đọc nó. Tôi cũng đã nhận thấy rằng các ước tính hàng là không chính xác trong cả hai kịch bản. Nó có thể được kết nối với cái gì? Các số liệu thống kê nếu ổn - tôi đã cập nhật nó với tùy chọn fullscan trên cả hai chỉ mục được nhóm.
George K

Ngoài ra - nó có phù hợp trong trường hợp của tôi không vì tôi không có ĐẶT HÀNG, vì vậy tôi tin rằng sẽ không có SORT trong kế hoạch của mình?
George K

Sẽ rất thú vị để xem liệu kế hoạch thực hiện có giống nhau cho cả TOP 100 và TOP 101 hay không. Nếu có thể, hãy chia sẻ. Cảm ơn.
Artash Khachatryan

@GeorgeK Tôi có thể thấy rằng bạn đang sử dụng Dynamics AX. Coi chừng cờ theo dõi [ blog.msdn.microsoft.com/axinthefield/ , điều này có thể dẫn đến nhiều vấn đề ước tính. Nếu cờ theo dõi 4136 bị vô hiệu hóa, hãy kiểm tra xem Cột "Phân vùng" có phải là cột đầu tiên trong chỉ mục của bạn không. Phân vùng thường có rất ít giá trị riêng biệt.
Hans Vader

9

Nhìn vào hai kế hoạch, bạn có một tra cứu quan trọng trên cả hai với% chi phí khác nhau đáng kể. Nếu bạn di chuột qua các đối tượng, bạn sẽ thấy số lần thực hiện.

Tra cứu khóa là tra cứu trở lại chỉ mục được phân cụm vì chỉ mục được sử dụng trong tìm kiếm chỉ mục (trên cùng bên phải) không bao gồm tất cả các cột (chọn * vì vậy phải sử dụng chỉ mục được phân cụm).

Top 100 có thể nhận được 100 hàng cần thiết trong ít lần đọc từ chỉ mục và sau đó thực hiện tra cứu 100 lần thay vì cho mỗi hàng trong bảng. Cũng giải thích sự gia tăng số lượng trang đọc khi KHÔNG thực hiện 'đầu trang'.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.