提高Ad-Hoc查询性能

时间:2016-03-22 20:47:26

标签: sql sql-server tsql amazon-ec2 sql-server-2012

详细说明: SQL Server 2012。 多租户数据库架构。

我遇到问题,用户生成临时报告查询干扰我的SQL框。

典型报告可能包括7个表格(从10k行到超过500k不等) 行),5个WHERE子句和2个排序过滤器。这些查询,你可以 想象一下,相当昂贵,可能需要几分钟。问题是 这些查询将最大化SQL CPU,并可占用超过20GB的tempdb 空间。因此导致使用数据库的每个其他应用程序超时。

由于这些是用户生成的报告,因此我无法真正调整查询的性能。在2000多个客户端上升,为每个客户提供自己的一组视图或模式是不可能的。

我的问题是如何调整我的数据库以进行即席查询或以某种方式限制查询,以便它不会占用所有服务器资源?截至目前,如果有人运行大报告,整个服务器将挂起,直到我重置SQL服务。显然这是不可持续的。

对于昂贵的查询多租户,是否有最佳做法 数据库?

编辑:

我有一个可以复制问题的查询,但是如果我在我的本地开发服务器上运行它,tempDB会增长相同,但是这个过程不会像在我的AWS实例上那样耗尽CPU。 (本地3%cpu vs EC2 m3.large 58%)。

本地CPU- Intel Xeon E3-1230 V2

EC2 CPU- Intel Xeon E5-2670 V2

从我所看到的,所有服务器设置都完全相同。

1 个答案:

答案 0 :(得分:0)

我们公司遇到了类似的问题。我们使用多管齐下的解决方案来控制临时失控查询。它可能/可能对您没用。简而言之,我们的设计是:

  • 我们使用资源调控器来定义池和工作组。所有 应用程序连接/ UI /下游查询分类为, 比方说,第1组/第1组。
  • 所有用户连接都归类为第2组/第2组
  • 仅限组2 /池2仅限访问20%的CPU资源。请注意,这将仅在服务器压力之后的新连接上调用和应用。这意味着当服务器超载时,所有符合池2的新连接都将受到限制。
  • 如果服务器处于压力之下,我们还需要杀死任何失控的查询。所以我们提出了一个window'e事件,以防池2查询运行超过10分钟。 Windows服务将获取有关失控查询的信息,并将数据插入管家表。
  • SQL代理将每10分钟运行一次,并查找在内务表中插入的查询并终止这些查询。

这是一个全面的解决方案,您可以根据需要自定义和部署。