Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 表与表变量_Sql Server_Performance_Tsql - Fatal编程技术网

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_异教徒的评论,