【问题标题】:SQL Table causes slow running QueriesSQL 表导致查询运行缓慢
【发布时间】:2015-01-12 19:18:18
【问题描述】:

我有一个 sql 表,它有大约 6,000 条记录,每条记录 17 列。如果我对表进行基本搜索(即从 table_Orders 中选择 *)...返回所有记录需要 1.5 分钟!我使用这个表运行的任何查询也很慢。我已重新索引表,因此碎片不是问题。该表中有 2 个 nvarchar(max) 列,用于存储 xml 数据。返回没有这些列的表非常快(不到 1 秒)。所以,我猜这是阻碍查询的xml数据。我能做些什么来加快使用带有 xml 的列的查询的性能吗?任何见解将不胜感激。我通常不使用 sql 中的 xml,所以我什至不知道从哪里开始。

【问题讨论】:

  • 问题只是列的大小。您可以从中提取信息(甚至使用索引)。或者,根本不退货。
  • 由于 (MAX) 数据类型可以存储多达 2GB 的数据,并且您显然在这些列中存储了相当数量的数据,因此这些列的性能不佳,我会简单地将它们放在单独的表中(使用外键)。您不能索引(最大)数据类型,因此不要通过添加不必要的索引来浪费您的资源。
  • 如果这是 XML 数据,我很想知道为什么这些列是 nvarchar。 XML 是 ascii 的一个子集——没有理由使用除 UTF-8 之外的任何东西。您可能应该将它们更改为varchar(max)
  • 你在这张表上有什么样的聚集索引(如果有的话)?
  • 注意:设计更改不是这个问题的答案。

标签: sql sql-server xml performance


【解决方案1】:

这听起来像是网络速度,而不是搜索时间。即使是 6000 行的表扫描也只需要几分之一秒 - 搜索所有行。但是,将这些行返回给客户端......您正在下载所有这些数据,因此当您检索大量数据时您会看到不同之处。这与“查询性能”无关,除非您可以使网络更快或传输更少的数据,否则您无能为力。

您可以通过发出查询来搜索聚集索引中的键来测试这一点。假设您在 RowID 上有一个聚集索引...

select RowId, NonXmlColumn where RowId = 3 -- or some other reasonable key
select RowId, XmlColumn where RowId = 3

这些查询的搜索时间将相同。因此,任何速度上的差异都可以归因于网络。

【讨论】:

  • 我们可能遇到了网络问题。我尝试了两个查询:
    select Id, NonXmlColumn from table_Orders where autonumber > 3000<br/> select Id, XmlColumn from table_Orders where autonumber > 3000
    第一个查询运行了 1 秒……第二个查询运行了 1 分钟。
  • 结果如何?请记住,此测试仅当您在“自动编号”字段上有索引时才有效,该索引不会“覆盖”其他字段。
  • hmmm...好吧...我调整了查询​​以在索引字段上进行搜索。结果之间只有3秒的差异。这是否意味着我应该索引我的 xml 列?
  • 查看每一个的查询计划,看看是否有差异。两个查询都应该是两个步骤:聚集索引 SEEK 和 SELECT。如果它们看起来都这样,那么是的,唯一影响时间的是返回数据的大小,索引将无济于事。查询尽可能快地进行,而您的瓶颈是网络。
  • 感谢@Jasmine 的建议。这可能是一个网络问题,这绝对超出了我的知识范围。我会让我们的网络团队知道调查结果。现在,我将致力于将我需要的 xml 数据转换为不同的表格格式。
【解决方案2】:

我不会将这些数据存储在表中。如果我这样做了,我不会存储在 VARCHAR 中。不要听起来像个混蛋。

SQL Server 有一个xml 数据类型:http://msdn.microsoft.com/en-us/library/hh403385.aspx 它说有限制。您应该看到适用于您的方案的内容。

如果您需要保留 XML - 将其粘贴到其他位置并从中提取您需要搜索的任何字段。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-20
    • 1970-01-01
    • 2021-05-16
    相关资源
    最近更新 更多