如何提高带有图像字段的SQL Server表中的性能?
我在工作中遇到了一个非常特殊的性能问题!如何提高带有图像字段的SQL Server表中的性能?
在我们使用的系统中有一个表格,其中包含有关当前工作流程过程的信息。其中一个字段包含一个电子表格,其中包含关于该过程的元数据(不要问我为什么!!并且不能改变它!一个SQL Server 2005(在具有SQL 2000兼容性的数据库集内)。
该表目前有22K +行和偶数一个简单的查询是这样的:
SELECT TOP 100 *
FROM OFFENDING_TABLE
需要30秒来检索查询分析器的数据。
我在考虑更新SQL 2005的兼容性(一旦我被告知应用程序可以处理它)。
我在想的第二件事是将列的数据类型更改为varbinary(max)
,但我不知道这样做是否会影响应用程序。
,我正在考虑的另一件事情就是用sp_tableoption
到large value types out of row
设置为1
,因为它是目前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;
我认为这是考虑到你无法更改表格和应用程序。如果你能够改变表和应用程序,你已经得到的建议是好建议(不要使用'*',不要选择无条件,使用新的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如何,最重要的等待原因是什么?
一个简单的答案是,只有当返回的字段不包含有问题的图像字段,即没有SELECT *时,才对多行进行SELECT。如果您想要图像字段的值,请根据具体情况进行检索。
设置大值类型出行选择的一定要帮助提高性能。行大小将显着缩小,SQL Server可以通过少得多的物理读取来完成表格。
首先 - 千万不要在生产代码中做SELECT *
- 报告与否。
你有三个基本的选择:
此举BLOB字段伸到如果并不总是需要它一个单独的表;可能不是实际的,因为你提到你不能更改架构
更加小心你
SELECT
语句只选择那些你真正需要的领域 - 而忽略BLOB字段看看你是否可以将查询限制包括一个
WHERE
子句并找到一种方法来优化查询计划,例如添加合适的索引表(如果你能)
没有什么神奇的“使这个快”开关 - 但你可以优化您的查询或优化表布局。都有帮助。如果你不能改变任何东西 - 无论是表布局,也不添加索引,也不会改变查询,你将很难优化任何东西,恐怕......
只是将字段更改为VARBINARY(MAX)根本不会改变任何东西 - 只是通过改变数据类型而不会改进性能。