التعليمة البرمجية لهدف Ring Buffer للأحداث الموسَّعة في Azure SQL Database
ينطبق على: قاعدة بيانات Azure SQL
لعلك تريد نموذج تعليمة برمجية كاملة لتوفير أسهل طريقة سريعة لالتقاط المعلومات والإبلاغ عنها لحدث ممتد أثناء الاختبار. أسهل هدف لبيانات الأحداث الموسَّعة هو هدف Ring Buffer.
يقدم هذا الموضوع نموذج تعليمات برمجية لـ Transact-SQL:
يُنشئ جدولاً بالبيانات للتوضيح باستخدامه.
لإنشاء جلسة لحدث موسَّع موجود، وبالتحديد sqlserver.sql_statement_starting.
- يقتصر الحدث على عبارات SQL التي تحتوي على سلسلة Update معينة:عبارة LIKE '%UPDATE tabEmployee%' .
- يختار إرسال إخراج الحدث إلى هدف من النوع Ring Buffer، وهو package0.ring_buffer.
يبدأ جلسة الحدث.
يصدر بضع عبارات بسيطة لـ SQL UPDATE.
يصدر عبارة SQL SELECT لاسترداد إخراج الحدث من Ring Buffer.
- تم ضم sys.dm_xe_database_session_targets وعروض الإدارة الديناميكية الأخرى (DMVs).
يوقف جلسة الحدث.
يسقط الهدف Ring Buffer لتحرير موارده.
يسقط جلسة الحدث والجدول التجريبي.
المتطلبات الأساسية
حساب واشتراك Azure. يمكنك الاشتراك في نسخة تجريبية مجانية.
أي قاعدة بيانات يمكنك إنشاء جدول بها.
- اختياريًّا، يمكنك إنشاء قاعدة البيانات التوضيحية AdventureWorksLT في دقائق.
SQL Server Management Studio (ssms.exe)، من الناحية المثالية آخر إصدار تحديث شهري له. يمكنك تنزيل أحدث ssms.exe من:
- الموضوع الذي بعنوان تنزيل SQL Server Management Studio.
- رابط مباشر للتنزيل.
نموذج التعليمة البرمجية
مع تعديل طفيف للغاية، يمكن تشغيل نموذج التعليمة البرمجية Ring Buffer التالية على Azure SQL Database أو Microsoft SQL Server. يتمثل الاختلاف في وجود العقدة '_database' في اسم بعض طرق عرض الإدارة الديناميكية (DMVs)، المستخدمة في عبارة FROM في الخطوة 5. على سبيل المثال:
- sys.dm_xe_database_session_targets
- sys.dm_xe_session_targets
GO
---- Transact-SQL.
---- Step set 1.
SET NOCOUNT ON;
GO
IF EXISTS
(SELECT * FROM sys.objects
WHERE type = 'U' and name = 'tabEmployee')
BEGIN
DROP TABLE tabEmployee;
END
GO
CREATE TABLE tabEmployee
(
EmployeeGuid uniqueIdentifier not null default newid() primary key,
EmployeeId int not null identity(1,1),
EmployeeKudosCount int not null default 0,
EmployeeDescr nvarchar(256) null
);
GO
INSERT INTO tabEmployee ( EmployeeDescr )
VALUES ( 'Jane Doe' );
GO
---- Step set 2.
IF EXISTS
(SELECT * from sys.database_event_sessions
WHERE name = 'eventsession_gm_azuresqldb51')
BEGIN
DROP EVENT SESSION eventsession_gm_azuresqldb51
ON DATABASE;
END
GO
CREATE
EVENT SESSION eventsession_gm_azuresqldb51
ON DATABASE
ADD EVENT
sqlserver.sql_statement_starting
(
ACTION (sqlserver.sql_text)
WHERE statement LIKE '%UPDATE tabEmployee%'
)
ADD TARGET
package0.ring_buffer
(SET
max_memory = 500 -- Units of KB.
);
GO
---- Step set 3.
ALTER EVENT SESSION eventsession_gm_azuresqldb51
ON DATABASE
STATE = START;
GO
---- Step set 4.
SELECT 'BEFORE_Updates', EmployeeKudosCount, * FROM tabEmployee;
UPDATE tabEmployee
SET EmployeeKudosCount = EmployeeKudosCount + 102;
UPDATE tabEmployee
SET EmployeeKudosCount = EmployeeKudosCount + 1015;
SELECT 'AFTER__Updates', EmployeeKudosCount, * FROM tabEmployee;
GO
---- Step set 5.
SELECT
se.name AS [session-name],
ev.event_name,
ac.action_name,
st.target_name,
se.session_source,
st.target_data,
CAST(st.target_data AS XML) AS [target_data_XML]
FROM
sys.dm_xe_database_session_event_actions AS ac
INNER JOIN sys.dm_xe_database_session_events AS ev ON ev.event_name = ac.event_name
AND CAST(ev.event_session_address AS BINARY(8)) = CAST(ac.event_session_address AS BINARY(8))
INNER JOIN sys.dm_xe_database_session_object_columns AS oc
ON CAST(oc.event_session_address AS BINARY(8)) = CAST(ac.event_session_address AS BINARY(8))
INNER JOIN sys.dm_xe_database_session_targets AS st
ON CAST(st.event_session_address AS BINARY(8)) = CAST(ac.event_session_address AS BINARY(8))
INNER JOIN sys.dm_xe_database_sessions AS se
ON CAST(ac.event_session_address AS BINARY(8)) = CAST(se.address AS BINARY(8))
WHERE
oc.column_name = 'occurrence_number'
AND
se.name = 'eventsession_gm_azuresqldb51'
AND
ac.action_name = 'sql_text'
ORDER BY
se.name,
ev.event_name,
ac.action_name,
st.target_name,
se.session_source
;
GO
---- Step set 6.
ALTER EVENT SESSION eventsession_gm_azuresqldb51
ON DATABASE
STATE = STOP;
GO
---- Step set 7.
ALTER EVENT SESSION eventsession_gm_azuresqldb51
ON DATABASE
DROP TARGET package0.ring_buffer;
GO
---- Step set 8.
DROP EVENT SESSION eventsession_gm_azuresqldb51
ON DATABASE;
GO
DROP TABLE tabEmployee;
GO
محتويات Ring Buffer
استخدمنا ssms.exe
لتشغيل نموذج التعليمة البرمجية.
لعرض النتائج، قمنا بالنقر فوق الخلية الموجودة أسفل رأس العمود target_data_XML.
ثم في جزء النتائج، نقرنا على الخلية الموجودة أسفل رأس العمود target_data_XML. أدى هذا النقر إلى إنشاء علامة تبويب ملف أخرى في ssms.exe حيث تم عرض محتوى خلية النتيجة، مثل XML.
يتم عرض الإخراج في الكتلة التالية. تبدو طويلة، لكنها مكونة من <عنصري> أحداث فقط.
<RingBufferTarget truncated="0" processingTime="0" totalEventsProcessed="2" eventCount="2" droppedCount="0" memoryUsed="1728">
<event name="sql_statement_starting" package="sqlserver" timestamp="2015-09-22T15:29:31.317Z">
<data name="state">
<type name="statement_starting_state" package="sqlserver" />
<value>0</value>
<text>Normal</text>
</data>
<data name="line_number">
<type name="int32" package="package0" />
<value>7</value>
</data>
<data name="offset">
<type name="int32" package="package0" />
<value>184</value>
</data>
<data name="offset_end">
<type name="int32" package="package0" />
<value>328</value>
</data>
<data name="statement">
<type name="unicode_string" package="package0" />
<value>UPDATE tabEmployee
SET EmployeeKudosCount = EmployeeKudosCount + 102</value>
</data>
<action name="sql_text" package="sqlserver">
<type name="unicode_string" package="package0" />
<value>
---- Step set 4.
SELECT 'BEFORE_Updates', EmployeeKudosCount, * FROM tabEmployee;
UPDATE tabEmployee
SET EmployeeKudosCount = EmployeeKudosCount + 102;
UPDATE tabEmployee
SET EmployeeKudosCount = EmployeeKudosCount + 1015;
SELECT 'AFTER__Updates', EmployeeKudosCount, * FROM tabEmployee;
</value>
</action>
</event>
<event name="sql_statement_starting" package="sqlserver" timestamp="2015-09-22T15:29:31.327Z">
<data name="state">
<type name="statement_starting_state" package="sqlserver" />
<value>0</value>
<text>Normal</text>
</data>
<data name="line_number">
<type name="int32" package="package0" />
<value>10</value>
</data>
<data name="offset">
<type name="int32" package="package0" />
<value>340</value>
</data>
<data name="offset_end">
<type name="int32" package="package0" />
<value>486</value>
</data>
<data name="statement">
<type name="unicode_string" package="package0" />
<value>UPDATE tabEmployee
SET EmployeeKudosCount = EmployeeKudosCount + 1015</value>
</data>
<action name="sql_text" package="sqlserver">
<type name="unicode_string" package="package0" />
<value>
---- Step set 4.
SELECT 'BEFORE_Updates', EmployeeKudosCount, * FROM tabEmployee;
UPDATE tabEmployee
SET EmployeeKudosCount = EmployeeKudosCount + 102;
UPDATE tabEmployee
SET EmployeeKudosCount = EmployeeKudosCount + 1015;
SELECT 'AFTER__Updates', EmployeeKudosCount, * FROM tabEmployee;
</value>
</action>
</event>
</RingBufferTarget>
تحرير الموارد التي يحتفظ بها Ring Buffer
عند الانتهاء من Ring Buffer الخاص بك، يمكنك إزالته وتحرير موارده بإصدار الأمر ALTERمثل ما يلي:
ALTER EVENT SESSION eventsession_gm_azuresqldb51
ON DATABASE
DROP TARGET package0.ring_buffer;
GO
تم تحديث تعريف جلسة الحدث الخاص بك، ولكن لم يتم إسقاطه. يمكنك لاحقًا إضافة مثيل آخر من Ring Buffer إلى جلسة الحدث:
ALTER EVENT SESSION eventsession_gm_azuresqldb51
ON DATABASE
ADD TARGET
package0.ring_buffer
(SET
max_memory = 500 -- Units of KB.
);
مزيد من المعلومات
الموضوع الأساسي للأحداث الموسَّعة في Azure SQL Database هو:
- اعتبارات الأحداث الموسَّعة في Azure SQL Database، والتي تقارن بعض جوانب الأحداث الموسَّعة التي تختلف بين Azure SQL Database في مقابل Microsoft SQL Server.
تتوفر موضوعات نماذج التعليمة البرمجية الأخرى للأحداث الموسَّعة على الارتباطات التالية. ومع ذلك، يجب عليك التحقق بشكل دوري من أي نموذج لمعرفة ما إذا كان النموذج يستهدف Microsoft SQL Server مقابل Azure SQL Database. ثم يمكنك أن تقرر ما إذا كانت هناك حاجة لإجراء تغييرات طفيفة لتشغيل العينة.
- نموذج التعليمة البرمجية لـ Azure SQL Database: التعليمة البرمجية الهدف لملف للأحداث الموسَّعة في Azure SQL Database