我们如何维护大型T-SQL程序
我将继承一组大型和复杂的存储过程,这些存储过程每月对非常大的数据集进行处理。
我们正在调试它们,以便它们与VB6中编写的原始过程匹配。他们之所以决定在t-sql中重新编写它们,是因为vb进程需要几天的时间,而这个新进程需要数小时。
所有这些都很好,但是我如何才能使这些大量的t-sql代码(1.5k +行)甚至可以远程读取/维护。
任何使t-sql不会引起头痛的经验都是非常欢迎的。
解决方案
回答
首先,创建一个包含.sql文件的目录,并在其中进行维护。将这组.sql文件添加到版本控制系统中。 SVN运作良好。有一个工具可以将这些加载到数据库中,从而覆盖所有现有数据库。
有一个测试数据库,以及基线报告,显示每月处理的结果。测试还应采用受版本控制的.sql文件的形式。
现在,我们可以根据需要尽可能多地重构proc,然后运行测试以确认功能正确。
回答
我们可以做的一件事情是拥有一个自动化脚本,用于存储对源代码管理的所有更改,以便我们可以查看对过程的更改(使用以前和当前版本的差异)
回答
对于格式化/漂亮的SQL,我已经成功使用了http://www.sqlinform.com/免费的在线版本(我们可以试用)和桌面版本。
SQLinForm is an automatic SQL code formatter for all major databases ( ORACLE, SQL Server, DB2 / UDB, Sybase, Informix, PostgreSQL, MySQL etc) with many formatting options.
回答
一定要从重新格式化代码(尤其是缩进格式)开始。
然后模块化SQL。在自己的独立文件中将大块放入较小的,描述性命名的过程和函数中。我发现仅此一项就可以很好地增进我对大型SQL文件的理解。
回答
尝试尽可能地对SQL进行模块化,并具有一组测试,这些测试将使我们能够在需要时维护,重构和添加功能。我曾经很高兴继承一个存储过程,该过程总共有5000行,但我仍然对此感到恶梦。项目结束后,我打印出了存储的过程,笑出声来破坏了过程中的X树。在我们公司之一的每周站立会议期间,我将其首尾相连地布置,并伸展了整个建筑物的长度。以此为例,说明如何不编写和维护存储过程。
回答
ApexSQLScript是用于编写整个数据库脚本的强大工具,我们可以将其检入源代码管理并管理更改。
我还发现,对sproc进行持续记录可以使我们使用sys.sql_modules中有关源代码的数据提取有关它们的信息,我们可以使用标记或者任何有助于子系统的文档。
另外,使用架构(甚至多个数据库),这确实有助于将数据库分为逻辑单元并指出体系结构问题。
就大型代码而言,我最近发现SQL2005 CTE功能在管理带有大量嵌套查询(甚至不是递归查询)的代码时非常有用。可以声明和建立CTE,而不是管理一堆嵌套和缩进,然后在最终语句中使用它们。这也有助于重构,因为删除冗余的嵌套查询和列似乎容易得多。
存储的Procs和UDF对于管理大型代码库和消除黑角至关重要。我还没有发现视图很有用,因为它们不可参数化(如果结果集很小,则在这些情况下可以使用UDF)。
回答
它绝对不是免费的,但是为了以一致的方式保持T-SQL的格式,Redgate Software的SQL Prompt非常方便。只要我们proc的语法正确,几次击键(Ctrl + K,Y)都会立即将其重新格式化。这些选项使我们可以控制SQL的格式。