0

目前我们有一个数据仓库,它保存来自多个租户的数据。SQL Server 版本为 2019。所有租户数据库的相同架构和来自所有租户的数据都合并到 Datawarehouse 中。数据在租户基础上在数据仓库中进行分区。由于租户之间的数据差异很大,因此新仪表板存在参数嗅探问题。一些租户的数据少于 10000 行,一些租户的数据高达 500 万行。因此,如果执行计划是基于较小的租户构建的,则仪表板性能对大租户不利。

互联网上的建议是要求使用重新编译提示或优化提示等。但我对这个参数嗅探的基础有疑问。由于统计信息由 SQL 服务器在分区级别维护,这些统计信息是否不用于查看构建的计划是否适合新的运行时值?在执行之前,是否曾经比较基于编译时间和运行时间构建的计划的统计信息,以查看它们是否有效以及相关的计划是否有效?

好心提醒。

4

1 回答 1

0
  1. 在查询文本中嵌入分区号或 TenantID 键

参数用于您想要共享、重用的查询计划时。硬编码导致查询计划变化的标准是这里的基本正确答案。

即使“我们尽可能避免在代码中使用动态 SQL”,您也应该在此处例外。

  1. 使用选项重新编译

如果您最终没有在查询优化上花费太多时间,这几乎是一样的好。或者

  1. 将注释添加到因租户或租户大小而异的查询中,以获取分区计划缓存。这对于将查询与生成它们的代码路径相关联也很有用。例如
/* Dashboard: Sales Overview
   Visual: Total Sales
   TenantID: 12345    */   
select sum(Sales) TotalSales
from T
where TenantId = @tenantId
于 2021-03-27T20:06:07.340 回答