我的数据库中有一个表,其中包含 500 万条记录:
CREATE TABLE [dbo].[PurchaseFact](
[Branch] [int] NOT NULL,
[ProdAnal] [varchar](30) NULL,
[Account] [varchar](12) NULL,
[Partno] [varchar](24) NULL,
[DteGRN] [date] NULL,
[DteAct] [date] NULL,
[DteExpect] [date] NULL,
[OrderNo] [bigint] NULL,
[GRNNO] [varchar](75) NULL,
[SuppAdv] [varchar](75) NULL,
[Supplier] [varchar](12) NULL,
[OrdType] [varchar](4) NULL,
[UnitStock] [varchar](4) NULL,
[OrderQty] [float] NULL,
[RecdQty] [float] NULL,
[Batch] [varchar](100) NULL,
[CostPr] [float] NULL,
[Reason] [varchar](2) NULL,
[TotalCost] [float] NULL,
[Magic] [bigint] IDENTITY(1,1) NOT NULL,
PRIMARY KEY CLUSTERED
(
[Magic] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
正如您从上面看到的 - MAGIC
列上使用了 CLUSTERED INDEX
,该列是 UNIQUE
列。
以下 SELECT 语句
的数据检索时间远远超过 8 分钟,这会导致报告问题:
SELECT Branch,
Supplier,
ProdAnal,
DteGRN AS Date,
PartNo AS Partno,
OrderNo,
OrderQty,
TotalCost,
CostPr
FROM dbo.PurchaseFact src
WHERE YEAR(DteGRN) = 2016
排除 WHERE 子句
也不会使查询运行得更快。
我尝试过与CLUSTERED索引
一起包含一个UNIQUE索引
,希望它能运行得更快,但没有成功:
CREATE UNIQUE INDEX Unique_Index ON dbo.PurchaseFact ([Branch], [Supplier], [Magic])
INCLUDE ([ProdAnal], [Account], [Partno], [DteAct], [DteExpect], [OrderNo], [GRNNO],
[SuppAdv], [OrdType], [UnitStock])
有什么方法可以优化此表的性能时间,或者我应该诉诸归档旧数据吗?
如有任何建议,我们将不胜感激。
最佳答案
这是您的 where
子句:
WHERE YEAR(DteGRN) = 2016
如果表有 500 万行,那么假设日期分布合理,这将返回大量数据。数据量可能决定了查询的时间长度。
您可以做的一件事是重新表述 WHERE
,然后在适当的列上放置索引:
WHERE DteGRN >= '2016-01-01' and DteGRN < '2017-01-01'
然后,这可以利用 PurchaseFact(DteGRN)
上的索引。但是,考虑到可能返回的行数,索引可能不会有太大帮助。
更大的问题是为什么您的报告应用程序要返回 2016 年的所有行,而不是在数据库中汇总它们。我怀疑您的报告应用程序存在架构问题。
关于sql - 优化 SQL 表的性能 - 索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40910538/