2008-10-20 64 views
2

我有一个存储过程,当前正在执行复杂的提取,使用时经常超时。我部门提出的解决方案是简单地增加超时时间长度;我真的不想这样做。我想重构这个sproc,但是因为它太复杂和没有记录(yay遗留系统),我担心我重构我的结果不是执行更高效的相同功能。重构存储过程时是否有任何策略可用,以确保在较短时间内执行相同的功能?重构存储过程

这是一个Microsoft SQL Server 2005存储过程。

回答

4

我过去一直面对这种情况。最好的办法是创建一个简单的C#或VB .Net应用程序。当你重构sp时,给它一个新的名字。使用应用程序调用旧的和新的sp。然后比较两个sp的输出,以确保它们以相同的顺序返回完全相同的值。

您可能想要测试各种各样的输入参数,以确保重构没有修改业务逻辑。

此外,使用NUnit可以帮助简化这项任务。

当我开始现在的职位时,我得到一个数据库,必须修改一个新的模式。它需要改变超过100个sp。使用我所描述的应用程序,我能够合理确信我的一项修改并未打破业务规则。

你说得对,只是增加超时是错误的第一个答案。尽可能地改进sp,然后在必要时增加超时。

3

通常,超时发生在单个SQL语句上。将proc分解成单独的语句,可能通过有效地使用临时表,所以你不想在单个块中做太多事情。通过这样做,您还可以磨合您的性能瓶颈,并可能在需要时确定一些有用的索引。

3

我遇到的低效率存储过程最常见的原因是标量类型操作的流行,而不是基于集合的操作。大多数RDBMS系统(Oracle,SQL Server,MySQL等)在处理大量数据时效率更高,而不是多次重复进行单个操作。对一百万行数据执行一次操作比每行执行一百万次操作更有效。

在试图确定这些类型的瓶颈之后(通常首先查看函数调用),然后我会建议查看您引用的表上的索引策略。根据您选择的RDBMS,您可能有一些向导类型的功能,可以帮助您根据示例工作负载发现适当的索引结构。

您使用的数据库是?这可能有助于微调我的一些建议。

+0

我将服务器规范添加到问题本身。感谢您的回应。 – ddc0660 2008-10-20 18:41:52

2

使用SQL Server Profiler来研究当前SP的运行方式;它将突出低效率,并允许您只针对那些特定区域开始,同时保留更高性能的位。然后,您可以再次在修订的SP上使用分析器来比较性能。

我会回应Gunny的建议,仔细研究函数调用 - 在基于集合的操作中,这些可以对性能产生真正的影响。过去我通过剥离单个UDF并在线复制逻辑,取得了巨大的性能提升。