Sql 提高adhoc查询性能

Sql 提高adhoc查询性能,sql,sql-server,tsql,amazon-ec2,sql-server-2012,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 Server 2012。 多租户数据库体系结构

我遇到了一个问题,用户生成的临时报告查询阻塞了我的SQL框

一份典型的报告可能包括7个表格(从10k行到500k行) 行),5个WHERE子句和2个排序过滤器。这些查询,如您所能 想象一下,它们非常昂贵,需要几分钟的时间。问题是 这些查询将最大限度地使用SQL CPU,并可能占用20GB以上的tempdb 空间从而导致使用该数据库的所有其他应用程序超时

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

我的问题是,如何调整数据库以进行特殊查询,或者以某种方式限制查询,使其不占用所有服务器资源?现在,如果有人运行大型报表,整个服务器将挂起,直到我重置SQL服务。显然,这是不可持续的

对于昂贵的查询多租户,是否有最佳实践 数据库

编辑:

我有一个可以复制问题的查询,但是如果我在本地开发服务器上运行它,tempDB也会增长,但是进程不会像在AWS实例上那样消耗CPU。(本地cpu占3%,EC2 m3占58%。大型)

本地CPU-英特尔至强E3-1230 V2

EC2 CPU-英特尔至强E5-2670 V2


据我所见,所有的服务器设置都几乎相同。

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

  • 我们使用资源调控器来定义池和工作组。全部的 应用程序连接/UI/下游查询分为:, 比如说,第1组/第1池
  • 所有用户连接都被划分为组2/池2
  • 只有组2/池2被限制只能访问20%的CPU资源。请注意,这将被调用并仅应用于服务器压力后的新连接。这意味着当服务器过载时,所有符合池2条件的新Connectrion都将受到限制
  • 若服务器处于压力之下,我们还需要终止任何失控的查询。因此,在池2查询运行超过10分钟的情况下,我们引发了一个window'e事件。windows服务将获取有关失控查询的信息,并将数据插入到管理表中
  • SQL代理每10分钟运行一次,查找插入到内务管理表中的查询并终止这些查询

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

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

  • 我们使用资源调控器来定义池和工作组。全部的 应用程序连接/UI/下游查询分为:, 比如说,第1组/第1池
  • 所有用户连接都被划分为组2/池2
  • 只有组2/池2被限制只能访问20%的CPU资源。请注意,这将被调用并仅应用于服务器压力后的新连接。这意味着当服务器过载时,所有符合池2条件的新Connectrion都将受到限制
  • 若服务器处于压力之下,我们还需要终止任何失控的查询。因此,在池2查询运行超过10分钟的情况下,我们引发了一个window'e事件。windows服务将获取有关失控查询的信息,并将数据插入到管理表中
  • SQL代理每10分钟运行一次,查找插入到内务管理表中的查询并终止这些查询

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

是否启用?如果存在内存压力,这可能会有所帮助。@DMason没有任何帮助。只是改变了查询计划的缓存方式。我并不是说这是解决您问题的铁一般的方法。。。但是,您的计划缓存可能因执行计划过多而无法重用。启用针对临时工作负载的优化有助于缓解这一问题,从而释放缓冲池中的空间。我不会将其归类为“毫无帮助”。您可能需要采取极端的做法,创建一个临时的只读副本(复制)。还有很多索引。@DMason谢谢你的建议。它没有打开,但我不确定它会有多大帮助。重置SQL Server后,第一个查询将挂起并阻塞所有内容,因此我认为这不是内存问题。服务器有7.5GB的RAM,利用率约为87%。是否启用?如果存在内存压力,这可能会有所帮助。@DMason没有任何帮助。只是改变了查询计划的缓存方式。我并不是说这是解决您问题的铁一般的方法。。。但是,您的计划缓存可能因执行计划过多而无法重用。启用针对临时工作负载的优化有助于缓解这一问题,从而释放缓冲池中的空间。我不会将其归类为“毫无帮助”。您可能需要采取极端的做法,创建一个临时的只读副本(复制)。还有很多索引。@DMason谢谢你的建议。它没有打开,但我不确定它会有多大帮助。重置SQL Server后,第一个查询将挂起并阻塞所有内容,因此我认为这不是内存问题。该服务器有7.5GB的RAM,利用率约为87%。