我有两个具有相同名称、类型和索引键列的表。其中一个具有唯一的聚集索引,另一个具有非唯一的.
测试设置
设置脚本,包括一些真实的统计数据:
DROP TABLE IF EXISTS #left;
DROP TABLE IF EXISTS #right;
CREATE TABLE #left (
a char(4) NOT NULL,
b char(2) NOT NULL,
c varchar(13) NOT NULL,
d bit NOT NULL,
e char(4) NOT NULL,
f char(25) NULL,
g char(25) NOT NULL,
h char(25) NULL
--- and a few other columns
);
CREATE UNIQUE CLUSTERED INDEX IX ON #left (a, b, c, d, e, f, g, h)
UPDATE STATISTICS #left WITH ROWCOUNT=63800000, PAGECOUNT=186000;
CREATE …
Run Code Online (Sandbox Code Playgroud) join sql-server sql-server-2014 sort-operator sql-server-2017
我正在努力通过警告Operator used
tempdb最大限度地减少查询计划的排序操作成本to spill data during execution with spill level 2
我在溢出级别 1 的执行期间发现了几篇与溢出数据相关的帖子,但不是级别 2。级别 1 似乎是由过时的统计数据引起的,那么级别 2 呢?我找不到任何与level 2
.
我发现这篇与排序警告相关的文章非常有趣:
我的 SQL 服务器?
Microsoft SQL Server 2014 (SP2) (KB3171021) - 12.0.5000.0 (X64) 2016 年 6 月 17 日 19:14:09 版权所有 (c) Microsoft Corporation Enterprise Edition(64 位),Windows NT 6.3(内部版本 9600:)(管理程序)
我的硬件?
运行以下查询以查找硬件:
-- 来自 SQL Server 2012 的硬件信息
SELECT cpu_count AS [Logical CPU Count], hyperthread_ratio AS …
Run Code Online (Sandbox Code Playgroud) performance sql-server memory execution-plan sort-operator query-performance
在处理以下查询以回答此问题时:
有以下表格:
CREATE TABLE [dbo].[#foo] (
[creation] DATETIME NOT NULL,
[value] MONEY NULL,
[DT] AS (CONVERT([date],[CREATION])) PERSISTED)
-- add a clustered index on the dt column
CREATE CLUSTERED INDEX CI_FOO ON #FOO(DT)
GO
Run Code Online (Sandbox Code Playgroud)
和另一个加入表:
create table #bar (dt date primary key clustered)
go
Run Code Online (Sandbox Code Playgroud)
但是在运行以下查询时:
WITH RADHE AS (
SELECT THE_ROW=ROW_NUMBER() OVER(PARTITION BY B.DT ORDER BY B.DT),
THE_DATE=B.dt,
THE_NUMBER_OF_RECORDS_ON_THIS_DAY=CASE WHEN F.DT IS NULL THEN 0 ELSE COUNT(*) OVER (PARTITION BY F.DT ) END ,
THE_TOTAL_VALUE_FOR_THE_DAY=COALESCE(SUM(F.VALUE) OVER (PARTITION BY …
Run Code Online (Sandbox Code Playgroud) performance sql-server optimization execution-plan sort-operator query-performance
在 Azure SQL 数据库(SQL2019 兼容)上,我有一个 ETL 进程,它以 DeltaTrack 模式填充 HISTORY 表。
在 Proc 中,有一个对 HISTORY 表的更新,查询引擎正在使用 SORT,但我有一个应该覆盖它的索引。
此 UPDATE 的用例是针对现有行,自从该行首次添加到 HISTORY 表中以来,我们已向摄取添加了额外的列。
这种排序会导致我们更大/更宽的表上的更新速度极其缓慢。
如何调整索引或查询以删除查询 3中的排序?
这是根据京东要求更新的 执行计划
这是 DDL。
DROP TABLE IF EXISTS dbo.STAGE;
GO
CREATE TABLE dbo.STAGE
(
Id varchar(18) NULL,
CreatedDate varchar(4000) NULL,
LastModifiedDate varchar(4000) NULL,
LastReferencedDate varchar(4000) NULL,
[Name] varchar(4000) NULL,
OwnerId varchar(4000) NULL,
SystemTimestamp datetime2(7) NULL
)
GO
DROP TABLE IF EXISTS dbo.HISTORY;
GO
CREATE TABLE dbo.HISTORY
(
HistoryRecordId int IDENTITY(1,1) …
Run Code Online (Sandbox Code Playgroud) sql-server execution-plan azure-sql-database sort-operator query-performance
我正在运行一个查询并且执行它需要很长时间,查看执行计划我可以看到 51% 的成本在 SORT 中?在实际查询中,我没有按任何东西排序。
任何人都知道如何降低此排序百分比或将其全部删除?这是我正在运行的查询。
SELECT Time_ID,
Site_Type_ID,
Abandoned_ID,
WorkType_ID,
SUM (staging.dbo.measure.ring_time) AS Ring_Time,
SUM (staging.dbo.measure.hold_time) AS Hold_Time,
SUM (staging.dbo.measure.talk_time) AS Talk_Time,
SUM (staging.dbo.measure.acw_time) AS ACW_Time,
COUNT(*) CallCount
FROM measure
INNER JOIN DataMartEnd.dbo.Time_Dim
ON measure.StartTimeDate BETWEEN Time_Dim.Time_Start AND Time_Dim.Time_End
INNER JOIN datamartend.dbo.Site_Type_Dim
ON measure.DBID = Site_Type_Dim.Site_Type_Code
INNER JOIN datamartend.dbo.Abandoned_Call_Dim
ON measure.Abandoned = Abandoned_Call_Dim.abandoned_value
INNER JOIN DataMartEnd.dbo.Work_Type_Dim
ON measure.DBID = work_type_dim.MIG_Site_ID
AND Work_Type_Dim.Work_Type_Code = measure.Queue
AND measure.StartTimeDate BETWEEN Work_Type_Dim.DimEffectiveStartDtm AND Work_Type_Dim.DimEffectiveEndDtm
GROUP BY Abandoned_ID,
WorkType_ID,
Site_Type_ID,
time_id
Run Code Online (Sandbox Code Playgroud)
谢谢您的帮助。