Ehs*_*bar 1 sql-server indexing sql-execution-plan
我尝试选择一个包含 1700 万条记录的表。大约需要10分钟。在这里您可以看到实时执行计划。
这是我的表结构:
CREATE TABLE [bas].[GatewayReceipt](
[Id] [INT] IDENTITY(1,1) NOT NULL,
[CustomerId] [INT] NULL,
[UserId] [INT] NOT NULL,
[RefNumber] [NVARCHAR](200) NULL,
[ResNumber] [NVARCHAR](200) NULL,
[Price] [DECIMAL](18, 5) NOT NULL,
[GatewayChannelId] [INT] NOT NULL,
[StatusId] [INT] NOT NULL,
[EntryDate] [DATETIME] NOT NULL,
[ModifyDate] [DATETIME] NULL,
[RowVersion] [TIMESTAMP] NOT NULL,
CONSTRAINT [PK_Bas_GatewayReceipt] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [FG_ATS]
) ON [FG_ATS]
GO
Run Code Online (Sandbox Code Playgroud)
请注意,我在 1:CustomerId 2:customerIdAndUserId 3:gatewaychannelId 上有 3 个非聚集索引
我的查询:
select * from bas.GatewayReceipt where gatewaychannelId in (1,2,3)
Run Code Online (Sandbox Code Playgroud)
为什么我的查询很慢?
结果缓慢的主要原因是客户端应用程序 (SSMS) 需要呈现 1700 万行的大型结果。
也就是说,SSMS 大约需要 70 秒才能在我的 PC 上以网格形式显示此查询的 1000 万行结果,并且任务管理器显示 SSMS 在执行过程中完全受 CPU 限制:
WITH
t10 AS (SELECT n FROM (VALUES(0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) t(n))
,t1k AS (SELECT 0 AS n FROM t10 AS a CROSS JOIN t10 AS b CROSS JOIN t10 AS c)
,t10m AS (SELECT ROW_NUMBER() OVER (ORDER BY (SELECT 0)) AS num FROM t1k AS a CROSS JOIN t1k AS b CROSS JOIN t10 AS c)
SELECT num
FROM t10m;
Run Code Online (Sandbox Code Playgroud)
在没有完全渲染的情况下重复相同的查询(查询-->选项-->网格-->执行后丢弃结果),只需要12秒即可检索行但不显示它们。
考虑端到端响应时间是客户端和服务器时间的度量。
归档时间: |
|
查看次数: |
727 次 |
最近记录: |