如何:将实际执行方法从“行”更改为“批处理”-Azure SQL Server
Posted
技术标签:
【中文标题】如何:将实际执行方法从“行”更改为“批处理”-Azure SQL Server【英文标题】:How to: Change actual execution method from "row" to "batch" - Azure SQL Server 【发布时间】:2019-06-11 19:39:35 【问题描述】:我遇到了一些重大问题。将数据插入我的数据库时,我使用了一个执行查询的INSTEAD OF INSERT
触发器。
在我的TEST
数据库中,此查询只需不到 1 秒即可插入单行。然而,在生产环境中,此查询需要更长的时间(1 行 > 30 秒)。
比较两者的执行计划时,似乎有一些明显的差异:
-
测试有:“实际执行方式:批处理”
Prod 有:“实际执行方法:行”
测试有:“实际行数:1”
产品有:“实际行数 92.000.000”
不到一周前,生产运行类似于测试。但现在不行了——很遗憾。
谁能帮我弄清楚原因?
我相信,如果我可以为两者获得相同的执行计划,那应该没有问题。
【问题讨论】:
实际行数:1 对 9200 万。猜测您的查询中有不同的数据或不同的参数。您的底部计划有一个谓词(过滤器),而顶部没有 这是完全相同的查询和相同的数据。他们怎么会有两个不同的计划?以及如何指定谓词? 查询计划器根据你的 SQL 指定谓词,以及它认为最快的谓词。 80% 的性能调优是为了弄清楚查询计划器为什么会做它正在做的事情。此时我建议您比较服务器之间的内存、CPU、并行配置(MaxDOP 和并行阈值) 【参考方案1】:有时使用查询提示 OPTION(hash Join) 有助于强制查询计划使用批处理模式。以下使用 AdventureWorks2012 示例数据库的查询演示了我的意思。
SELECT s.OrderDate, s.ShipDate, sum(d.OrderQty),avg(d.UnitPrice),avg(d.UnitPriceDiscount)
FROM Demo d
join Sales.SalesOrderHeader s
on d.SalesOrderID=s.SalesOrderID
WHERE d.OrderQty>500
GROUP BY s.OrderDate,s.ShipDate
上述查询使用行模式。有了查询提示,它就会使用批处理模式。
SELECT s.OrderDate, s.ShipDate, sum(d.OrderQty),avg(d.UnitPrice),avg(d.UnitPriceDiscount)
FROM Demo d
join Sales.SalesOrderHeader s
on d.SalesOrderID=s.SalesOrderID
WHERE d.OrderQty>500
GROUP BY s.OrderDate,s.ShipDate
OPTION(hash Join)
【讨论】:
@Wobli 感谢您与我分享它对您有用。这让我高兴。希望你有一个美好的一天!【参考方案2】:我找到了一个有点令人满意的解决方案来解决我的问题。
通过使用 Microsoft SQL Server Management Studio 进入数据库的查询存储,我能够为特定查询强制执行特定计划 - 但前提是该计划已经由查询制定。
【讨论】:
既然你已经解决了这个问题,你可以把它标记为答案。然后其他人可以参考您。 谢谢@LeonYue - 我会这样做,但在我可以将自己的答案标记为答案之前有 2 天的门槛。希望有更开明的人出现:D【参考方案3】:您不能直接在 SQL Server 中强制行与批处理。这是优化器中基于成本的决策。您可以(如您所见)强制使用批处理模式生成的计划。但是,没有专门的“仅使用批处理模式”模型,因为它并不总是最快的。批处理模式执行就像汽车发动机上的涡轮增压器 - 当您处理较大的行集时效果最佳。小基数 OLTP 查询可能会更慢。
如果您有 1 行与 92M 行的情况,那么您遇到的问题更大,即查询中处理的行数差异很大。如果您具有参数敏感性或内部查询计划的形状可能会创建有时您只有一行而不是 92M 的情况,那么这可能会使查询对所有场景都变得最优。最终,此类问题的解决方案是使用 option(recompile) 如果编译的成本远低于具有错误计划的差异,或者(如您所做的那样)在查询存储中找到一个特定的计划您可以强制它适用于所有情况。
希望这有助于解释幕后发生的事情。
【讨论】:
以上是关于如何:将实际执行方法从“行”更改为“批处理”-Azure SQL Server的主要内容,如果未能解决你的问题,请参考以下文章
以批处理模式发布 - 将依赖项版本更改为 SNAPSHOTS