动态查询优化

And*_*708 6 database sql-server indexing optimization performance

我有一项业务任务,基本上只是从数据库中提取数据(Microsoft SQL Server 2008).在此过程中,用户将能够选择要选择的列,选择要从中选择的视图,以及构建WHERE子句.根据用户选择的内容,相应地构造SQL查询.要求是用户可以从任何视图中选择任何列,并按WHERE子句中的ANY列进行过滤.该公司不希望该解决方案使用数据仓库/ OLAP,并希望限制任何第三方软件.所以基本上他们只需要一个.NET Windows Forms应用程序,它基于GUI动态构建SQL查询并连接到数据库.

我关心的是如何优化查询.我还不擅长优化SQL查询,但我首先想到的是:如果用户选择过滤没有索引的列(在WHERE子句中)会怎么样?通过为用户提供如此大的灵活性,他们可能构建无效的查询,以至于需要很长时间才能执行.

我意识到如果对没有索引的列进行过滤,那么对于大量数据来说,性能永远不会好,但是我能做些什么来改进它?当然,我不能只为所有列添加索引.

我不一定只是寻找查询优化,但我也在考虑是否有任何服务器调整,我可以做,如缓存?基本上我都是耳朵,并寻找任何可以帮助我提高性能的建议.

有什么建议?

先感谢您!

usr*_*usr 4

除了预见用户可能会做什么之外,你真的无能为力。您可以让 SQL Server 优化器为您完成艰苦的工作(想象一下在键值存储上构建它!)。

我会在最有可能被过滤或排序的列上创建索引。您应该尝试将这些索引过滤为非空值,这将降低存储成本(假设用户不会过滤空值)。

您还可以尝试使用索引视图预先计算常见的联接和聚合。如果您愿意在这个问题上投入大量的 RAM 并且愿意进行缓慢的写入,您可以索引并具体化这个数据库。

最后,您可以卸载对只读日志传送目标等的用户查询。这会将他们可怕的查询沙箱起来。

对于您的查询,您需要对它们进行参数化,但不需要在所有情况下都缓存它们。如果您的查询往往会产生很大的成本(因此编译时间无关紧要),您将需要使用 OPTION RECOMPILE 来运行它们,以便 SQL Server 可以适应所有参数的确切运行时值。

您还应该监视所有查询并检查它们以查找模式。您的用户可能一直运行非常相似的查询。他们的索引。

定期运行 sp_updatestats。

最后,我想说,对此没有非常有效的解决方案,因为如果有 SQL Server 会自己实现它们,这样每个人都可以受益。