我在下面提到了两种完成一项任务的方法。 第一个是从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)
答案 0 :(得分:0)
我认为两种方法之间的性能没有任何差异,因为唯一的区别是检索列的请求很小,这应该可以忽略不计。
第二种方法的好处是,如果您以后更改列名,则无需更新脚本。
PS: 我认为您检索列的查询不太对。你不是在这里检索列名,而是数据。我不知道你的DBMS,但如果它是Oracle,它应该是这样的:
SELECT column_name
FROM USER_TAB_COLUMNS
WHERE table_name = 'MYTABLE'
答案 1 :(得分:0)
据我所知,第一种方法将更快更有效。 如果您看到执行计划,表插入的额外成本将添加到第二种方法中。
第一种方法的执行计划:
第二种方法的执行计划:
答案 2 :(得分:0)
为什么世界上你会认为两个选择比一个快?
为什么不从tab1中选择col1,col2 ......?
在这两种情况下,你都有一个选择 表上的选择比表变量上的选择
更快所以你所做的就是增加插入表变量的开销,以获得效率较低的选择
表变量存储在tempdb中 Microsoft对表变量的使用有各种警告
[Table variable][1]
对于一个不使用超过100行的人 它没有索引
真的,如果tab1有一百万行,并且将其限制为10 你真的认为在@ tab2中插入一百万行会使它更快吗?