sql-server - 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 查询是否需要几秒钟或几分钟的任何想法?关于表设置或任何其他设置的任何其他建议?感谢所有反馈。
解决方案
您可以创建满足查询中所有请求列的非聚集覆盖索引,而无需进一步查找聚集索引。
脚本下方:
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)
选项,这样您就没有块。
单击此处查看解释覆盖索引的好文章。
推荐阅读
- excel - 为什么我的 For Each 循环这么慢?有没有更有效的方法?
- kubernetes - Pod node-exporter 没有在 azure kubernetes 服务上的 prometheus 中分配主机
- javascript - 如何分离图标和输入类型文本框并将div移动到右上角?
- python - Python:PermissionError:[Errno 13] 权限被拒绝:'D:/Documents/1'
- xml - 包含 & 符号的 XML 文件
- python - 几何必须是使用 Cartopy 的点或线串错误
- postgresql - 窗口函数
- node.js - 如何断言应用程序使用 POST 请求向 API 服务器发送正确的数据
- r - 删除特定行之前的观察
- hadoop - 具有许多并行存储桶的 Flink Hadoop Bucketing Sink 性能