Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Използване на разширени събития за регистриране на остарели функции, използвани в екземпляр на SQL сървър (пример за T-SQL)

Разширени събития е лека система за наблюдение на производителността, която позволява на потребителите да събират данни, необходими за наблюдение и отстраняване на проблеми в SQL Server.

Тази статия демонстрира как разширените събития могат да се използват за създаване на регистрационен файл, който съдържа всички отхвърлени функции, които все още се използват в екземпляр на SQL Server. Регистраторът записва всички събития от началото на сесията на събитието.

Ако просто искате бързо да преброите колко пъти е била използвана оттеглена функция от стартирането на SQL Server, вижте Най-бързият начин за намиране на остарели функции, които все още се използват в екземпляр на SQL Server.

Но ако имате нужда от по-подробен дневник, който включва неща като; използваният SQL израз, който съдържа оттеглената функция, базата данни, срещу която е била стартирана, потребителят, който я е стартирал, времето на изпълнение и т.н., прочетете нататък.

Създайте разширената сесия на събитието

Първата стъпка е да създадете разширената сесия на събитието. Тук указваме източника на събитията, целта на сесията на събитието и опциите за сесия на събитието.

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
    );

В този случай посочвам цел на /var/opt/mssql/tmp/DeprecationEvents.xel . Това означава, че данните за събитието ще се съхраняват в този файл. Можете да посочите произволно име и път на файл.

Този пример използва Linux файлов път, който използва наклонени черти напред. Ако използвате Windows, ще трябва да използвате обратна наклонена черта. Например:C:\Temp\DeprecationEvents.xel .

Започнете разширената сесия на събитието

Създаването на сесия на събитието не я стартира. Използвайте ALTER EVENT SESSION да го спре и започне. В този случай искаме да го стартираме:

ALTER EVENT SESSION [Deprecation Events] ON SERVER STATE = START;

Направете нещо отхвърлено

Сега, след като започнахме разширената сесия на събитието, нека изпълним някакъв остарял код:

SELECT * FROM sys.sql_dependencies;

Тъй като sys.sql_dependencies е отхвърлен, този код ще добави данни към XEL файла, който посочихме по-рано.

Преглед на XEL файла

Сега, след като (вероятно) сме добавили данни към нашия XEL файл, нека да го разгледаме:

SELECT event_data 
FROM sys.fn_xe_file_target_read_file (
    '/var/opt/mssql/tmp/DeprecationEvents*.xel', 
    null, 
    null, 
    null
    );  

Резултат:

<event name="deprecation_announcement" package="sqlserver" timestamp="2019-10-31T04:03:06.528Z"><data name="feature_id"><value>198</value></data><data name="feature"><value><![CDATA[sql_dependencies]]></value></data><data name="message"><value><![CDATA[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.]]></value></data><action name="username" package="sqlserver"><value><![CDATA[sa]]></value></action><action name="sql_text" package="sqlserver"><value><![CDATA[SELECT * FROM sys.sql_dependencies;]]></value></action><action name="database_name" package="sqlserver"><value><![CDATA[Test]]></value></action><action name="attach_activity_id_xfer" package="package0"><value>5566866F-8266-467A-9950-895310CF21E3-0</value></action><action name="attach_activity_id" package="package0"><value>07971CB0-F9CC-46C6-B885-5BA8A904B880-1</value></action>

В този случай върнах само event_data , защото там се намират всички данни за събитието.

За съжаление, за нас, хората, не е най-лесният за четене.

Ами ако го форматирам?

<event name="deprecation_announcement" package="sqlserver" timestamp="2019-10-31T04:03:06.528Z">
   <data name="feature_id">
      <value>198</value>
   </data>
   <data name="feature">
      <value><![CDATA[sql_dependencies]]></value>
   </data>
   <data name="message">
      <value><![CDATA[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.]]></value>
   </data>
   <action name="username" package="sqlserver">
      <value><![CDATA[sa]]></value>
   </action>
   <action name="sql_text" package="sqlserver">
      <value><![CDATA[SELECT * FROM sys.sql_dependencies;]]></value>
   </action>
   <action name="database_name" package="sqlserver">
      <value><![CDATA[Test]]></value>
   </action>
   <action name="attach_activity_id_xfer" package="package0">
      <value>5566866F-8266-467A-9950-895310CF21E3-0</value>
   </action>
   <action name="attach_activity_id" package="package0">
      <value>07971CB0-F9CC-46C6-B885-5BA8A904B880-1</value>
   </action>
</event>

Малко по-лесно се чете, когато е форматиран, но можем да направим по-добре от това.

Разберете XEL файла

В този пример анализирам XEL файла, така че да мога да видя данните в мрежа, точно както всяка друга заявка за база данни.

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);

Резултат (с помощта на вертикален изход):

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.

Тук използвам вертикален изход, за да улесня четенето, без да се налага да превъртате хоризонтално. Това означава, че заглавията на колоните са отляво, а данните са отдясно. Ако стартирате това с помощта на GUI като SSMS или Azure Data Studio, вероятно ще го видите в обичайния формат на таблица (освен ако не сте посочили друго).

Множество реда за една отхвърлена функция?

Вашият XEL файл понякога може да получи множество записи за едно събитие. Например, изпълнявате веднъж една отхвърлена съхранена процедура, само за да откриете, че 10 или 11 реда са върнати от вашия XEL файл за този отделен израз.

Ето един пример:

USE Music;
EXEC sp_depends @objname = 'Artists';

sp_depends системната съхранена процедура е остаряла, така че определено бих очаквал да видя ред за това. Ако го изпълня точно сега, може да очаквам да получа общо 2 реда:1 за предишния пример и 1 за този пример.

Но както се оказа, към моя XEL файл са добавени още 11 реда:

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)
ORDER BY [Timestamp] ASC;

Резултат (с помощта на вертикален изход):

-[ RECORD 1 ]-------------------------
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.
-[ RECORD 2 ]-------------------------
timestamp     | 2019-10-31 04:15:13.9920000
username      | sa
database_name | Music
sql_text      | USE Music;
EXEC sp_depends @objname = 'Artists';
event_name    | deprecation_announcement
feature       | sp_depends
message       | sp_depends 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.
-[ RECORD 3 ]-------------------------
timestamp     | 2019-10-31 04:15:13.9940000
username      | sa
database_name | Music
sql_text      | USE Music;
EXEC sp_depends @objname = 'Artists';
event_name    | deprecation_final_support
feature       | String literals as column aliases
message       | The ability to use string literals as column aliases will be removed in a future version of SQL Server. Avoid using this feature in new development work, and plan to modify applications that 
-[ RECORD 4 ]-------------------------
timestamp     | 2019-10-31 04:15:13.9950000
username      | sa
database_name | Music
sql_text      | USE Music;
EXEC sp_depends @objname = 'Artists';
event_name    | deprecation_final_support
feature       | String literals as column aliases
message       | The ability to use string literals as column aliases will be removed in a future version of SQL Server. Avoid using this feature in new development work, and plan to modify applications that 
-[ RECORD 5 ]-------------------------
timestamp     | 2019-10-31 04:15:13.9950000
username      | sa
database_name | Music
sql_text      | USE Music;
EXEC sp_depends @objname = 'Artists';
event_name    | deprecation_final_support
feature       | String literals as column aliases
message       | The ability to use string literals as column aliases will be removed in a future version of SQL Server. Avoid using this feature in new development work, and plan to modify applications that 
-[ RECORD 6 ]-------------------------
timestamp     | 2019-10-31 04:15:14.0020000
username      | sa
database_name | Music
sql_text      | USE Music;
EXEC sp_depends @objname = 'Artists';
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.
-[ RECORD 7 ]-------------------------
timestamp     | 2019-10-31 04:15:14.0100000
username      | sa
database_name | Music
sql_text      | USE Music;
EXEC sp_depends @objname = 'Artists';
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.
-[ RECORD 8 ]-------------------------
timestamp     | 2019-10-31 04:15:14.0100000
username      | sa
database_name | Music
sql_text      | USE Music;
EXEC sp_depends @objname = 'Artists';
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.
-[ RECORD 9 ]-------------------------
timestamp     | 2019-10-31 04:15:14.0120000
username      | sa
database_name | Music
sql_text      | USE Music;
EXEC sp_depends @objname = 'Artists';
event_name    | deprecation_final_support
feature       | sysdepends
message       | sysdepends will be removed in the next version of SQL Server. Avoid using this feature in new development work, and plan to modify applications that currently use it.
-[ RECORD 10 ]-------------------------
timestamp     | 2019-10-31 04:15:14.0260000
username      | sa
database_name | Music
sql_text      | USE Music;
EXEC sp_depends @objname = 'Artists';
event_name    | deprecation_final_support
feature       | sysdepends
message       | sysdepends will be removed in the next version of SQL Server. Avoid using this feature in new development work, and plan to modify applications that currently use it.
-[ RECORD 11 ]-------------------------
timestamp     | 2019-10-31 04:15:14.0760000
username      | sa
database_name | Music
sql_text      | USE Music;
EXEC sp_depends @objname = 'Artists';
event_name    | deprecation_final_support
feature       | sysdepends
message       | sysdepends will be removed in the next version of SQL Server. Avoid using this feature in new development work, and plan to modify applications that currently use it.
-[ RECORD 12 ]-------------------------
timestamp     | 2019-10-31 04:15:14.0800000
username      | sa
database_name | Music
sql_text      | USE Music;
EXEC sp_depends @objname = 'Artists';
event_name    | deprecation_final_support
feature       | sysdepends
message       | sysdepends will be removed in the next version of SQL Server. Avoid using this feature in new development work, and plan to modify applications that currently use it.
(12 rows affected)

Какво става тук?

Това се случва, защото sp_depends Самата системна съхранена процедура използва отхвърлени функции.

Не само получавам 1 ред за изпълнение на sp_depends . Също така получавам 1 ред за всяка отхвърлена функция, която се използва от тази съхранена процедура (независимо дали е в съхранената процедура, или в друг обект, който препраща). В този случай получавам 10 допълнителни реда.

Разгледах набързо sp_depends дефиниция на и видях, че препраща към (остарялото) sysdepends на няколко места и които преглеждат препратки (оттеглените) sql_dependencies . Видях също, че използва низови литерали като псевдоними на колони, практика, която също е маркирана за оттегляне. Всичко това поддържа това, което виждам във файла XEL.

Повече подробности за всяка отхвърлена функция

Вижте статията на Microsoft Deprecated Database Engine Features в SQL Server 2017 за препоръки как да се справите с всеки остарял елемент. Този списък е точно същият като този за SQL Server 2016.

Справочник за документацията на Microsoft

  • Бърз старт:Разширени събития в SQL Server
  • СЪЗДАВАНЕ НА СЕСИЯ НА СЪБИТИЯ
  • ПРОМЕНЯ СЕСИЯ НА СЪБИТИЯ
  • sys.fn_xe_file_target_read_file
  • Четене на данни за събитие 101:Какво става с XML?

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Елиминиране на присъединяване:Когато SQL Server премахва ненужните таблици

  2. SQL за намиране на първия нечислов знак в низ

  3. Компресиране на специфичен дял в таблица в SQL Server (T-SQL)

  4. Как мога да попълня колона с произволни числа в SQL? Получавам една и съща стойност във всеки ред

  5. T-SQL:Избор на колона въз основа на MAX (друга колона)