如何使用图像字段提高SQL Server表的性能?

Pau*_*tos 6 sql-server varbinary imagefield

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

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

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

这个表目前有22K +行甚至是这样的简单查询:

SELECT TOP 100 *
  FROM OFFENDING_TABLE
Run Code Online (Sandbox Code Playgroud)

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

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

我想的第二件事是将列的数据类型更改为varbinary(max)但我不知道这样做是否会影响应用程序.

我正在考虑的另一件事是使用sp_tableoption设置large value types out of row1,因为它是目前0的,但我没有任何信息,如果这样做将提高性能.

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


编辑澄清

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

我需要提高这个表的整体性能.

Rem*_*anu 4

我建议您检查一下有问题的表布局健康状况:

select * from sys.dm_db_index_physical_stats(
       db_id(), object_id('offending_table'), null, null, detailed);
Run Code Online (Sandbox Code Playgroud)

还要查找的内容有 avg_fragmentation_in_percent、page_count、avg_page_space_used_in_percent、record_count 和 Ghost_record_count。高碎片、大量幽灵记录或低页面使用百分比等提示表明存在问题,只需从头开始重建索引(即表)即可大大改善情况:

ALTER INDEX ALL ON offending_table REBUILD;
Run Code Online (Sandbox Code Playgroud)

我这样说是考虑到您无法更改表格或应用程序。如果您能够更改表格和应用程序,那么您已经得到的建议是很好的建议(不要使用“*”,不要选择无条件,使用较新的 varbinary(max) 类型等) 。

我还会查看性能计数器中的平均页面生命周期,以了解系统是否内存不足。根据您对症状的描述,系统看起来受 IO 限制,这让我认为几乎没有页面缓存,更多的 RAM 以及更快的 IO 子系统可能会有所帮助。在 SQL 2008 系统上,我还建议打开页面压缩,但在 2005 上则不能。
而且,为了确保这一点,请确保查询不会被应用程序本身的争用所阻止,即。该查询不会花费这 30 秒中的 90% 来等待行锁。在查询运行时查看sys.dm_exec_requests ,查看 wait_time、wait_type 和 wait_resource。是 PAGEIOLATCH_XX 吗?或者它是一把锁?另外,您的服务器中的sys.dm_os_wait_stats情况如何,最主要的等待原因是什么?