首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >随着事件量的增加,查询系统健康数据的速度变慢。

随着事件量的增加,查询系统健康数据的速度变慢。
EN

Database Administration用户
提问于 2019-10-15 00:30:18
回答 2查看 331关注 0票数 1

我们从SQL服务器获取系统健康XE中的数据,并将其加载到表中供以后查询。

其中一部分语句变得相当慢,

代码语言:javascript
复制
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)

当获取超过200 k的事件时,上面的速度是非常慢的。

表结构

代码语言:javascript
复制
CREATE TABLE [dbo].[Table_1](
    [object_name] [nvarchar](60) NOT NULL,
    [col1] [xml] NULL
) ON [DEMO] TEXTIMAGE_ON [DEMO]
GO

表中唯一的索引是clustered indexon object_name 非唯一

我从msdn中看到列event_datanvarchar(max)

更新我可以在系统健康中复制42K记录的这种情况,运行时间为7-8秒,当有超过50万条记录要从系统健康状况中获取时,同样的情况也要超过50分钟。

链接- PLan--在所有启动SQL2014及以上版本的版本上都会显示转换警告。

警告不会出现在SQL 2012上,因此我使用了跟踪标志9481,但是进程仍然很慢。

毫无预兆地计划

请建议

EN

回答 2

Database Administration用户

回答已采纳

发布于 2019-10-22 10:58:35

我试着解释其中一个原因。

目前,object_nameNon unique Clustered index

因此,当数据被插入时,database engine将搜索每个page.Because数据中的空空间,可以存储任何where.So --数据库搜索将需要时间。

另外,由于它是非唯一的,优化器将在每一行中附加唯一标识符,使其unique.This索引成本增加。

因此,不仅插入将是slow.Also,而检索数据索引将永远不会使用,因为索引成本。

因此,选择Ever Increasing ColumnSelective enoughUniquelight data type列作为Clustered index

代码语言:javascript
复制
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插入速度很快。

票数 1
EN

Database Administration用户

发布于 2019-10-21 21:16:44

你应该去看看这是如何更快地分解扩展事件XML.

要旨是

  • 将XML放入变量中。
  • 将XML行分解为临时表。

另外,见下面马丁·史密斯的回答。

票数 2
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/251068

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档