Sql server 表与表变量
我在下面提到了完成一项任务的两种方法。 第一种方法是多次直接从表中选择,第二种方法是首先将表中所需的列选择到表变量中,然后多次使用该表变量。哪一个表现更好?为什么Sql server 表与表变量,sql-server,performance,tsql,Sql Server,Performance,Tsql,我在下面提到了完成一项任务的两种方法。 第一种方法是多次直接从表中选择,第二种方法是首先将表中所需的列选择到表变量中,然后多次使用该表变量。哪一个表现更好?为什么 declare @var1 varchar(10), @var2 varchar(10) ---------------------------------------------------------------------------- -- 1st approach -----------
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)
编辑:我不理解这个问题。忘了我的答案吧。求你了 我认为这两种方法在性能上没有任何区别,因为唯一的区别是检索列的请求很小,这应该可以忽略不计 第二种方法的好处是,如果将来更改列名,则无需更新脚本 附言: 我认为您检索列的查询不太正确。您在这里检索的不是列名,而是数据。我不知道您的DBMS,但如果它是Oracle,它应该类似于:
SELECT column_name
FROM USER_TAB_COLUMNS
WHERE table_name = 'MYTABLE'
根据我的说法,第一种方法将更快、更有效。 如果您看到执行计划,表插入的额外成本将添加到第二种方法中 第一次进近的执行计划: 第二种方法的执行计划:
你到底为什么认为两次选择比一次选择快 为什么不从tab1 where中选择col1、col2 在这两种情况下,您都有一个“选择位置”选项 表上选择比表上选择变量快 因此,您所做的只是增加了插入表变量以获得效率较低的select的开销 表变量存储在tempdb中 Microsoft在使用表变量时有各种各样的警告
[Table variable][1]
对于一个不用于超过100行的
它没有索引
如果tab1有一百万行,而where将其限制为10行,该怎么办
你真的认为在@tab2中插入一百万行会让它更快吗 SQL查询分析认为哪一种性能更好?@PaulHadfield在测试1时的方法看起来更好,但当tab2中记录量达到两倍或三倍时,它会保持优势吗?告诉服务器你想要什么,而不是如何做。对于一个小表,该表可能会完全加载到内存中,因此第二次扫描的成本应该可以忽略不计。对于一个大型表,您现在强制数据库为其分配额外的存储,只是因为您不信任优化器来完成它的工作。编写简单易懂的代码,只有在衡量的性能不符合您的性能目标时才开始处理问题,如果您没有后者,您如何知道何时完成?在tab2中的一些记录上面,table变量太大,无法存储在内存中,此时它将交换到磁盘。一旦发生这种情况,2d方法应该比第一种方法花费更长的时间,因为您正在有效地写入和读取tab2中的每个记录两次。添加到Damien中,您可以尝试执行负载测试并查看resultsTiny请求?如果tab1有一百万行呢?这个微小的请求就是获取列名的请求。所以我不认为它可以有数百万列。你从哪里得到tab2只是一个列名列表?哦。。我的错。。我不太明白。亲爱的@shavari,请看Damien_异教徒的评论,