我有一个sproc,通过查询将750K记录放入临时表作为其第一个操作之一.如果我在填充表之前在临时表上创建索引,那么与填充表后索引时相比,该项运行的时间大约是两倍.(索引是单列中的整数,被索引的表只是两列,每列都是一个整数.)
这对我来说似乎有点不对劲,但是我对引擎盖下发生的事情并没有最深刻的理解.有没有人有这个答案?
如果创建聚簇索引,则会影响数据在磁盘上的物理排序方式.最好在事后添加索引,并让数据库引擎在知道数据如何分布时对行重新排序.
例如,假设你需要建造一个带有编号砖的砖墙,以便那些编号最高的砖墙位于墙的底部.如果你只是按照随机顺序交给砖块,一次一个 - 这将是一项艰巨的任务 - 你不会知道哪些砖块会成为编号最高的砖块,你必须拆掉墙壁并一遍又一遍地重建它.如果你把所有砖块都排在你面前,那么处理这项任务将会轻松得多,并且可以组织你的工作.
这就是数据库引擎的情况 - 如果你让它知道整个工作,它可能比你一次只连续喂它要高效得多.
这是因为数据库服务器必须在每次插入新行时进行计算.基本上,您每次都会重新索引表格.它似乎不是一个非常昂贵的操作,但事实并非如此,但是当你将它们中的许多组合在一起时,你就会开始看到它的影响.这就是为什么你通常想要在填充行之后进行索引,因为它只是一次性成本.