sql - 数百万条记录的 SQL Server 表的性能改进
问题描述
我在 SQL Server 中有一个表,它有数百万条记录。
我试图通过在 where 条件中传递 id 来进行选择,如下所示:
select id,processid value
from table1
where processid= 5
它返回了大约 100 万条记录,执行时间大约为 25 分钟。
表上有一个索引。我需要创建一个单独的非聚集索引吗?
请看我的表格脚本
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [Schema1].[Table1](
[Id] [bigint] IDENTITY(1,1) NOT NULL,
[ProcessId] [bigint] NOT NULL,
[Amount2] [decimal](21, 6) NULL,
[Amount1] [decimal](21, 6) NULL,
[Amount3] [decimal](21, 6) NULL,
[Amount4] [decimal](21, 6) NULL,
[CreatedById] [int] NOT NULL,
[CreatedDate] [datetime] NOT NULL,
[UpdatedById] [int] NULL,
[UpdatedDate] [datetime] NULL,
[IsActive] [bit] NOT NULL,
[IsDeleted] [bit] NOT NULL,
CONSTRAINT [PK_Schema1_Table1] PRIMARY KEY NONCLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [Table1_INDEX_FG]
) ON [Allocation_DATA_FG]
GO
ALTER TABLE [Schema1].[Table1] WITH CHECK ADD CONSTRAINT [CHK_Table1ComputeNode] CHECK ((([ProcessId]%(3)+(1))=(2)))
GO
ALTER TABLE [Schema1].[Table1] CHECK CONSTRAINT [CHK_Table1ComputeNode]
GO
我必须在存储过程中进行性能改进,该存储过程确实有很多与表的连接。但是这个选择本身花费了太多时间。
请提出改进性能的建议
解决方案
最佳变体:
- 由于 id 不断增加身份字段,因此将主键从非集群更改为集群。这也将防止碎片化。
- 在 processid 上添加非聚集索引。它将涵盖您的查询。这将使其在选择性能方面非常理想
不太理想:
如果无法调整主键:
CREATE INDEX ProcessID on table1(ProcessID) INCLUDE (id)
推荐阅读
- javascript - 如何在javascript中加密并在python中解密?
- react-native - 运行“react-native run-android”时出错
- javascript - 为流媒体服务器正确拆分 MPEG-1 第 3 层
- core-location - IOS 13:CoreLocation:CLVisit 在一段时间后停止调用委托
- css - 检查复选框是否被选中
- ios - UIStoryboard 控制器类作为基类
- python-3.x - 制作二维图 ['NoneType' 对象不可迭代]
- loops - 如何使用 xpath 连接不同的子节点
- slice - xarray中的角度切片
- node.js - fetch-api 中的“最大重定向”错误是什么意思?