8 performance sql-server clustered-index sql-server-2008-r2
我有一张大表,表的行数超过30亿,这张表的数据空间大约是120GB。
和 Intel Xeon CPU E5645 @2.4GHz(2 个处理器),24 个 CPU,64G 内存,64 位 Windows Server 2008 R2 企业版。
我跑
create unique clustered index MyTable_IXC on tblFactFoo(barKey) on [PRIMARY]
Run Code Online (Sandbox Code Playgroud)
但是用了6个多小时(实际上是6小时后报了duplicate key的错误)。
运行的时候cpu不到10%,磁盘IO不到20M/s,一般在15M/s左右,不知道这么强大的硬件如何提高创建聚簇索引的性能。
当查询运行时,您需要查看等待类型。您很可能需要更快的磁盘,因为在大表上构建索引将导致大量的读取和写入。
简而言之,您需要读取 120 Gig 表,根据聚簇键对其进行排序(这将导致 tempdb 大量溢出,将可能 100 Gig 写入 tempdb),然后将聚簇索引写入数据库,其中导致 120 Gig 的写入。
除此之外,表上的任何非聚集索引都需要同时重建,因此所有这些都需要被读取和重写(以及重建非聚集索引时产生的所有内存溢出)。
您可以通过禁用非聚集索引,然后在重建聚集索引后手动构建它们来加快速度。您需要确保最终用户在构建非聚集索引时无法接触系统,因为在创建非聚集索引之前,他们的查询性能将非常糟糕。
假设企业版可以创建常用的索引然后让用户重新登录,然后在线创建其他索引以便用户工作。
不管怎样,您都会看到一个非常长的维护窗口,您将尽其所能地猛击磁盘。
小智 1
每次创建/重新创建簇索引时,服务器都会开始对页面进行排序,这是一个非常消耗资源的过程。你的桌子很大。如果可能的话,我建议您将表分成几个较小的表(即执行数据标准化)。或者您可以创建该表的空副本,在空表上添加簇索引,从主表导入所有数据,然后删除主表。
我的意思是这样的 -
CREATE TABLE dbo.tblFactFoo_New
(
barKey INT NOT NULL
, ...
)
CREATE UNIQUE CLUSTERED INDEX tblFactFoo_IXC ON tblFactFoo_New(barKey) ON [PRIMARY]
INSERT INTO dbo.tblFactFoo_New(barKey, ...)
SELECT barKey, ...
FROM dbo.tblFactFoo
GROUP BY barKey, ... -- without duplicates
ORDER BY barKey
DROP TABLE dbo.tblFactFoo
sp_rename 'dbo.tblFactFoo_New', 'dbo.tblFactFoo'
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
23735 次 |
| 最近记录: |