【问题标题】:Making Parametrized Queries Work with both SQL Server and Oracle使参数化查询同时适用于 SQL Server 和 Oracle
【发布时间】: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


    【解决方案1】:

    我认为最简单的方法就是优化查询转换。例如,您可以只缓存转换后的查询,一旦查询被转换,那么下次您需要转换它时,您只需从缓存中获取它。您可以只使用查询字符串的哈希码作为缓存的键。就像查询计划缓存一样。您还可以分析和优化查询转换本身。

    这种简单的缓存方法在实际应用中使用。例如 NHibernate Linq(在 NH3.0 中)提供程序将 Linq 表达式转换为内部 HQL 语言的 AST,然后将其转换为 sql。并且在每一步它都会缓存“查询计划”,因此如果需要再次转换相同的查询(相同的结构,不同的参数),nh 可以从缓存中获取它

    【讨论】:

    • 这是有道理的。我们已经在使用 EL5,所以我会看看缓存应用程序块,如果有帮助,我会回来报告。干杯。
    • 我还建议先分析您的应用程序,以确保查询转换是性能瓶颈。在处理性能问题时,最好从分析开始
    • 我们已经做到了——这就是我们知道这是问题所在的方式!!在某些方面,这很好,因为它有助于识别(并向管理层强调)该应用程序中的一些严重的固有设计缺陷,因此他们正在认真对待它,而不是仅仅假设开发人员想要“用酷做某事”技术”。
    • 这产生了明显的不同,并且实现起来非常简单。我使用 Enterprise Library 添加了一个隔离的存储缓存管理器,然后存储了使用未处理的 sql 字符串上的 String.GetHashCode 方法替换的字符串作为键。这里的好处是,作为一个持久存储,一旦一个字符串被缓存,它将在下次用户启动应用程序时以这种形式保持可用,这意味着只要字符串永远不会改变(而且大多数不会改变)它就不会需要通过这个替换库再次运行。
    • 我很高兴它有帮助。缓存是我最喜欢的处理性能问题的工具
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-30
    • 1970-01-01
    • 2021-03-10
    • 2014-10-06
    相关资源
    最近更新 更多