1

祝每个人都有美好的一天!

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

4

1 回答 1

1

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

例外 1:如果您想将索引与数据结合起来,因此当对索引进行读取时 t 会找到特定值,它也具有在同一读取操作中可用的数据。在 oracle 中,他们称其为索引组织表。我认为在 MS SQL 中它可能被称为聚集索引,但不是 100% 肯定。

例外 2:如果您的索引用于强制执行某些约束,那么首先创建索引是一个不错的选择,以确保在插入期间保持约束。

在您的情况下:我注意到在复杂查询中还有一个额外的 where 子句:它可能会导致更少的插入因此更快的处理,但是如果复杂查询中使用的表有额外的索引来加速查询,请确保类似的索引也在临时表上创建。

最后:索引通常用于减少磁盘 i/o,如果我没记错的话,临时表是在内存中维护的。因此,不能保证添加索引会提高速度...

于 2013-09-13T08:05:07.137 回答