Det er utroligt, hvor hurtigt nogle funktioner kan blive forældet i softwareverdenen.
Denne artikel præsenterer to metoder til at se, om forældede funktioner bruges i en SQL Server-instans.
Metode 1 – sys.dm_os_performance_counters
Måske den hurtigste måde at gøre det på er at bruge sys.dm_os_performance_counters
system dynamisk styringsvisning. Blandt de mange ting, du kan gøre med denne visning, er at få en liste over forældede funktioner, sammen med hvor mange gange de er blevet brugt, siden SQL Server startede.
Her er et eksempel taget fra min artikel Hurtigste måde at finde forældede funktioner, der stadig bliver brugt i en SQL Server-instans:
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;
Resultat:
+-----------------------------------+---------------+ | 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 | +-----------------------------------+---------------+
I dette eksempel returnerer jeg kun de rækker, hvor object_name
kolonne har værdien SQLServer:Deprecated Features
, og cntr_value
kolonnens værdi er større end nul.
Du kan fjerne cntr_value
kolonne fra denne forespørgsel for at returnere alle forældede funktioner, inklusive dem, der ikke er blevet brugt.
Metode 2 – Brug udvidede hændelser
En anden måde at gøre det på er at bruge udvidede begivenheder. Dette er en mere omfattende metode, og du kan bruge den til at oprette en logfil, der indeholder alle forekomster af forældet funktionsbrug sammen med den anvendte SQL-sætning, der indeholder den forældede funktion, hvem kørte den, databasen den blev kørt imod osv. Nedenfor er et eksempel.
Opret begivenheden:
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 );
Start begivenheden:
ALTER EVENT SESSION [Deprecation Events] ON SERVER STATE = START;
Kør noget forældet kode:
SELECT * FROM sys.sql_dependencies;
Læs loggen:
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);
Resultat (ved hjælp af lodret output):
timestamp | 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.
For en mere detaljeret diskussion om denne metode, se Brug af udvidede hændelser til at logge forældede funktioner, der bruges i en SQL Server-instans. Denne artikel indeholder det samme eksempel, men med lidt flere detaljer.