【问题标题】:SQL Server 2012: Select Query on 400M static table dataSQL Server 2012:选择查询 400M 静态表数据
【发布时间】:2020-07-31 16:45:40
【问题描述】:

我们希望将其他供应商的数据加载到 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 查询是否需要几秒钟或几分钟的任何想法?关于表设置或任何其他设置的任何其他建议?感谢所有反馈。

【问题讨论】:

  • 一个选项是将列散列到一个数字(在计算列中),索引计算列(4/8bytes int/bigint)并使用搜索词的散列值执行搜索 +每列(对于任何可能的重复哈希值)--> 索引查找 + 查找(clkey 或 rid)

标签: sql-server database-performance


【解决方案1】:

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

脚本下方:

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) 选项,这样您就没有块。

点击here获取解释覆盖索引的好文章。

【讨论】:

    【解决方案2】:

    {"Data Column 1", "Data Column 2", "Data Column 3", "Data Column 4", "Data Column 5", "Data Column 6", "Data Column 7", "Data Column 8"} 上的复合索引应该让此查询通过简单的索引查找找到行。

    假设没有其他意外,我预计会有毫秒级的性能。

    【讨论】:

      【解决方案3】:

      在“Data Column 1”...“Data Column 8”上创建非聚集索引将有效地重复所有 400M 行以及大部分表数据,更好的解决方案是删除 ID 上的聚集 PK(如果有) ,并在这 8 列上创建一个聚集主键,从您的描述中我们看到它们是唯一的,并且不以任何方式使用 ID,或者如果它们不是唯一的,则只是这些列上的聚集索引。这还假设您没有在 ID 上创建非聚集索引,因为这将再次重复所有表数据。您还可以在查询中添加WITH(NOLOCK),以免在锁上花费不必要的资源和时间。执行时间为毫秒级。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-10
        • 2014-11-02
        • 1970-01-01
        相关资源
        最近更新 更多