首页 > 解决方案 > 数百万条记录的 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

我必须在存储过程中进行性能改进,该存储过程确实有很多与表的连接。但是这个选择本身花费了太多时间。

请提出改进​​性能的建议

标签: sqlsql-server

解决方案


最佳变体:

  1. 由于 id 不断增加身份字段,因此将主键从非集群更改为集群。这也将防止碎片化。
  2. 在 processid 上添加非聚集索引。它将涵盖您的查询。这将使其在选择性能方面非常理想

不太理想:

如果无法调整主键:

CREATE INDEX ProcessID on table1(ProcessID) INCLUDE (id)

推荐阅读