Có cách nào để xác định xem các truy vấn SQL Server đang chạy trong bộ nhớ hoặc vào đĩa không?


13

Tôi đã bắt gặp một tập hợp các thủ tục được lưu trữ trong một ứng dụng ngày nay được gọi liên tục trong một quy trình dài. Trong mỗi thủ tục, tôi tìm thấy nhiều câu lệnh chọn khác nhau, một số trong các vòng lặp; không có gì đáng ngạc nhiên, những thói quen này hiện đang được sử dụng mất vài phút để chạy, khi trực giác sẽ mong đợi chúng hoàn thành trong vài giây.

Có vẻ khá rõ ràng rằng hiệu suất đã không được xem xét khi các thủ tục này được viết, có nhiều trường hợp chỉ là "không phải là một ý tưởng tốt".

Xử lý mỗi hàng khi nhập dữ liệu mất 300ms mỗi hàng, vì vậy việc nhập tương đối nhỏ sẽ mất vài phút để xử lý.

Tuy nhiên, các bảng liên quan đến các thủ tục phần lớn khá nhỏ. Tôi nghĩ rằng, nếu tất cả các bảng này đều nằm hoàn toàn trong bộ nhớ, có lẽ không có nhiều thứ có thể đạt được bằng cách viết lại bất kỳ bảng nào trong số này.

Tôi đang cố gắng xác định .... đối với mã rõ ràng không hiệu quả này, nó có ảnh hưởng thực sự đến mức nào? Có đáng để sửa chữa không?

Vì vậy, câu hỏi là:
- có cách nào để xác định những bảng nào được ghim hoàn toàn trong bộ nhớ không?
- có cách nào để bật theo dõi để theo dõi các thủ tục được lưu trữ lồng nhau để tìm các phần đặc biệt đắt tiền không?

Lưu ý: Đây là trên SQL Server 2008 R2

Câu trả lời:


12

Bạn có thể sử dụng một trong hai truy vấn này để xem tổng số lần đọc logic và tổng số lần đọc vật lý.

SELECT  DB_NAME(st.dbid) Db,
        OBJECT_NAME(st.objectid, st.dbid) Prc,
        qs.execution_count,
        qs.total_logical_reads,
        qs.total_physical_reads,
        qs.statement_start_offset,
        qs.statement_end_offset,
        st.text
FROM    sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) st;

SELECT  DB_NAME(database_id) Db,
        OBJECT_NAME(object_id, database_id) Prc,
        execution_count,
        total_logical_reads,
        total_physical_reads
FROM    sys.dm_exec_procedure_stats ps;

Cái đầu tiên phá vỡ điều này bằng câu lệnh, cái thứ hai tính trong toàn bộ thủ tục.

Đọc vật lý là đọc trên đĩa, đọc hợp lý là chống lại bộ nhớ. Bạn có thể sử dụng điều này để tìm ra các thủ tục hoặc câu lệnh nào là đắt nhất trong hệ thống của bạn và cố gắng điều chỉnh chúng.

Hãy nhớ rằng, mặc dù các lần đọc logic rẻ hơn đáng kể so với đọc vật lý, chúng vẫn đắt tiền, do đó việc giảm số lượng chúng (ví dụ bằng cách thêm một chỉ mục thích hợp) có thể khiến truy vấn của bạn chạy nhanh hơn rất nhiều.

Có rất nhiều cột bổ sung trong DMV ở trên mà bạn cũng có thể thấy thú vị.


Làm thế nào để một chỉ số giúp giảm đọc hợp lý?

Trong SQL Server, tất cả dữ liệu được sắp xếp theo khối, kích thước 8KB. Những khối này được gọi là "trang".

Mỗi bảng chứa các trang "meta" có chứa thông tin về struktur của bảng cũng như các trang pata. Nếu không có chỉ mục nào tồn tại và bạn chạy một truy vấn như SELECT * FROM tbl WHERE Id = 7SQL Server phải tìm kiếm hàng này hoặc các hàng này trong toàn bộ bảng. Vì vậy, nó đọc trong một trang tại một thời điểm, lặp qua tất cả các hàng trong mỗi trang để xác định các hàng phù hợp với WHEREmệnh đề. Vì vậy, nếu bảng yêu cầu 1.000.000 trang được lưu trữ, truy vấn này sẽ mất 1.000.000 lần đọc logic để thực thi.

Nếu bạn có một chỉ mục, SQL Server sẽ sắp xếp dữ liệu một cách hợp lý trong các trang và thiết lập một danh sách được liên kết giữa các trang. Điều này cho phép chạy các truy vấn với một ORDER BYthực thi mà không cần một hoạt động sắp xếp đắt tiền. Nhưng quan trọng là việc sắp xếp, SQL Server thêm Cây B + vào bảng. Cây B + là một cấu trúc có thể so sánh với chỉ mục trong một cuốn sách, trong đó việc tìm kiếm một từ khóa cụ thể cho phép tôi trực tiếp nhảy đến trang có chứa từ khóa. Cuốn sách điển hình chỉ có một cấp chỉ mục trong khi Cây B + có thể có nhiều cấp. Chỉ cần nghĩ về một cuốn sách lớn, trong đó bản thân chỉ mục dài nhiều trang. Trong trường hợp như vậy, điều hợp lý là thêm một lớp chỉ mục bổ sung cho chúng ta biết trên trang wich, các từ chỉ mục bắt đầu bằng Ssẽ được tìm thấy.

B + Cây được tối ưu hóa để có càng ít cấp càng tốt trong khi cung cấp thuộc tính mà bất kỳ bản ghi nào trong chỉ mục có thể được tìm thấy bằng cách đọc một trang trên mỗi cấp chỉ mục. Vì vậy, giả sử WHERE Id = 7truy vấn trên khi bạn có một chỉ mục được sắp xếp theo Id. Hãy nói rằng chỉ số có 5 cấp độ. Bây giờ, để tìm tất cả các bản ghi khớp với truy vấn này, tôi phải đọc một trang cho mỗi cấp chỉ mục (đó là 5 trang). Đây được gọi là "Tìm kiếm chỉ mục". Nếu có nhiều bản ghi phù hợp với hóa đơn, tôi có thể phải theo chỉ mục được sắp xếp trong một thời gian để lấy tất cả chúng. Nhưng hãy giả sử chỉ có một bản ghi.

Vì vậy, không có chỉ mục chạy mà truy vấn đó yêu cầu 1.000.000 lượt đọc, với chỉ số yêu cầu 5 lần đọc. Mặc dù một lần đọc logic là một hoạt động trong bộ nhớ, vẫn có một chi phí đáng kể - thực tế nó là hoạt động tốn kém nhất trong một truy vấn tầm thường như ở trên. Vì vậy, việc giảm số lần đọc logic cần thiết cho hệ số 200.000 sẽ tăng tốc truy vấn của bạn bằng một yếu tố tương tự.

Vì vậy, một lần đọc logic không tương đương với quét bảng, nhưng quét bảng gây ra nhiều lần đọc logic hơn so với tìm kiếm chỉ mục.


> "... giảm số lượng chúng (ví dụ: bằng cách thêm một chỉ mục thích hợp) có thể làm cho các truy vấn của bạn chạy nhanh hơn rất nhiều." Bạn có thể giải thích cách thêm một chỉ mục sẽ làm giảm (?) Các lần đọc logic? Là logic đọc đồng nghĩa với quét bảng?

1
Đã thêm một lời giải thích cho câu trả lời của tôi ở trên.
Sebastian Meine

Cảm ơn. Ngay cả khi giả sử các chỉ mục thích hợp nằm trên tất cả các bảng có liên quan ... Tôi nghĩ vẫn có sự khác biệt lớn về hiệu năng giữa một bảng được ghim trong bộ nhớ so với được đọc từ đĩa (giả sử các chỉ mục giống nhau trong cả hai kịch bản) ... hoặc trong các trường hợp khác từ, thêm chỉ mục sẽ giúp bạn giảm% hiệu suất trên máy có nhiều RAM hơn so với máy có ít bộ nhớ .... đúng không?

1
truy cập đĩa vật lý rõ ràng là thứ tự cường độ đắt hơn truy cập bộ nhớ. Vì vậy, thực hiện các biện pháp để tránh nó sẽ giúp bạn đi rất xa. Bạn vẫn nên xem số lần đọc logic trước khi điều chỉnh truy vấn. Giữ chúng ở mức thấp sẽ lần lượt giữ mức đọc vật lý thấp. Cũng có khả năng cao là các trang không phải bị đuổi khỏi bộ đệm làm giảm số lần đọc vật lý cần thiết hơn nữa.
Sebastian Meine

2
Tiểu nitlog - Tôi nghĩ rằng các trang là 8kb :-). Câu trả lời tốt.
onupdatecascade

3
  • Có cách nào để bật theo dõi để theo dõi các thủ tục được lưu trữ lồng nhau để tìm các phần đặc biệt đắt tiền không?

Bạn có thể sử dụng SQL Profiler. Khi bạn bắt đầu theo dõi, bạn nên chọn RPC Hoàn thành, Bắt đầu SP, SP StmtStarting và SP StmtCompleted (xem hình ảnh bên dưới)

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

Điều này sẽ cho phép bạn xem mọi truy vấn chạy bên trong các thủ tục được lưu trữ. Nó sẽ cho bạn thấy bao nhiêu lần một thủ tục lưu trữ lồng nhau được gọi. Khi dấu vết kết thúc, bạn nên lưu nó. Sau đó, mở lại và sau đó, bạn sẽ có thể lọc (bằng nút "Bộ lọc cột") để tìm các truy vấn gây ra sự cố cho bạn. (ví dụ: các truy vấn mất nhiều hơn x đọc hoặc kéo dài hơn x giây (thời lượng) ...)

Các tùy chọn profiler tôi chỉ cho bạn cũng hiển thị kế hoạch thực hiện, cũng có rất nhiều trợ giúp.


1

Có vẻ như một câu hỏi tối ưu hóa truy vấn chung. Từ mô tả của bạn, tôi sẽ:

  1. Nhìn vào mã để xem nếu nó xử lý từng hàng. Nếu đúng như vậy, thì thường có thể thực hiện các lệnh cải thiện cường độ bằng cách thực hiện cùng một logic bằng cách sử dụng các bộ (nhiều hàng được xử lý cùng một lúc). Nói cách khác, nếu nó hoạt động như "vòng lặp trên mỗi hàng" thì hãy đổi nó thành "xử lý tất cả các hàng". SQL vượt trội về điều đó bởi vì trình tối ưu hóa có thể chọn từ các phương thức khả thi hơn, có khả năng sử dụng song song, loại bỏ rất nhiều chi phí xuất phát từ một hàng một lần.
  2. Hãy chắc chắn rằng, tiếp theo, có các chỉ mục hỗ trợ công việc. Thông thường, một lần nữa, các lệnh cải thiện cường độ có thể có với các chỉ số chính xác so với không. Điều này đúng trong bộ nhớ và với truy cập đĩa. Các quy trình vẫn có thể mất hàng giờ với mọi thứ trong RAM nếu không có chỉ mục phù hợp trên một tập dữ liệu lớn.
  3. Tiếp theo, với bộ logic và chỉ mục được đặt đúng chỗ, tôi sẽ xem xét liệu các trang dữ liệu bị ảnh hưởng có phù hợp với bộ nhớ hay không. Tại thời điểm này, nếu vẫn còn nhiều quyền truy cập đĩa, hãy xem các hoạt động đọc vật lý và hoạt động của đĩa có ý nghĩa, bởi vì tất cả những lợi ích lớn từ việc tối ưu hóa đều được thực hiện trong hai bước đầu tiên.
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.