我有一个超过 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);