我在 SSMS 中运行以下查询,它在“包含执行计划”窗口中向我显示警告
select CLIENT_GUID, PMT_AMOUNT, DATE_COMPLETED
from
(
select
payment.CLIENT_GUID, payment.PMT_AMOUNT, hist.DATE_COMPLETED, ROW_NUMBER() over (partition by payment.client_guid order by payment.deposit_date desc, payment.create_date_time desc) rn
from
trnPMT payment WITH (NOLOCK)
inner join trnHistory hist WITH (NOLOCK) on payment.TRANS_GUID = hist.TRANS_GUID
Where
payment.REVISED = 0 and
payment.mpmt_guid <> '00000000-0000-0000-0000-000000000000'
) pmt
where pmt.rn = 1
警告是“操作员在执行期间使用 tempdb 以溢出级别 1 溢出数据”
我去调查了更多,但在他们的版本中既没有做SET SHOWPLAN_ALL ON
也没有SET SHOWPLAN_XML ON
显示警告。
显示计划_全部:
+------------------------------------------------ ---------------------------------------------- ---------------------------------------------- ---------------------------------------------- ---------------------------------------------- ------------------------------------------------+ ------+--------+--------+--------------------+ ----------------------+------------------------ ---------------------------------------------- ---------------------------------------------- ---------------------------------------------- ---------------------------------------------- ------------------+---------------------------- ---------------------------------------------- ------------------------------------------------+ --------------+------------+------------+-------- ----+----------------+------------------------ -------------------------------------------------------- ---------------------------------------------- ----------+------------+---------+--------+------ --------------+ | 文本 | 状态 | 节点编号 | 家长 | 物理操作 | 逻辑运算 | 争论 | 定义值 | 估计行 | 估计IO | 预估CPU | 平均行大小 | 总子树成本 | 输出列表 | 警告 | 类型 | 并行| 估计执行 | +------------------------------------------------ ---------------------------------------------- ---------------------------------------------- ---------------------------------------------- ---------------------------------------------- ------------------------------------------------+ ------+--------+--------+--------------------+ ----------------------+------------------------ ---------------------------------------------- ---------------------------------------------- ---------------------------------------------- ---------------------------------------------- ------------------+---------------------------- ---------------------------------------------- ------------------------------------------------+ --------------+------------+------------+-------- ----+----------------+------------------------ -------------------------------------------------------- ---------------------------------------------- ----------+------------+---------+--------+----- --------------+ | 选择 CLIENT_GUID、PMT_AMOUNT、日期_完成 | | | | | | | | | | | | | | | | | | | 来自 | | | | | | | | | | | | | | | | | | | ( | | | | | | | | | | | | | | | | | | 选择 | | | | | | | | | | | | | | | | | | | payment.CLIENT_GUID, payment.PMT_AMOUNT, hist.DATE_COMPLETED, ROW_NUMBER() over (partition by payment.client_guid order by payment.deposit_date desc, payment. create_date_time desc) rn | | | | | | | | | | | | | | | | | | 来自 | | | | | | | | | | | | | | | | | | | trnPMT 支付 WITH (NOLOCK) | | | | | | | | | | | | | | | | | | | inner join trnHistory hist WITH (NOLOCK) on payment.TRANS_GUID = hist. TRANS_GUID | | | | | | | | | | | | | | | | | | | 在哪里 | | | | | | | | | | | | | | | | | | | 支付。修订 = 0 和 | | | | | | | | | | | | | | | | | | | payment.mpmt_guid '00000000-0000-0000-0000-000000000000' | | | | | | | | | | | | | | | | | | | ) 下午 | | | | | | | | | | | | | | | | | | | 其中 pmt.rn = 1 | 1 | 1 | 0 | 空 | 空 | 1 | 空 | 9283.128 | 空 | 空 | 空 | 40. 03822 | 空 | 空 | 选择 | 0 | 空 | | |--过滤器(哪里:([Expr1004]=(1))) | 1 | 2 | 1 | 过滤器 | 过滤器 | 其中:([Expr1004]=(1))| 空 | 9283.128 | 0 | 0.09364839 | 39 | 40.03822 | [付款].[CLIENT_GUID], [付款].[PMT_AMOUNT], [历史].[DATE_COMPLETED] | 空 | 计划行 | 0 | 1 | | |--序列项目(DEFINE:([Expr1004]=row_number)) | 1 | 3 | 2 | 序列项目 | 计算标量 | 定义:([Expr1004]=row_number) | [Expr1004]=行号 | 195100.8 | 0 | 0.01560807 | 47 | 39.94458 | [付款].[CLIENT_GUID], [付款].[PMT_AMOUNT], [历史].[DATE_COMPLETED], [Expr1004] | 空 | 计划行 | 0 | 1 | | |--段| 1 | 4 | 3 | 段 | 段 | [付款].[CLIENT_GUID] | 空 | 195100.8 | 0 | 0.003902016 | 47 | 39.92897 | [付款].[CLIENT_GUID], [付款].[DEPOSIT_DATE], [付款].[PMT_AMOUNT], [付款].[CREATE_DATE_TIME], [hist].[DATE_COMPLETED], [Segment1005] | 空 | 计划行 | 0 | 1 | | |--排序(排序方式:([付款]。[CLIENT_GUID] ASC,[付款]。[DEPOSIT_DATE] DESC,[付款]。[CREATE_DATE_TIME] DESC))| 1 | 5 | 4 | 排序 | 排序 | ORDER BY:([payment].[CLIENT_GUID] ASC, [payment].[DEPOSIT_DATE] DESC, [payment].[CREATE_DATE_TIME] DESC) | 空 | 195100.8 | 0.01126126 | 15.73772 | 55 | 39.92507 | [付款].[CLIENT_GUID], [付款].[DEPOSIT_DATE], [付款].[PMT_AMOUNT], [付款].[CREATE_DATE_TIME], [hist].[DATE_COMPLETED] | 空 | 计划行 | 0 | 1 | | |--Hash Match(Inner Join, HASH:([payment].[TRANS_GUID])=([hist].[TRANS_GUID]), RESIDUAL:([TestDb].[dbo].[trnHistory].[TRANS_GUID] as [hist].[TRANS_GUID]=[TestDb].[dbo].[trnPMT].[TRANS_GUID] as [payment].[TRANS_GUID])) | 1 | 6 | 5 | 哈希匹配 | 内部加入 | HASH:([payment].[TRANS_GUID])=([hist].[TRANS_GUID]), RESIDUAL:([TestDb].[dbo].[trnHistory].[TRANS_GUID] as [hist].[TRANS_GUID]=[ TestDb].[dbo].[trnPMT].[TRANS_GUID] 作为[payment].[TRANS_GUID]) | 空 | 195100.8 | 0 | 14.81137 | 55 | 24.17609 | [付款].[CLIENT_GUID], [付款].[DEPOSIT_DATE], [付款].[PMT_AMOUNT], [付款].[CREATE_DATE_TIME], [hist].[DATE_COMPLETED] | 空 | 计划行 | 0 | 1 | | |--聚簇索引扫描(OBJECT:([TestDb].[dbo].[trnPMT].[imp_clpk_trnPMT] AS [payment]), WHERE:([TestDb].[dbo].[trnPMT].[REVISED] as [payment].[REVISED]=(0) AND [TestDb].[dbo].[trnPMT].[MPMT_GUID] 作为 [payment].[MPMT_GUID]{guid'00000000-0000-0000-0000-000000000000'}) ) | 1 | 7 | 6 | 聚簇索引扫描 | 聚簇索引扫描 | 对象:([TestDb].[dbo].[trnPMT].[imp_clpk_trnPMT] AS [payment]), WHERE:([TestDb].[dbo].[trnPMT].[REVISED] as [payment].[REVISED] =(0) 和 [TestDb].[dbo].[trnPMT].[MPMT_GUID] 作为 [payment].[MPMT_GUID]{guid'00000000-0000-0000-0000-000000000000'}) | [付款].[TRANS_GUID], [付款].[CLIENT_GUID], [付款].[DEPOSIT_DATE], [付款].[PMT_AMOUNT], [付款].[CREATE_DATE_TIME] | 231167.7 | 6.566088 | 0.2730604 | 80 | 6.839149 | [支付]。[TRANS_GUID],[付款]。[CLIENT_GUID],[付款]。[DEPOSIT_DATE],[付款]。[PMT_AMOUNT],[付款]。[CREATE_DATE_TIME] | 空 | 计划行 | 0 | 1 | | |--索引扫描(OBJECT:([TestDb].[dbo].[trnHistory].[IX_trnHistory_DATE_COMPLETED_TRANS_GUID_TRANS_NUMBER] AS [hist])) | 1 | 8 | 6 | 索引扫描 | 索引扫描 | 对象:([TestDb].[dbo].[trnHistory].[IX_trnHistory_DATE_COMPLETED_TRANS_GUID_TRANS_NUMBER] AS [hist]) | [历史].[TRANS_GUID], [历史].[DATE_COMPLETED] | 503270 | 1.753495 | 0.553754 | 31 | 2.307249 | [历史].[TRANS_GUID],[历史]。[DATE_COMPLETED] | 空 | 计划行 | 0 | 1 | +------------------------------------------------ ---------------------------------------------- ---------------------------------------------- ---------------------------------------------- ---------------------------------------------- ------------------------------------------------+ ------+--------+--------+--------------------+ ----------------------+------------------------ ---------------------------------------------- ---------------------------------------------- ---------------------------------------------- ---------------------------------------------- ------------------+---------------------------- ---------------------------------------------- ------------------------------------------------+ --------------+------------+------------+-------- ----+----------------+------------------------ -------------------------------------------------------- ---------------------------------------------- ----------+------------+---------+--------+----- --------------+
SHOWPLAN_XML:(
在此处规划 XML)
我是偶然发现了某种错误,还是我做错了什么我应该做不同的事情?
(PS 我知道警告的含义以及如何修复它,我对出现在一个地方而不是另一个地方的警告更感兴趣。)
编辑:
这是“关于”帮助页面中我的 SSMS 的版本信息。
Microsoft SQL Server 管理工作室:11.0.3128.0 Microsoft Analysis Services 客户端工具:11.0.3128.0 Microsoft 数据访问组件 (MDAC):6.3.9600.16384 微软 MSXML:3.0 4.0 6.0 微软 Internet Explorer:9.11.9600.16521 微软 .NET 框架:4.0.30319.34011 操作系统:6.3.9600
我正在针对数据库引擎版本运行11.0.3128
这个:
相当于按下
Display Estimated Execution Plan
工具栏(或点击Ctrl+ L)。您会注意到查询没有返回任何行,就像您使用Include Actual Execution Plan
( Ctrl+ M) 时一样。溢出警告只是运行时警告。在显示估计计划时,SQL Server 无法知道在运行时会发生溢出。这是因为溢出是由可能只在查询的某些调用期间出现的因素引起的(例如,当存在内存压力时)。估计的计划大致知道它要请求多少内存,但是直到执行它才能知道它不会得到它。
另外,我可以推荐*我们的免费工具 SQL Sentry Plan Explorer吗?我认为它提供的信息比 Management Studio 明显得多。我最近写了一篇很长的博客文章,可以作为教程,Jonathan Kehayias 也有一个很棒的 PluralSight 课程。
*免责声明:我为 SQL Sentry 工作。