每个人的好日子!
我有远程查询的迁移过程,我获取数据并将其存储在#Temptable
中,
问题是,什么会更好?在创建#temptable
表之后放置索引,或者在放置索引之前先在#temtable
中插入数据?为什么?或者,在将数据插入#temptable
离。
Select * into #BiosData
from sometable a
where (a.Status between 3 and 5)
CREATE CLUSTERED INDEX IDX_MAINID ON #BiosData([MAINID])
**Process the data retrieved above....**
或者这个?
select A.MAINIDinto #BiosData
from table a
inner join Transactions.sometable c
on a.ID= c.fld_ID
inner join Reference.sometable b
on cast(a.[ID]/1000000000000 as decimal (38,0)) = b.fld_ID
where a.version > b.fld_version
and (a.Status between 3 and 5)
谢谢你的提示和建议:)我是Sql的新手请温柔地对待我:)。
答案 0 :(得分:1)
作为一般规则: 如果您创建一个新表并且要将数据插入其中并且需要索引,那么首先插入数据并在之后创建索引会更快。原因:因为创建索引意味着在数据存在时计算它,但在索引表上插入数据将不断重新调整也需要写入的索引内容。因此,通过在之后创建索引,您可以避免在插入
时更新索引的开销异常1:如果您希望索引与数据结合,因此当索引t发生读取时找到特定值时,它也具有相同读取操作中可用的数据。在oracle中,他们称之为索引组织表。我认为在MS SQL中它可能被称为聚集索引,但不是100%肯定。
异常2:如果你的索引用于强制执行某些约束,那么首先创建索引是一个很好的选择,以确保在插入过程中保持约束。
在你的情况下:我注意到在复杂查询中有一个额外的where子句:它可能导致更少的插入,从而加快处理速度,但是如果复杂查询中使用的表具有加速查询的附加索引,则make确保在临时表上也创建了类似的索引。
最后:索引通常用于减少磁盘I / O,临时表是否在内存中没有被错误维护。因此,无法保证增加指数可以提高速度......