Tôi có thể lấy SSMS để hiển thị cho tôi chi phí truy vấn thực tế trong ngăn kế hoạch Thực hiện không?


8

Tôi đang khắc phục các sự cố về hiệu suất trên quy trình được lưu trữ nhiều tầng trong SQL Server. Tôi muốn biết phần nào tôi nên dành thời gian trên.

Tôi hiểu từ Làm cách nào để đọc Chi phí truy vấn và luôn luôn là phần trăm? rằng ngay cả khi SSMS được yêu cầu bao gồm Kế hoạch thực hiện thực tế , số liệu "Chi phí truy vấn (so với lô)" vẫn dựa trên ước tính chi phí , có thể khác xa với thực tế

Tôi hiểu từ Đo lường Hiệu suất Truy vấn: Kế hoạch Thực hiện Truy vấn Chi phí Truy vấn so với Thời gian Thực hiện mà tôi có thể bao quanh việc gọi thủ tục được lưu trữ bằng các SET STATISTICS TIMEcâu lệnh và sau đó tôi sẽ nhận được một danh sách như thế này trong Messageskhung:

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

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

[etc]

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

với một thông điệp đầu ra cho mỗi câu lệnh.

Tôi có thể 'dễ dàng' (mặc dù không thuận tiện) liên kết đầu ra thống kê thời gian với các kế hoạch thực thi câu lệnh trong ngăn kế hoạch Thực thi, bằng cách đếm chúng: Đầu SQL Server Execution Timesra thông báo thứ tư tương ứng Query 4trong ngăn kế hoạch Thực thi, v.v.

Nhưng có cách nào tốt hơn không?

Câu trả lời:


8

Tôi không biết cách nào để thực hiện điều này trong kế hoạch từ Management Studio, nhưng đây là một trong nhiều điều mà SQL Sentry Plan Explorer miễn phí sẽ làm cho bạn khi bạn tạo một kế hoạch thực tế từ bên trong công cụ - bao gồm tất cả số liệu thời gian chạy trên mỗi câu lệnh.

http://sqlsentry.net/plan-explorer/sql-server-query-view.asp

Tuyên bố miễn trừ trách nhiệm: Tôi làm việc cho SQL Sentry.


Wow, điều này có vẻ lớn. Chỉ để tôi chắc chắn, các cột DurationCPUkết quả là thực tế chứ không phải ước tính, đúng không?
AakashM

@AakashM vâng, đó là thực tế.
Aaron Bertrand

5

Một cách tốt để làm điều này là với Profiler. Thiết lập một "repro" của Proc vấn đề của bạn trên một dev hoặc hộp kiểm tra, tức là một cuộc gọi mẫu đến Proc với các tham số. Sau đó, sử dụng Profiler, tạo một dấu vết bằng cách sử dụng mẫu TSQLinkss hoặc từ một mẫu trống, thêm sự kiện SP: StmtCompleted. Thêm các cột Thời lượng, Đọc, Ghi và CPU nếu chưa có sẵn. Thêm bộ lọc vào dấu vết trên SPID của bạn (mà bạn nên biết từ Management Studio). Bạn cũng có thể thêm bộ lọc vào Thời lượng (ví dụ: lớn hơn 1000 = lớn hơn 1 giây).

Bạn có thể chạy theo dõi trong Profiler mặc dù có chi phí hoạt động (KHÔNG làm điều này trên hộp sản xuất) hoặc xuất định nghĩa và tạo theo dõi phía máy chủ. Chi phí chung của Profiler không phải là vấn đề lớn đối với nhà phát triển hoặc hộp thử nghiệm chuyên dụng.

Chạy Proc và để nó hoàn thành. Bạn cũng có thể thu thập kế hoạch Thực hiện thực tế tại thời điểm này.

Dừng theo dõi của bạn và mở tệp, và bạn sẽ thấy một dòng phân tích dòng của Proc của bạn, bao gồm cả thời gian cho mỗi bước. Tôi thấy điều này hữu ích hơn kế hoạch xác định các tắc nghẽn mặc dù kế hoạch sẽ có ích khi xem xét các phần có liên quan để điều chỉnh.

HTH


4

Bạn cũng có thể sử dụng sys.dm_exec_procedure_statssys.dm_exec_query_stats quan điểm quản lý năng động. Đầu tiên trong số đó cung cấp thông tin về toàn bộ thủ tục; cái thứ hai có thể được sử dụng để thoát ra từng truy vấn trong thủ tục. Một ví dụ đã được biểu diễn ở dưới:

USE AdventureWorks;
GO
CREATE PROCEDURE dbo.Test
    @NameLike nvarchar(50)
AS
BEGIN
    SELECT
        ProductCount = COUNT_BIG(*)
    FROM Production.Product AS p
    JOIN Production.TransactionHistory AS th ON
        th.ProductID = p.ProductID
    WHERE
        p.Name LIKE @NameLike;

    SELECT
        pc.Name,
        ProductCount = COUNT_BIG(*)
    FROM Production.Product AS p
    JOIN Production.ProductSubcategory AS ps ON
        ps.ProductSubcategoryID = p.ProductSubcategoryID
    JOIN Production.ProductCategory AS pc ON
        pc.ProductCategoryID = ps.ProductCategoryID
    WHERE
        p.Name LIKE @NameLike
    GROUP BY
        pc.Name
    ORDER BY
        pc.Name;
END;
GO
EXECUTE dbo.Test @NameLike = N'A%';
EXECUTE dbo.Test @NameLike = N'F%';

Thống kê thủ tục:

SELECT
    deps.last_execution_time,
    deps.last_worker_time,
    deps.last_physical_reads,
    deps.last_logical_writes,
    deps.last_logical_reads,
    deps.last_elapsed_time
FROM sys.dm_exec_procedure_stats AS deps
WHERE
    deps.database_id = DB_ID()
    AND deps.[object_id] = OBJECT_ID(N'dbo.Test', N'P');

Truy vấn trong thủ tục:

SELECT
    query.the_text,
    deqs.last_execution_time,
    deqs.last_worker_time,
    deqs.last_physical_reads,
    deqs.last_logical_writes,
    deqs.last_logical_reads,
    deqs.last_clr_time,
    deqs.last_elapsed_time,
    deqs.last_rows    -- note: Only present from 2008 R2 onwards
FROM sys.dm_exec_query_stats AS deqs
CROSS APPLY sys.dm_exec_sql_text(deqs.[sql_handle]) AS dest
CROSS APPLY
(
    VALUES 
    (
        SUBSTRING
        (
            dest.[text], 
            deqs.statement_start_offset / 2 + 1,
            (ISNULL(NULLIF(deqs.statement_end_offset, -1), DATALENGTH(dest.[text])) - deqs.statement_start_offset) / 2 + 1
        )
    )
) AS query (the_text)
WHERE
    deqs.[sql_handle] IN
    (
        SELECT
            deps.[sql_handle]
        FROM sys.dm_exec_procedure_stats AS deps
        WHERE
            deps.database_id = DB_ID()
            AND deps.[object_id] = OBJECT_ID(N'dbo.Test', N'P')
    );

Điều này rất hữu ích và tôi chắc chắn sẽ sử dụng nó trên các hộp nơi tôi không thể cài đặt SQL Sentry Plan Explorer.
AakashM
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.