【问题标题】:what is best practice for handling sql indexes when rebuilding a table重建表时处理 sql 索引的最佳实践是什么
【发布时间】:2016-03-03 05:06:46
【问题描述】:

我有一个存储过程将在一夜之间建立一个表。

第一步是截断,因为我不能保证现有记录不会被更新,因此擦除和重建是最简单的选择。

我想要建议的是索引的最佳实践。我应该在开始时删除索引然后再构建它吗?或者有没有更好的方法。该表将包含大约 300k 条记录,以及 7 列

【问题讨论】:

标签: sql sql-server tsql indexing


【解决方案1】:

这里有一些测试可以帮助你:

test1:
1.truncate table and don't delete indexes
2.insert data and check speed
3.check fragmentation

test2:
1.Truncate table
2.insert data and check speed
3.create indexes and check fragmentation


test1:
--insert data and check speed

delcare @id int=0
select current_timestamp;

while(@id<=1000000)
begin

insert into indextest
select @id,newid(),case when @id%10=0 then 1 else @id end;

set @id=@id+1
end

select current_timestamp;


--check fragmentation
--now check fragmentation
SELECT object_id, index_id, avg_fragmentation_in_percent, page_count 
FROM sys.dm_db_index_physical_stats(DB_ID(‘AdventureWorks2016’), OBJECT_ID(‘indextest’), NULL, NULL, NULL);


test2:
----truncate table
truncate table indextest

--drop indexes
drop index idx_id on indextest;
drop index nci_idx  on indextest;


---now insert data
delcare @id int=0
select current_timestamp;

while(@id<=1000000)
begin

insert into indextest
select @id,newid(),case when @id%10=0 then 1 else @id end;

set @id=@id+1
end

select current_timestamp;

--create index
create clustered index idx_id on indextest(id);

create non clustered index nci_idx on indextest(addres);

---check fragmentation:
SELECT object_id, index_id, avg_fragmentation_in_percent, page_count 
FROM sys.dm_db_index_physical_stats(DB_ID(‘AdventureWorks2016’), OBJECT_ID(‘indextest’), NULL, NULL, NULL);

总结:
当索引已经存在时

插入数据耗时 3:23 秒,插入后出现碎片

当我们在数据加载后删除并重新创建索引时:

插入速度:**2:44 秒
**分片:

也就是说,我的测试取决于最佳日志增长设置、磁盘速度。此外,您可能不太担心碎片,碎片仅对范围扫描有影响。我建议根据您的表使用情况删除和重新创建索引。

【讨论】:

    猜你喜欢
    • 2011-03-04
    • 2013-10-15
    • 1970-01-01
    • 2019-07-12
    • 1970-01-01
    • 2010-10-18
    • 2011-09-22
    • 2015-09-25
    相关资源
    最近更新 更多