亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

SQL Server像MySQL一樣擁有慢查詢?nèi)罩镜牟僮鞣椒?Slow Query Log慢日志)

 更新時(shí)間:2024年07月29日 10:11:50   作者:樺仔  
SQL Server一直以來(lái)被人詬病的一個(gè)問(wèn)題是缺少了像MySQL的慢日志功能,程序員和運(yùn)維無(wú)法知道數(shù)據(jù)庫(kù)過(guò)去歷史的慢查詢語(yǔ)句,本文介紹了利用SQL Server的擴(kuò)展事件捕獲慢查詢語(yǔ)句的功能,也就是我們常說(shuō)的開(kāi)源數(shù)據(jù)庫(kù)的慢日志,感興趣的朋友一起看看吧

SQL Server一直以來(lái)被人詬病的一個(gè)問(wèn)題是缺少了像MySQL的慢日志功能,程序員和運(yùn)維無(wú)法知道數(shù)據(jù)庫(kù)過(guò)去歷史的慢查詢語(yǔ)句。

因?yàn)镾QLServer默認(rèn)是不捕獲過(guò)去歷史的長(zhǎng)時(shí)間阻塞的SQL語(yǔ)句,導(dǎo)致大家都認(rèn)為SQL Server沒(méi)有歷史慢日志功能

其實(shí)SQLServer提供了擴(kuò)展事件讓用戶自己去捕獲過(guò)去歷史的長(zhǎng)時(shí)間阻塞的SQL語(yǔ)句,但是因?yàn)椴皇悄J(rèn)出廠配置并且設(shè)置擴(kuò)展事件對(duì)初級(jí)用戶有一定難度,這里可以說(shuō)不得不是一個(gè)遺憾,希望后續(xù)版本的SQL Server可以默認(rèn)設(shè)置好慢日志的相關(guān)擴(kuò)展事件,用初級(jí)用戶也可以快速上手。

話不多說(shuō),這個(gè)文章主要講述設(shè)置慢日志的擴(kuò)展事件的步驟,并且把慢日志提供第三方程序讀取以提供報(bào)表功能。

擴(kuò)展事件介紹

SQL Server 擴(kuò)展事件(Extended Events,簡(jiǎn)稱 XE)是從 SQL Server 2008 開(kāi)始引入的一種輕量級(jí)、高度可定制的事件處理系統(tǒng),
旨在幫助數(shù)據(jù)庫(kù)管理員和開(kāi)發(fā)人員更好地監(jiān)控、調(diào)試和優(yōu)化 SQL Server 的性能。
擴(kuò)展事件可以用于捕獲和分析 SQL Server 內(nèi)部發(fā)生的各種事件,以便識(shí)別和解決性能瓶頸和問(wèn)題。

擴(kuò)展事件優(yōu)點(diǎn)包括輕量級(jí)、統(tǒng)一事件處理框架和集成性。事件設(shè)計(jì)對(duì)系統(tǒng)性能影響最小,確保在高負(fù)載環(huán)境下也能穩(wěn)定運(yùn)行。
擴(kuò)展事件可以與 SQL Server Profiler 和 SQL Server Audit 結(jié)合使用,為用戶提供全面的診斷和監(jiān)控工具。

實(shí)驗(yàn)步驟

創(chuàng)建環(huán)境所需的數(shù)據(jù)庫(kù)和表

--窗口1--建表USE testdbGOCREATE TABLE Account(id INT, name NVARCHAR(200))INSERT INTO [dbo].[Account]SELECT 1,'Lucy'UNION ALLSELECT 2,'Tom'UNION ALLSELECT 3,'Marry'--查詢SELECT * FROM [dbo].[Account]

 創(chuàng)建擴(kuò)展事件

 輸入擴(kuò)展事件名稱

 不要使用模版

事件庫(kù)搜索block,選擇blocked_process_report

確認(rèn)事件

選擇你需要的字段

這里選擇client_app_name、client_hostname、database_id、database_name、plan_handle、query_hash、request_id、session_id、sql_text字段

當(dāng)然你可以勾選自己想要的字段,這里只是拋磚引玉

續(xù)

直接下一步

這里需要注意的是,擴(kuò)展事件日志不能全量保存,所以用戶需要考慮好保留多長(zhǎng)時(shí)間的擴(kuò)展事件,假設(shè)一天可以產(chǎn)生的擴(kuò)展事件大小為1GB,那么每個(gè)擴(kuò)展事件文件大小1GB,最多5個(gè)擴(kuò)展事件文件意味著你不能查詢到5天之前的數(shù)據(jù)

比如你不能查詢到前面第8天的擴(kuò)展事件,擴(kuò)展事件是滾動(dòng)利用的。

擴(kuò)展事件創(chuàng)建情況預(yù)覽

小提示:你可以點(diǎn)擊script生成這個(gè)擴(kuò)展事件的create腳本,那么其他服務(wù)器就不用這樣用界面去創(chuàng)建這么繁瑣了。

生成出來(lái)的擴(kuò)展事件

CREATE EVENT SESSION [slowquerylog]
ON SERVER
    ADD EVENT sqlserver.blocked_process_report
    (ACTION
     (
         sqlserver.client_app_name,
         sqlserver.client_hostname,
         sqlserver.database_id,
         sqlserver.database_name,
         sqlserver.plan_handle,
         sqlserver.query_hash,
         sqlserver.request_id,
         sqlserver.session_id,
         sqlserver.sql_text
     )
    )
    ADD TARGET package0.event_file
    (SET filename = N'E:\DBExtentEvent\slowquerylog.xel')
WITH
(
    STARTUP_STATE = ON
);
GO

完成

你可以勾選

a.擴(kuò)展事件創(chuàng)建完成之后立刻啟動(dòng)

b.查看實(shí)時(shí)捕獲的數(shù)據(jù)

立刻啟動(dòng)擴(kuò)展事件

一定要設(shè)置locked process threshold,否則無(wú)辦法捕獲慢SQL語(yǔ)句,這個(gè)選項(xiàng)類似于MySQL的long_query_time參數(shù)

locked process threshold是SQL Server2005推出的一個(gè)選項(xiàng),下面設(shè)置阻塞10秒就會(huì)記錄

--窗口2
--locked process threshold是SQL Server2005推出的一個(gè)選項(xiàng)
--設(shè)置阻塞進(jìn)程閾值
sp_configure 'show advanced options', 1 ;  
GO  
RECONFIGURE ;  
GO  
sp_configure 'blocked process threshold', 10 ;   --10秒
GO  
RECONFIGURE ;  
GO

執(zhí)行一個(gè)update語(yǔ)句,不要commit

--窗口3
USE testdb;
GO
BEGIN tran
update Account
set name ='Test'
where ID = 2
--commit

查詢數(shù)據(jù)

-- 窗口4
USE testdb;
GO
-- 這個(gè)查詢會(huì)被窗口3中的事務(wù)阻塞
SELECT * FROM Account
WHERE ID = 2

執(zhí)行完畢之后,你可以看到擴(kuò)展事件已經(jīng)記錄下來(lái)了 

雙擊查看詳細(xì)的會(huì)話里面的語(yǔ)句

可以很清楚的看到誰(shuí)是被blocked的語(yǔ)句,誰(shuí)是主動(dòng)blocking的語(yǔ)句也就是源頭

同時(shí)可以看到擴(kuò)展事件已經(jīng)記錄到xel文件

使用其他編程語(yǔ)言制作慢查詢?nèi)罩緢?bào)表

微軟提供了使用 SQL Server Management Studio (SSMS) 和 T-SQL 查詢擴(kuò)展事件 XEL 文件內(nèi)容的 API。

我們可以使用 sys.fn_xe_file_target_read_file 函數(shù)來(lái)讀取 XEL 文件中的內(nèi)容。
然后,你可以將這些數(shù)據(jù)導(dǎo)出為其他編程語(yǔ)言可以處理的格式

SQL語(yǔ)句

-- 查詢擴(kuò)展事件 XEL 文件內(nèi)容
SELECT 
    event_data.value('(event/@name)[1]', 'VARCHAR(50)') AS event_name,
    event_data.value('(event/@timestamp)[1]', 'DATETIME2') AS event_timestamp,
    event_data.value('(event/data[@name="duration"]/value)[1]', 'INT') AS duration,
    event_data.value('(event/action[@name="client_app_name"]/value)[1]', 'VARCHAR(255)') AS client_app_name,
    event_data.value('(event/action[@name="client_hostname"]/value)[1]', 'VARCHAR(255)') AS client_hostname,
    event_data.value('(event/action[@name="database_name"]/value)[1]', 'VARCHAR(255)') AS database_name,
    event_data.value('(event/action[@name="sql_text"]/value)[1]', 'VARCHAR(MAX)') AS sql_text
FROM 
    sys.fn_xe_file_target_read_file('E:\DBExtentEvent\slowquerylog*.xel', NULL, NULL, NULL) AS t
CROSS APPLY 
    t.event_data.nodes('event') AS XEvent(event_data);

使用 Python 讀取 XEL 文件內(nèi)容
使用 pandas 庫(kù)和pyodbc驅(qū)動(dòng)程序從 SQL Server 導(dǎo)出數(shù)據(jù)并在 Python 中進(jìn)行處理。
以下是一個(gè)示例腳本

import pyodbc
import pandas as pd
# 設(shè)置數(shù)據(jù)庫(kù)連接
conn = pyodbc.connect(
    'DRIVER={SQL Server};'
    'SERVER=your_server_name;'
    'DATABASE=your_database_name;'
    'UID=your_username;'
    'PWD=your_password'
)
# 查詢 XEL 文件內(nèi)容
query = """
SELECT 
    event_data.value('(event/@name)[1]', 'VARCHAR(50)') AS event_name,
    event_data.value('(event/@timestamp)[1]', 'DATETIME2') AS event_timestamp,
    event_data.value('(event/data[@name="duration"]/value)[1]', 'INT') AS duration,
    event_data.value('(event/action[@name="client_app_name"]/value)[1]', 'VARCHAR(255)') AS client_app_name,
    event_data.value('(event/action[@name="client_hostname"]/value)[1]', 'VARCHAR(255)') AS client_hostname,
    event_data.value('(event/action[@name="database_name"]/value)[1]', 'VARCHAR(255)') AS database_name,
    event_data.value('(event/action[@name="sql_text"]/value)[1]', 'VARCHAR(MAX)') AS sql_text
FROM 
    sys.fn_xe_file_target_read_file('E:\DBExtentEvent\slowquerylog*.xel', NULL, NULL, NULL) AS t
CROSS APPLY 
    t.event_data.nodes('event') AS XEvent(event_data);
"""
# 使用 pandas 讀取數(shù)據(jù)
df = pd.read_sql(query, conn)
# 關(guān)閉數(shù)據(jù)庫(kù)連接
conn.close()
# 顯示數(shù)據(jù)
print(df)
# 將數(shù)據(jù)保存為 CSV 文件
df.to_csv('slowquerylog.csv', index=False)

這里的一個(gè)問(wèn)題是,你不能直接讀取XEL文件,本身XEL文件是一個(gè)二進(jìn)制文件,必須掛接到在線SQL Server實(shí)例(任何SQL Server實(shí)例都可以,不一定是生產(chǎn)庫(kù)的那一臺(tái)SQL Server實(shí)例,只要是XEL文件所在的機(jī)器)

另外一個(gè)方法是使用 PowerShell 中的 Microsoft.SqlServer.XEvent.Linq.QueryableXEventData 類直接解析 XEL 文件,不用掛接到SQL Server實(shí)例

直接讀取 XEL 文件的內(nèi)容,然后導(dǎo)出CSV文件,讓其他編程語(yǔ)言處理

Step 1: 創(chuàng)建 PowerShell 腳本 ReadXELFile.ps1

# 加載所需的程序集
Add-Type -Path "C:\Program Files\Microsoft SQL Server\140\SDK\Assemblies\Microsoft.SqlServer.XEvent.Linq.dll"
# 定義XEL文件路徑
$xelFilePath = "E:\DBExtentEvent\slowquerylog*.xel"
# 創(chuàng)建XEventData對(duì)象
$events = New-Object Microsoft.SqlServer.XEvent.Linq.QueryableXEventData($xelFilePath)
# 初始化一個(gè)空數(shù)組來(lái)存儲(chǔ)事件數(shù)據(jù)
$eventDataList = @()
# 遍歷每個(gè)事件并提取所需的字段
foreach ($event in $events) {
    $eventData = New-Object PSObject -Property @{
        EventName      = $event.Name
        Timestamp      = $event.Timestamp
        Duration       = $event.Fields["duration"].Value
        ClientAppName  = $event.Actions["client_app_name"].Value
        ClientHostname = $event.Actions["client_hostname"].Value
        DatabaseName   = $event.Actions["database_name"].Value
        SqlText        = $event.Actions["sql_text"].Value
    }
    $eventDataList += $eventData
}
# 將事件數(shù)據(jù)導(dǎo)出為CSV文件
$eventDataList | Export-Csv -Path "E:\DBExtentEvent\slowquerylog.csv" -NoTypeInformation

Step 2: Python 腳本 ReadCSVFile.py讀取導(dǎo)出的 CSV 文件

import pandas as pd
# 定義CSV文件路徑
csv_file_path = "E:\\DBExtentEvent\\slowquerylog.csv"
# 使用pandas讀取CSV文件
df = pd.read_csv(csv_file_path)
# 顯示數(shù)據(jù)
print(df)

這個(gè)方法需要使用PowerShell ,對(duì)于PowerShell 不熟悉的朋友也是一個(gè)問(wèn)題

總結(jié)

本文介紹了利用【SQL Server的擴(kuò)展事件】捕獲慢查詢語(yǔ)句的功能,也就是我們常說(shuō)的開(kāi)源數(shù)據(jù)庫(kù)的慢日志

另外,一定要設(shè)置“blocked process threshold”參數(shù),否則設(shè)置了擴(kuò)展事件也沒(méi)有效果

總體來(lái)說(shuō),SQL Server作為一個(gè)企業(yè)級(jí)數(shù)據(jù)庫(kù),確實(shí)不像MySQL這種開(kāi)源數(shù)據(jù)庫(kù)簡(jiǎn)單直接

需要設(shè)置比較繁瑣的擴(kuò)展事件,對(duì)新手用戶不太友好,門(mén)檻比較高,但是因?yàn)閿U(kuò)展事件功能非常強(qiáng)大

除了捕獲慢查詢語(yǔ)句還可以捕獲死鎖,索引缺失等性能問(wèn)題,所以這個(gè)是在所難免的

本文版權(quán)歸作者所有,未經(jīng)作者同意不得轉(zhuǎn)載。

到此這篇關(guān)于如何讓SQL Server像MySQL一樣擁有慢查詢?nèi)罩荆⊿low Query Log慢日志)的文章就介紹到這了,更多相關(guān)SQL Server慢查詢?nèi)罩緝?nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論