表V表变量

时间:2015-06-02 14:15:44

标签: sql-server performance tsql

我在下面提到了两种完成一项任务的方法。 第一个是从Table直接多次选择,第二个是从表中选择所需的列到表变量,然后多次使用该表变量。哪个会表现得更好?为什么?

declare 
        @var1 varchar(10), 
        @var2 varchar(10)

----------------------------------------------------------------------------
-- 1st approach
----------------------------------------------------------------------------

select  *
from    tab1
where   tab1.col1 in (select tab2.col1 from tab2 where tab2.col2 <> @var1) or
        tab1.col2 in (select tab2.col2 from tab2 where tab2.col3 <> @var2)


----------------------------------------------------------------------------
-- 2nd approach
----------------------------------------------------------------------------

declare @tab2 table (col1 varchar(10), col2 varchar(10))
insert into @tab2
select  col1,
        col2
from    tab2

select  *
from    tab1
where   tab1.col1 in (select t.col1 from @tab2 as t where t.col2 <> @var1) or
        tab1.col2 in (select t.col2 from @tab2 as t where t.col3 <> @var2)

3 个答案:

答案 0 :(得分:0)

编辑:我不理解这个问题。忘了我的回答。请。

我认为两种方法之间的性能没有任何差异,因为唯一的区别是检索列的请求很小,这应该可以忽略不计。

第二种方法的好处是,如果您以后更改列名,则无需更新脚本。

PS: 我认为您检索列的查询不太对。你不是在这里检索列名,而是数据。我不知道你的DBMS,但如果它是Oracle,它应该是这样的:

SELECT column_name
FROM USER_TAB_COLUMNS
WHERE table_name = 'MYTABLE'

答案 1 :(得分:0)

据我所知,第一种方法将更快更有效。 如果您看到执行计划,表插入的额外成本将添加到第二种方法中。

第一种方法的执行计划:

enter image description here

第二种方法的执行计划:

enter image description here

答案 2 :(得分:0)

为什么世界上你会认为两个选择比一个快?

为什么不从tab1中选择col1,col2 ......?

在这两种情况下,你都有一个选择 表上的选择比表变量上的选择

更快

所以你所做的就是增加插入表变量的开销,以获得效率较低的选择

表变量存储在tempdb中 Microsoft对表变量的使用有各种警告

[Table variable][1]  

对于一个不使用超过100行的人 它没有索引

真的,如果tab1有一百万行,并且将其限制为10 你真的认为在@ tab2中插入一百万行会使它更快吗?