首页 > 解决方案 > SQL Server 2012:选择查询 400M 静态表数据

问题描述

我们期望将来自另一个供应商的数据加载到 SQL Server 2012 上现有应用程序数据库的表中。表结构如下所示,表中预计有 4 亿行。数据加载要等 3 周后才会出现,但在查询表的性能方面存在问题。

SQL Server 有 64GB RAM。

此表只需要 SELECT 查询。数据是静态的,预计不会更改,并且不会对表进行 WRITES。SELECT 查询总是期望返回 1 个匹配的行。下面是 SELECT 查询的样子:

Select "Data Column 9" 
  from Table
 where "Data Column 1" = AB
   and "Data Column 2" = CD
   and "Data Column 3" = EF
   and "Data Column 4" = A
   and "Data Column 5" = B
   and "Data Column 6" = 123
   and "Data Column 7" = 456
   and "Data Column 8" = GH

Column Name       Datatype/Length
============    ====================
ID        IDENTITY(1,1) PRIMARY KEY
Data Column 1   CHAR Length =  (2)
Data Column 2   CHAR Length =  (2)
Data Column 3   CHAR Length =  (2)
Data Column 4   CHAR Length =  (1)
Data Column 5   CHAR Length =  (1)
Data Column 6   CHAR Length =  (3)
Data Column 7   CHAR Length =  (3)
Data Column 8   CHAR Length =  (2)
Data Column 9   CHAR Length =  (8)
Audit Column 1  CHAR Length =  (1)
Audit Column 2  DATETIME
Audit Column 3  VARCHAR Length =  (20)
Audit Column 4  DATETIME

专家能否建议应该索引哪些列以及如何索引?关于 SELECT 查询是否需要几秒钟或几分钟的任何想法?关于表设置或任何其他设置的任何其他建议?感谢所有反馈。

标签: sql-serverdatabase-performance

解决方案


您可以创建满足查询中所有请求列的非聚集覆盖索引,而无需进一步查找聚集索引。

脚本下方:

CREATE NONCLUSTERED INDEX IX_Table_Columns

ON dbo.Table ([Data Column 1] ASC, [Data Column 2] ASC, [Data Column 3] ASC, [Data Column 4] ASC, [Data Column 5] ASC, [Data Column 6] ASC, [Data Column 7] ASC, [Data Column 8] ASC)

INCLUDE ([Data Column 9])
 — WITH (ONLINE = ON)

我认为执行时间将是几毫秒。

对于生产,如果您有企业版,我建议添加WITH(ONLINE = ON)选项,这样您就没有块。

单击此处查看解释覆盖索引的好文章。


推荐阅读