我们有一个基于SQL Server 2005构建的应用程序,我们无法控制。我们最近发现这个应用程序正在向SQL发送一些非常低效的SELECT查询,导致数据库出现严重的容量问题。我知道正确的解决方案是破解应用程序的代码并更改查询,但由于原因我不会进入这需要很长时间。有没有什么方法可以拦截SQL服务器上的这个特定查询,并有选择地重新写入更优化的东西?
答案 0 :(得分:2)
你可以使用这种方法。 它对我来说就像一个魅力:)
而不是试图拦截 并修改源自的SQL调用 应用程序,也许你可以 而是实现一个抽象层 无需更改应用程序 SQL。例如,如果您可以修改 用于的DSN或登录连接字符串 应用程序,然后connsider 以下。让我们假设当前 数据库是[A]。创建一个新数据库 [B]包含视图和函数 (但不是表格)与...同名 [A]中的内容,然后修改为 参考[A]中的表格。加 无论其他连接,过滤, 等等需要实现你的 (我假设)基于行 安全。然后,修改应用程序 DSN使用数据库[B]而不是 [A]。
答案 1 :(得分:2)
您可以尝试plan guides。这可以让您在不改变实际呼叫的情况下调整/优化查询。
您可以使用此程序 不能或不想改变 直接查询的文本。计划 指南在小的时候很有用 数据库中的查询子集 从一个部署的应用程序 第三方供应商未执行 正如所料。计划指南影响力 通过附加优化查询 查询提示给他们。
这也可能有助于使查询真正像跛狗一样运行,以便开发人员来寻求你的帮助......; - )
答案 2 :(得分:1)
这取决于他们在做什么以及查询是什么。当然,如果他们使用的是sprocs或UDF,你可以在不更改应用程序的情况下替换它们。您还可以考虑添加一些针对其错误SQL进行“优化”的索引(尽管这可能会影响数据库的合法用户)。您也可以检查他们正在进行的查询,看看是否可以用更高效的视图替换他们正在使用的表,但是您只是为了处理坏苹果而弄乱您的DDL。你最好的选择可能是将合法的应用程序迁移到特定的服务器上,让犯罪者独自腐烂。
答案 3 :(得分:1)
您是否已将资源编辑器/反射器用于可执行文件?如果你很幸运并且SQL语句是静态的,你可以更改它们。
如果没有关于应用程序的更多信息,很难确定这是否可行。如果SQL是动态生成的,那么这不是一个选项。