Thật ngạc nhiên khi một số tính năng có thể không còn được sử dụng trong thế giới phần mềm một cách nhanh chóng.
Bài viết này trình bày hai phương pháp để xem liệu các tính năng không dùng nữa có đang được sử dụng trong phiên bản SQL Server hay không.
Phương pháp 1 - sys.dm_os_performance_counters
Có lẽ cách nhanh nhất để làm điều đó là sử dụng sys.dm_os_performance_counters
chế độ xem quản lý động hệ thống. Trong số nhiều điều bạn có thể làm với chế độ xem này, là nhận danh sách các tính năng không dùng nữa, cùng với số lần chúng đã được sử dụng kể từ khi SQL Server khởi động.
Dưới đây là một ví dụ được lấy từ bài viết của tôi Cách nhanh nhất để tìm các tính năng không được dùng nữa vẫn được sử dụng trong phiên bản máy chủ SQL:
SELECT RTRIM(instance_name) 'Feature', cntr_value 'Usage Count' FROM sys.dm_os_performance_counters WHERE object_name = 'SQLServer:Deprecated Features' AND cntr_value > 0;
Kết quả:
+-----------------------------------+---------------+ | Feature | Usage Count | |-----------------------------------+---------------| | String literals as column aliases | 1 | | TIMESTAMP | 1 | | numbered_procedures | 1 | | sysdatabases | 3 | | sp_db_vardecimal_storage_format | 1 | | XP_API | 2 | +-----------------------------------+---------------+
Trong ví dụ này, tôi chỉ trả lại những hàng có object_name
cột có giá trị là SQLServer:Deprecated Features
và cntr_value
giá trị của cột lớn hơn 0.
Bạn có thể xóa cntr_value
từ truy vấn này để trả về tất cả các tính năng không dùng nữa, bao gồm cả những tính năng chưa được sử dụng.
Phương pháp 2 - Sử dụng Sự kiện mở rộng
Một cách khác để làm điều đó là sử dụng các sự kiện mở rộng. Đây là một phương pháp toàn diện hơn và bạn có thể sử dụng nó để tạo tệp nhật ký chứa tất cả các trường hợp sử dụng tính năng không được dùng nữa, cùng với câu lệnh SQL được sử dụng có chứa tính năng không dùng nữa, ai đã chạy nó, cơ sở dữ liệu mà nó đã được chạy chống lại, v.v. . Dưới đây là một ví dụ.
Tạo sự kiện:
CREATE EVENT SESSION [Deprecation Events] ON SERVER ADD EVENT sqlserver.deprecation_announcement( ACTION( sqlserver.database_name, sqlserver.sql_text, sqlserver.username ) ), ADD EVENT sqlserver.deprecation_final_support( ACTION( sqlserver.database_name, sqlserver.sql_text, sqlserver.username ) ) ADD TARGET package0.event_file( SET filename=N'/var/opt/mssql/tmp/DeprecationEvents.xel' ) WITH ( TRACK_CAUSALITY = ON );
Bắt đầu sự kiện:
ALTER EVENT SESSION [Deprecation Events] ON SERVER STATE = START;
Chạy một số mã không dùng nữa:
SELECT * FROM sys.sql_dependencies;
Đọc nhật ký:
SELECT EventXml.value('(@timestamp)[1]', 'datetime2') AS [timestamp], EventXml.value('(action[@name="username"]/value)[1]', 'nvarchar(256)') AS username, EventXml.value('(action[@name="database_name"]/value)[1]', 'nvarchar(128)') AS database_name, EventXml.value('(action[@name="sql_text"]/value)[1]', 'varchar(4000)') AS sql_text, EventXml.value('(@name)[1]', 'varchar(50)') AS event_name, EventXml.value('(data[@name="feature"]/value)[1]', 'varchar(255)') AS feature, EventXml.value('(data[@name="message"]/value)[1]', 'varchar(max)') AS message FROM (SELECT CAST(event_data AS XML) AS XmlEventData FROM sys.fn_xe_file_target_read_file ( '/var/opt/mssql/tmp/DeprecationEvents*.xel', null, null, null )) AS EventTable CROSS APPLY EventTable.XmlEventData.nodes('event') AS q(EventXml);
Kết quả (sử dụng đầu ra dọc):
dấu thời giantimestamp | 2019-10-31 04:03:06.5280000 username | sa database_name | Test sql_text | SELECT * FROM sys.sql_dependencies; event_name | deprecation_announcement feature | sql_dependencies message | sql_dependencies will be removed in a future version of SQL Server. Avoid using this feature in new development work, and plan to modify applications that currently use it.
Để thảo luận chi tiết hơn về phương pháp này, hãy xem Sử dụng sự kiện mở rộng để ghi nhật ký các tính năng không được dùng nữa đang được sử dụng trong phiên bản SQL Server. Bài viết đó bao gồm cùng một ví dụ, nhưng chi tiết hơn một chút.