我有一个数据库表,大约有325万行.对于简单的查询,我的查询速度非常慢,我不认为我在try 做任何疯狂的事情.我基本上没有数据库优化方面的知识,所以希望这是一个简单的解决方案.
该表保存合同数据记录,包括金额、日期和一些与其他表(VendorId
、AgencyId
、StateId
)相关的ID,这是数据库表:
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]
我在数据库中有这3个索引.我没有创建这些,看起来像是Entity Framework Core通过迁移自动创建的,所以它们可能是错误的.
CREATE NONCLUSTERED INDEX [IX_VendorContracts_AgencyId]
ON [dbo].[VendorContracts] ([AgencyId] ASC)
WITH (STATISTICS_NORECOMPUTE = OFF, DROP_EXISTING = OFF,
ONLINE = OFF, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
CREATE NONCLUSTERED INDEX [IX_VendorContracts_StateId]
ON [dbo].[VendorContracts] ([StateId] ASC)
WITH (STATISTICS_NORECOMPUTE = OFF, DROP_EXISTING = OFF,
ONLINE = OFF, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
CREATE NONCLUSTERED INDEX [IX_VendorContracts_VendorId]
ON [dbo].[VendorContracts] ([VendorId] ASC)
WITH (STATISTICS_NORECOMPUTE = OFF, DROP_EXISTING = OFF,
ONLINE = OFF, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
我在我的网站上有一个页面,我希望用户能够 Select 一个供应商,并查看按州划分的合同金额总额.
我有一个疑问:
SELECT SUM(ContractAmount), StateId
FROM [dbo].[VendorContracts]
WHERE VendorId = '...'
GROUP BY StateId
但这需要很长时间,比如15-20分钟.
我try 了其他更简单的查询,我想可能总和让一切都变慢了,但这些速度也令人难以置信.我try 按供应商和州查询:
SELECT *
FROM [dbo].[VendorContracts]
WHERE VendorId = '...' AND StateId = '...'
尽管它只返回几千行,但仍然需要很长的时间.
奇怪的是,我有另一个数据库在一个单独的服务器上,有一个类似的表,有大约600万条记录,它根本没有这样的问题.我可以在不到一两秒钟的时间内运行SUM查询和其他查询.而且那个数据库表有相同的索引,所以不确定为什么那个表如此高效,而这个表不是.
在过go 的一周里,我每天都插入数十万条记录,我重新组织了索引,但这并没有解决问题,我还需要做些什么来优化它吗?我的数据库在Azure上,我是否需要更改或增加一些设置?