我在工作中遇到了一个非常特殊的性能问题!

在我们使用的系统中,有一个表保存有关当前工作流程的信息。其中一个字段包含一个电子表格,其中包含有关流程的元数据(不要问我为什么!!不,我不能改变它!!)

问题在于该电子表格存储在 SQL Server 2005 的 IMAGE 字段中(在具有 SQL 2000 兼容性的数据库集内)。

该表目前有 22K+ 行,甚至还有一个像这样的简单查询:

SELECT TOP 100 *
  FROM OFFENDING_TABLE

在查询分析器中检索数据需要 30 秒。

我正在考虑更新对 SQL 2005 的兼容性(一旦我被告知该应用程序可以处理它)。

我想的第二件事是将列的数据类型更改为 varbinary(max) 但不知道这样做会不会影响申请。

我正在考虑的另一件事是使用 sp_tableoption 设置 large value types out of row1 就目前而言 0, ,但我不知道这样做是否会提高性能。

有谁知道在这种情况下如何提高性能?


编辑以澄清

我的问题是我无法控制应用程序向 SQL Server 提出的请求,我对其进行了一些反思(该应用程序是一个 .NET 1.1 网站),并且它使用了有问题的字段来处理一些我不知道的内部内容这是什么。

我需要提高该表的整体性能。

有帮助吗?

解决方案

我建议你看看有问题的表格布局健康:

select * from sys.dm_db_index_physical_stats(
       db_id(), object_id('offending_table'), null, null, detailed);

东西太多寻找是avg_fragmentation_in_percent,PAGE_COUNT,avg_page_space_used_in_percent,record_count和ghost_record_count。像高碎裂,或大量的虚影记录,或低页使用百分比线索表明的问题和事情可以仅通过从头重建索引(即表。)而得到提高相当多的:

ALTER INDEX ALL ON offending_table REBUILD;

我说这考虑到你不能改变表,也不应用。如果你能够改变的表和应用程序,你已经得到的建议是很好的意见(不要用“*”,不要”选择瓦特/ OA条件下,使用新的varbinary(最大)等类型等)

我也想看看进入性能计数器平均页面一生来了解如果系统内存饿死。从你的symptomps描述的系统看起来IO约束这使我觉得有一点页面缓存回事,更多的RAM可以帮助,以及更快的IO subsytem。在SQL 2008系统我也建议开启网页压缩,但是2005年你不能。结果 而且,只是可以肯定,确保查询不被从应用程序本身,即争。查询不花90%的有30秒来等待一个行锁。看看 sys.dm_exec_requests视图查询运行时,看到WAIT_TIME ,wait_type和wait_resource。难道PAGEIOLATCH_XX?或者是锁吗?此外,如何是 sys.dm_os_wait_stats 在你的服务器上,是什么顶部的等待原因?

其他提示

首先 - 永远不要做 SELECT * 在生产代码中 - 报告与否。

您有三个基本选择:

  • 如果并不总是需要该 blob 字段,请将其移至单独的表中;可能不切实际,因为您提到您无法更改架构

  • 更加小心你的 SELECT 语句仅选择您真正需要的字段 - 并省略 blob 字段

  • 看看是否可以限制您的查询以包含 WHERE 子句并找到一种方法来优化查询计划,例如向表添加合适的索引(如果可以的话)

没有神奇的“让这个更快”开关 - 但您可以优化查询或优化表布局。两者都有帮助。如果您无法更改任何内容 - 既不能更改表布局,也不能添加索引,也不能更改查询,那么恐怕您将很难优化任何内容......

仅将该字段更改为 VARBINARY(MAX) 根本不会改变任何内容 - 仅更改数据类型不会带来性能改进。

一个简单的回答是只做针对多个行选择当字段返回不包括有问题的像场,即没有SELECT *。如果你想要像字段的值,检索根据具体情况逐案。

设置大值类型出行选择的一定要帮助提高性能。该行规模将显著较小,SQL Server可以做很多较少的物理读取得到throught表。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top