Sql-Server
隨著事件量的增加,查詢系統健康數據變得緩慢
我們從 SQL 伺服器獲取系統健康 XE 中的數據並載入到表中以供以後查詢。
部分變得非常緩慢的陳述是
INSERT INTO TABLE1 ( [object_name] ,[col1) ) SELECT [Object_name], CAST (event_data as XML) AS eventcol1 FROM sys.fn_xe_file_target_read_file (N'D:\SQL\system_health*.XEL', NULL,NULL,NULL)
獲取超過 200k 的事件時,上面的速度真的很慢
表結構是
CREATE TABLE [dbo].[Table_1]( [object_name] [nvarchar](60) NOT NULL, [col1] [xml] NULL ) ON [DEMO] TEXTIMAGE_ON [DEMO] GO
表上唯一的索引是
clustered index
onobject_name
$$ non unique $$ 我從 msdn 看到該列
event_data
是nvarchar(max)
更新 我能夠為系統健康中的 42K 記錄重現這種情況,執行 7-8 秒,當有超過 50 萬條記錄要從系統健康中獲取時,同樣持續 50 分鐘以上
連結 -計劃 - 在顯示轉換警告的SQL2014及更高版本開始的所有版本上。
SQL 2012 上沒有出現警告,因此我使用了跟踪標誌 9481,但過程仍然很慢
請建議
我試圖解釋其中一個原因。
目前
object_name
是Non unique Clustered index
.所以當插入數據時,
database engine
會在每一頁中搜尋空白空間。因為數據可以儲存在任何地方。所以這個數據庫搜尋需要時間。此外,由於它是非唯一的,優化器將在每一行中附加唯一標識符以使其唯一。這個索引成本會增加。
因此,不僅插入會很慢。而且在檢索數據時,由於索引成本,索引將永遠不會被使用。
所以選擇
Ever Increasing Column
,Selective enough
和Unique
columnlight data type
asClustered index
CREATE TABLE [dbo].[Table_1]( id int identity(1,1) primary key [object_name] [nvarchar](60) NOT NULL, [col1] [xml] NULL ) ON [DEMO] TEXTIMAGE_ON [DEMO] GO
創建
Non clustered index
於object_name
.這裡
database engine
將始終知道數據將附加在頁面末尾,因為id int identity(1,1) primary key
.So insert 會很快。