【问题标题】:Improving Ad-Hoc Query Performance提高即席查询性能
【发布时间】:2016-03-22 20:47:25
【问题描述】:

详情: SQL 服务器 2012。 多租户数据库架构。

我遇到了用户生成的临时报告查询堵塞了我的 SQL 框的问题。

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

由于这些是用户生成的报告,我无法真正调整查询的性能。在超过 2000 个客户并且还在不断增加的情况下,为每个客户提供自己的一组视图或架构是不可能的。

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

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

编辑:

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

本地 CPU - Intel Xeon E3-1230 V2

EC2 CPU-Intel Xeon E5-2670 V2

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

【问题讨论】:

  • Optimize For Ad Hoc Workloads 是否启用?如果存在内存压力,这可能会有所帮助。
  • @DMason 无济于事。仅更改查询计划的缓存方式。
  • 我并不是说这是对您问题的铁定解决方案...但是,您的计划缓存可能因执行计划而变得臃肿,永远不会被重用。启用针对 Ad Hoc 工作负载的优化有助于缓解这种情况,释放缓冲池中的空间。我不会将其归类为“无济于事”。
  • 您可能需要采取极端措施并创建一个只读副本(复制)以供临时使用。还有很多索引。
  • @DMason 感谢您的建议。它没有打开,但我不确定它会有多大帮助。重置 SQL Server 后,第一个查询会挂起并阻塞所有内容,所以我认为这不是内存问题。服务器有 7.5GB 的 RAM,利用率约为 87%。

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


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2013-08-03
    • 2021-08-03
    • 2013-02-17
    • 2021-12-15
    • 2014-04-09
    • 2013-01-16
    • 2013-09-26
    • 2011-12-03
    相关资源
    最近更新 更多