【发布时间】:2012-03-28 17:05:52
【问题描述】:
我们的大型应用程序(VB.Net,Framework 3.5)从一开始就或多或少地使用 SQL Server 开发,并且仅使用 SQL Server。当然,有一天有人把它卖给了一个客户,并承诺我们可以让它在 Oracle(10g 及更高版本)上运行,现在它可以运行了,但是我们遇到了相当大的性能问题。
这是因为几乎所有 SQL(包含在应用程序代码中)都在表单的参数化查询中
SELECT Col1, Col2, Col3 FROM TableName WHERE IdCol = @EntityId
然后将其与参数名称数组、类型数组和值数组一起传递给我们的数据访问层,然后使用 Enterprise Library 5 执行以处理实际连接等。
这个项目开始的时候,有人意识到Oracle需要表单中的参数
:EntityId
并决定与其尝试查找和重写 SQL 的每一点(仅此应用程序就有大约一百万个 LOC,套件中还有其他),不如添加一个在执行查询之前调用的函数在查询和参数名称数组中用 : 替换 @。它还删除了“WITH NOLOCK”、方括号并替换了连接字符和其他 SQL Server 使用但 Oracle 没有使用的此类人工制品。当然,问题在于字符串搜索和替换成本很高,并且在应用程序中的一个简单操作中,有一次会按顺序执行 2,000 多个简单查询。对于 SQL Server,这完全不需要时间,但对于 Oracle 平台,则需要 20-30 秒。
理想情况下,我想重新编写大量代码以淘汰低效/低效的代码,并设计和修复不可靠的架构,并用 nHibernate 或实体框架替换大部分代码。但由于商业压力和任务规模,这不会很快发生。
鉴于我不太可能被允许进行诸如切换到 ORM 或重新构建大量代码之类的重大根本性更改,所以我的问题很简单:
有没有一种方法可以让 SQL Server 或 Oracle 理解另一个参数标识符或一些明智、简单的方法来以通用方式编写参数化查询,而无需大量字符串替换或 IF...Else 语句依赖于目标平台?我意识到我可能仍然需要编辑应用程序中的几乎所有 SQL 语句,但如果是这种情况,那就这样吧,我只需要把这个想法推销给我的老板。
干杯
【问题讨论】:
标签: .net oracle parameters enterprise-library