Temptables的索引

时间:2013-09-13 07:41:34

标签: sql tsql sql-server-2008-r2 temp-tables

每个人的好日子!

我有远程查询的迁移过程,我获取数据并将其存储在#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的新手请温柔地对待我:)。

1 个答案:

答案 0 :(得分:1)

作为一般规则: 如果您创建一个新表并且要将数据插入其中并且需要索引,那么首先插入数据并在之后创建索引会更快。原因:因为创建索引意味着在数据存在时计算它,但在索引表上插入数据将不断重新调整也需要写入的索引内容。因此,通过在之后创建索引,您可以避免在插入

时更新索引的开销

异常1:如果您希望索引与数据结合,因此当索引t发生读取时找到特定值时,它也具有相同读取操作中可用的数据。在oracle中,他们称之为索引组织表。我认为在MS SQL中它可能被称为聚集索引,但不是100%肯定。

异常2:如果你的索引用于强制执行某些约束,那么首先创建索引是一个很好的选择,以确保在插入过程中保持约束。

在你的情况下:我注意到在复杂查询中有一个额外的where子句:它可能导致更少的插入,从而加快处理速度,但是如果复杂查询中使用的表具有加速查询的附加索引,则make确保在临时表上也创建了类似的索引。

最后:索引通常用于减少磁盘I / O,临时表是否在内存中没有被错误维护。因此,无法保证增加指数可以提高速度......