2015-06-02 65 views
-1

我有下面提到的兩種方法來完成一項任務。 1st從表中直接多次選擇,第二次從表中選擇所需的列到表變量中,然後多次使用該表變量。哪一個表現會更好,爲什麼?表Vs表變量

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) 
+1

哪一個SQL查詢分析說會更好? –

+0

@PaulHadfield測試期間第一種方法看起來更好,但是當tab2中有兩倍或三倍的記錄時它會保持它的優勢嗎? – yogi

+4

告訴服務器*你想要*,而不是*如何做*。對於一張小桌子,表格可能會被完全加載到內存中,所以第二次掃描的成本應該可以忽略不計。對於大型表格,您現在正迫使數據庫爲其分配*額外*存儲空間,這是因爲您不相信優化器能夠完成其工作。編寫簡單易懂的代碼,只有在* measured *性能不符合你的性能*目標時纔開始玩弄事物(如果你沒有後者,你怎麼知道你什麼時候「完成」了? ) –

回答

0

編輯:我不理解這個問題。忘記我的答案。請。

我不認爲你的2個方法之間的性能有任何差異,因爲唯一的區別是檢索你的列的微小請求,這應該是微不足道的。

第二種方法獲得的好處是,如果將來更改列名稱,則不需要更新腳本。

PS: 我認爲你的查詢來檢索你的列是不完全正確的。你不是在這裏檢索列名,而是數據。我不知道你的DBMS,但如果它的甲骨文,它應該是這樣的:

SELECT column_name 
FROM USER_TAB_COLUMNS 
WHERE table_name = 'MYTABLE' 
+0

微小的要求?如果tab1有一百萬行呢? – Paparazzi

+0

這個微小的請求是一個獲取列名稱的請求。所以我不認爲它可以有數百萬列。 – Caillou

+0

你從哪裏得到那個tab2只是列名的列表? – Paparazzi

0

根據我的第一種方法會更快,效率更高。 如果你看到執行計劃,則表格插入的額外成本將被添加到第二種方法中。對於第一種方法

執行計劃:

enter image description here

+0

親愛的@shavari請參閱Damien_The_Unbeliever評論, –

0

世界爲什麼你會認爲2個選擇比一個快:對於第二種方法

enter image description here

執行計劃?

你爲什麼不直接從tab1中選擇col1,col2 ......?

在這兩種情況下,你有一個選擇,其中
一個選擇上表是對錶varible比選擇更快

因此,所有你做的是增加插入到表變量的開銷獲得效率較低選擇

表變量存儲在tempdb
微軟有各種警示中使用表變量的

[Table variable][1] 

對於一個未使用的100多個行
它沒有索引

真的要是TAB1有一百萬行和它僅限於10
你真的想插入一百萬行改成@ TAB2是要讓它變得更快?