To niesamowite, jak szybko niektóre funkcje mogą stać się przestarzałe w świecie oprogramowania.
W tym artykule przedstawiono dwie metody sprawdzenia, czy w instancji SQL Server są używane przestarzałe funkcje.
Metoda 1 – sys.dm_os_performance_counters
Być może najszybszym sposobem na to jest użycie sys.dm_os_performance_counters
widok dynamicznego zarządzania systemem. Wśród wielu rzeczy, które możesz zrobić w tym widoku, jest lista przestarzałych funkcji wraz z informacją, ile razy były one używane od czasu uruchomienia SQL Server.
Oto przykład zaczerpnięty z mojego artykułu Najszybszy sposób na znalezienie przestarzałych funkcji, które są nadal używane w instancji SQL Server:
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;
Wynik:
+-----------------------------------+---------------+ | 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 | +-----------------------------------+---------------+
W tym przykładzie zwracam tylko te wiersze, w których object_name
kolumna ma wartość SQLServer:Deprecated Features
i cntr_value
wartość kolumny jest większa od zera.
Możesz usunąć cntr_value
kolumny z tego zapytania, aby zwrócić wszystkie przestarzałe funkcje, w tym te, które nie były używane.
Metoda 2 – Użyj rozszerzonych wydarzeń
Innym sposobem na to jest użycie rozszerzonych wydarzeń. Jest to bardziej wszechstronna metoda i można jej użyć do utworzenia pliku dziennika zawierającego wszystkie przypadki użycia przestarzałej funkcji, wraz z użytą instrukcją SQL zawierającą przestarzałą funkcję, osobę, która ją uruchomiła, bazę danych, na której była uruchomiona itp. Poniżej znajduje się przykład.
Utwórz wydarzenie:
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 );
Rozpocznij wydarzenie:
ALTER EVENT SESSION [Deprecation Events] ON SERVER STATE = START;
Uruchom przestarzały kod:
SELECT * FROM sys.sql_dependencies;
Przeczytaj dziennik:
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);
Wynik (przy użyciu wyjścia pionowego):
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.
Aby uzyskać bardziej szczegółowe omówienie tej metody, zobacz Używanie rozszerzonych zdarzeń do rejestrowania przestarzałych funkcji używanych w wystąpieniu programu SQL Server. Ten artykuł zawiera ten sam przykład, ale z nieco bardziej szczegółowymi informacjami.