【发布时间】: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