sql - 优化 SQL 表的性能 - 索引

标签 sql sql-server performance indexing sql-server-2014

我的数据库中有一个表,其中包含 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/

相关文章:

javascript - 为什么对 javascript 字符串进行排序比对数字排序更快?

android - 强制 Renderscript 在 CPU 或 GPU 上运行(至少出于性能调整目的)

sql-server - T-SQL OPENJSON $ AS JSON 不工作

sql - 如何删除父子记录

按唯一 IP 的 MySQL 页面 View

c# - SQLite ExecuteReader --> DataTable.Load --> FormatException (DateTime)

SQL Server 子查询语法

css - #parent>*/asterisk 与#parent>div

sql - 如何在 informix 中创建触发器?

sql - Oracle - REGEXP_LIKE 未给出所需结果