【发布时间】:2021-11-07 13:06:53
【问题描述】:
我尝试选择一个包含 1700 万条记录的表。 大约需要 10 分钟。 在这里您可以看到 Live 执行计划。
这是我的表结构:
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
作为说明,我有 3 个非聚集索引 1:客户编号 2:客户ID和用户ID 3:gatewaychannelId
我的查询:
select * from bas.GatewayReceipt where gatewaychannelId in (1,2,3)
为什么我的查询很慢?
【问题讨论】:
-
你的问题是什么? SELECT * FROM 没有 WHERE 不能使用索引
-
@Sergey 抱歉,我更改了查询。我在 gatewaychannelid 上有一个 where 子句
-
@Sergey 作为主要问题 为什么没有 where 的选择查询应该这么慢?
-
你们似乎都认真地忽略了这件事。是否有索引并不重要——即使没有索引,1700 万行扫描也不应该在现代硬件上花费 10 分钟。在 5 年的手机、20 年的电脑上运行?非常非常非常少的内存? 10 分钟太离谱了,索引与否。
-
“大约需要 10 分钟”到底是什么意思?您是否从应用程序的角度进行测量?应用程序检索结果集并对其进行处理的速度有多慢?该应用程序对结果集做了什么?服务器和应用程序之间的网络连接有多慢?即使可以改进执行计划,但如果问题出在结果集的消耗范围内,您可能看不到多少改进。
标签: sql-server indexing sql-execution-plan