Sql-Server

隨著事件量的增加,查詢系統健康數據變得緩慢

  • October 22, 2019

我們從 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 indexonobject_name

$$ non unique $$ 我從 msdn 看到該列event_datanvarchar(max)

更新 我能夠為系統健康中的 42K 記錄重現這種情況,執行 7-8 秒,當有超過 50 萬條記錄要從系統健康中獲取時,同樣持續 50 分鐘以上

連結 -計劃 - 在顯示轉換警告的SQL2014及更高版本開始的所有版本上。

SQL 2012 上沒有出現警告,因此我使用了跟踪標誌 9481,但過程仍然很慢

毫無預警地計劃

請建議

我試圖解釋其中一個原因。

目前object_nameNon unique Clustered index.

所以當插入數據時,database engine會在每一頁中搜尋空白空間。因為數據可以儲存在任何地方。所以這個數據庫搜尋需要時間。

此外,由於它是非唯一的,優化器將在每一行中附加唯一標識符以使其唯一。這個索引成本會增加。

因此,不僅插入會很慢。而且在檢索數據時,由於索引成本,索引將永遠不會被使用。

所以選擇Ever Increasing Column,Selective enoughUniquecolumn light data typeasClustered 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 indexobject_name.

這裡database engine將始終知道數據將附加在頁面末尾,因為id int identity(1,1) primary key.So insert 會很快。

引用自:https://dba.stackexchange.com/questions/251068