在sql server中选择1700万条记录非常慢

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)

为什么我的查询很慢?

Dan*_*man 5

结果缓慢的主要原因是客户端应用程序 (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秒即可检索行但不显示它们。

考虑端到端响应时间是客户端和服务器时间的度量。