我正在将大量数据导入到一个空数据库中,在开始之前,我禁用了所有非唯一的非聚集索引,以查看是否可以改善导入性能。
现在我想重新启用索引,我想知道是否有什么我可以做的来优化它。
有超过100个表和将近2,000个索引要重建。该数据库的大小为200GB。
我正在运行的脚本的关键部分是:
declare c_toggle_index cursor FORWARD_ONLY READ_ONLY for
select 'alter index ' + QUOTENAME(i.name) + ' on ' + o.name + ' rebuild'
from sys.indexes as i
Inner Join sys.objects o
On o.object_id = i.object_id
Where o.is_ms_shipped = 0
And i.index_id >= 1
and i.type > 1
and i.is_disabled = 1
我考虑为alter index语句设置ONLINE = OFF,但是随着索引开始禁用,我不确定该设置是否会起作用。我还考虑过将SORT_IN_TEMPDB = ON设置,但是由于tempdb文件与数据库的.mdf文件位于同一驱动器上,因此我认为这样做也没有任何好处。
在运行重建脚本时,我注意到我有很多CXPACKET等待类型。我真的不明白为什么会这样,或者如果我要解决这个问题。
最后一点可能很重要:除了将数据导入数据库之外,我的整个服务器当前都处于非活动状态。没有其他要考虑或担心的用户活动;我唯一关心的是在尽可能短的时间内将数据导入数据库。
CXPACKET
等待:索引会自行重建扫描索引(甚至重建索引),这些扫描可以使用并行性。您不必担心这些等待-并行性可能会有所帮助。