在SQL Server 2005中拦截和重写查询

时间:2009-06-24 05:38:56

标签: sql-server sql-server-2005

我们有一个基于SQL Server 2005构建的应用程序,我们无法控制。我们最近发现这个应用程序正在向SQL发送一些非常低效的SELECT查询,导致数据库出现严重的容量问题。我知道正确的解决方案是破解应用程序的代码并更改查询,但由于原因我不会进入这需要很长时间。有没有什么方法可以拦截SQL服务器上的这个特定查询,并有选择地重新写入更优化的东西?

4 个答案:

答案 0 :(得分:2)

你可以使用这种方法。 它对我来说就像一个魅力:)

  

而不是试图拦截   并修改源自的SQL调用   应用程序,也许你可以   而是实现一个抽象层   无需更改应用程序   SQL。例如,如果您可以修改   用于的DSN或登录连接字符串   应用程序,然后connsider   以下。让我们假设当前   数据库是[A]。创建一个新数据库   [B]包含视图和函数   (但不是表格)与...同名   [A]中的内容,然后修改为   参考[A]中的表格。加   无论其他连接,过滤,   等等需要实现你的   (我假设)基于行   安全。然后,修改应用程序   DSN使用数据库[B]而不是   [A]。

link

答案 1 :(得分:2)

您可以尝试plan guides。这可以让您在不改变实际呼叫的情况下调整/优化查询。

来自“Understanding Plan Guides

  

您可以使用此程序   不能或不想改变   直接查询的文本。计划   指南在小的时候很有用   数据库中的查询子集   从一个部署的应用程序   第三方供应商未执行   正如所料。计划指南影响力   通过附加优化查询   查询提示给他们。

这也可能有助于使查询真正像跛狗一样运行,以便开发人员来寻求你的帮助......; - )

答案 2 :(得分:1)

这取决于他们在做什么以及查询是什么。当然,如果他们使用的是sprocs或UDF,你可以在不更改应用程序的情况下替换它们。您还可以考虑添加一些针对其错误SQL进行“优化”的索引(尽管这可能会影响数据库的合法用户)。您也可以检查他们正在进行的查询,看看是否可以用更高效的视图替换他们正在使用的表,但是您只是为了处理坏苹果而弄乱您的DDL。你最好的选择可能是将合法的应用程序迁移到特定的服务器上,让犯罪者独自腐烂。

答案 3 :(得分:1)

您是否已将资源编辑器/反射器用于可执行文件?如果你很幸运并且SQL语句是静态的,你可以更改它们。

如果没有关于应用程序的更多信息,很难确定这是否可行。如果SQL是动态生成的,那么这不是一个选项。