我有一个包含约350万条记录的数据库表。该表存储合同数据记录,包括金额、日期和与其他表相关的一些ID(VendorId、AgencyId、StateId),以下是数据库表:
CREATE TABLE [dbo].[VendorContracts]
(
[Id] [uniqueidentifier] NOT NULL,
[ContractDate] [datetime2](7) NOT NULL,
[ContractAmount] [decimal](19, 4) NULL,
[VendorId] [uniqueidentifier] NOT NULL,
[AgencyId] [uniqueidentifier] NOT NULL,
[StateId] [uniqueidentifier] NOT NULL,
[CreatedBy] [nvarchar](max) NULL,
[CreatedDate] [datetime2](7) NOT NULL,
[LastModifiedBy] [nvarchar](max) NULL,
[LastModifiedDate] [datetime2](7) NULL,
[IsActive] [bit] NOT NULL,
CONSTRAINT [PK_VendorContracts]
PRIMARY KEY CLUSTERED ([Id] ASC)
WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
我在我的网站上有一个页面,我希望用户能够选择供应商,并查看按州划分的合同金额总额。
我有以下查询:
SELECT SUM(ContractAmount), StateId
FROM [dbo].[VendorContracts]
WHERE VendorId = '...'
GROUP BY StateId
我创建了这个索引来帮助解决这个问题:
CREATE NONCLUSTERED INDEX [IX_VendorContracts_VendorId] ON [dbo].[VendorContracts]
(
[VendorId] ASC
)
INCLUDE([Id],[StateId],[ContractAmount],[ContractDate],[AgencyId])
WITH (STATISTICS_NORECOMPUTE = OFF, DROP_EXISTING = OFF, ONLINE = OFF, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF)
对于大多数供应商来说,这很有效,我可以在一两秒钟内快速返回结果。但是有几个供应商每个都有大约100万条记录,那些需要相当长的时间,通常需要几分钟。
所以我想知道是否有任何方法进一步优化,通过修改我的索引?或其他任何方式?
或者我可能走错了路?不确定在1百万条记录上运行如此巨大的SUM
查询是否是一个好的做法。这张表不会很频繁地添加记录,我们可能每个月只添加一两千条记录,因此我考虑可能有一个夜间流程,可以获取SUM
数据并将其存储在单独的表中,然后在运行报告时查询该表。