1

我有一个超过 700M 行的表。我尝试了 2 个不同的索引选项:1)1 个聚集索引和 1 个非聚集索引 2)一个聚集列存储索引。

我正在使用 SQL Server 2016。

使用第一个选项时,我能够在大约 30 分钟内将这张桌子与另一张桌子连接起来。

使用第二个选项,我在大约 35 分钟后收到 Out of Memory 错误。

这个内存不足错误是否可能与使用列存储索引有关?还是服务器很可能只是忙?如果是列存储索引的某些特性,有没有办法避免这个错误?

此外,在某些情况下(当您有超过 100,000,000 行时),通常的索引比列存储更受欢迎吗?

编辑:

该表如下所示:

CREATE TABLE tab1 (
    column1 (bigint, not null),
    column2 (int, not null),
    column3 (bigint, not null),
    column4 (int, not null),
    column5 (datetime, not null),
    column6 (date, not null),
    column7 (datetime, not null),
    column8 (tinyint, not null),
    column9 (int, not null),
    column10 (datetime, not null),
    column11 (date, null)
)

没有定义键。

索引选项 1:

create clustered index index1 on table1
    (column8, column1)

CREATE NONCLUSTERED INDEX index2 on table1(column4,column11)
    INCLUDE(
     column2
      ,column6
      ,column7
      )

索引选项 2:

create clustered columnstore index colindex1 on table1

加入:

SELECT table1.column1
      ,table1.column2
      ,table1.column3
      ,table1.column4
      ,table1.column5
      ,table1.column6
      ,table1.column7
      ,table1.column8
      ,table1.column10
      ,table1.column11
      ,table2.column4
      ,table2.column5
      ,table2.column6
      ,table2.column7
      ,table2.column8
      ,table2.column9
      INTO newTable
      FROM table1
INNER JOIN table2
    ON (table1.column1 = table2.column1 and
        table1.column11 = table2.column2 and
        table1.column8 = table2.column3);
4

1 回答 1

0

首先,试着想出一个主键。如果您可以定义一组唯一的列,那么没有什么比索引更好了。如果您不能这样做,请在column1, column8 and column11(连接子句中使用的所有列)上创建一个聚集索引。然后,如果您有其他选择语句,请查看连接中使用了哪些列和 where 子句,您也可以为它们添加其他非聚集索引。

于 2017-03-30T15:30:08.637 回答