Chúng tôi đang khắc phục sự cố một máy chủ có mức sử dụng CPU cao. Sau khi thấy rằng các truy vấn không thực sự gây ra nó, chúng tôi bắt đầu xem xét các phần tổng hợp.
Màn hình hiệu suất đang hiển thị dưới 50 Biên dịch / giây và dưới 15 Biên dịch / giây.
Sau khi chạy một phiên XE tìm kiếm các phần tổng hợp, chúng ta đang thấy hàng ngàn phần tổng hợp mỗi giây.
Hệ thống này đang sử dụng các kích hoạt để kiểm toán thay đổi. Hầu hết các phần tổng hợp là do kích hoạt. Các tham chiếu kích hoạt sys.dm_tran_active_transilities.
Suy nghĩ đầu tiên của chúng tôi là có thể việc tham chiếu DMV trong trình kích hoạt sẽ khiến nó biên dịch mỗi lần, hoặc có thể chỉ DMV cụ thể này sẽ gây ra nó. Vì vậy, tôi bắt đầu thử nghiệm lý thuyết đó. Nó không biên dịch mỗi lần, nhưng tôi đã không kiểm tra nếu trình kích hoạt biên dịch mỗi lần nó được kích hoạt khi nó không tham chiếu DMV và thay vào đó mã hóa một giá trị. Nó vẫn đang biên dịch mỗi khi nó được kích hoạt. Thả kích hoạt dừng biên dịch.
- Chúng tôi đang sử dụng sqlserver.query_pre_execut_showplan trong một phiên XE để theo dõi các phần tổng hợp. Tại sao có sự khác biệt giữa điều đó và bộ đếm PerfMon?
- Có phải là bình thường khi bạn nhận được một sự kiện biên dịch mỗi khi kích hoạt chạy?
Kịch bản repro:
CREATE TABLE t1 (transaction_id int, Column2 varchar(100));
CREATE TABLE t2 (Column1 varchar(max), Column2 varchar(100));
GO
CREATE TRIGGER t2_ins
ON t2
AFTER INSERT
AS
INSERT INTO t1
SELECT (SELECT TOP 1 transaction_id FROM sys.dm_tran_active_transactions), Column2
FROM inserted;
GO
--Both of these show compilation events
INSERT INTO t2 VALUES ('row1', 'value1');
INSERT INTO t2 VALUES ('row2', 'value2');
GO
ALTER TRIGGER t2_ins
ON t2
AFTER INSERT
AS
INSERT INTO t1
SELECT 1000, Column2
FROM inserted;
GO
--Both of these show compilation events
INSERT INTO t2 VALUES ('row3', 'value3');
INSERT INTO t2 VALUES ('row4', 'value4');
DROP TRIGGER t2_ins;
--These do not show compilation events
INSERT INTO t2 VALUES ('row5', 'value5');
INSERT INTO t2 VALUES ('row6', 'value6');
DROP TABLE t1, t2;