2012-01-11 42 views
0

2相關的問題:在sql server中的性能?


問題#1:

我有一個與爲myTable id , name , lastname

id是種子(PK)。

name有索引。 //不能nullAble。

哪個查詢速度更快?

  • select id , name , lastname from mytable where name = name //(name has index on it!)

  • select id , name , lastname from mytable

問題#2: * 現在讓我們假設吶我是空的。 *

從第一樣品

有選擇查詢SP其它的參數是@name + @lastName

(返回的所有行name = @namelastName= @lastName

哪個查詢是快?

select id , name , lastname from mytable where 
    (@name is null or [email protected]) 

and 

    (@lastName is null or [email protected]) 

這裏如果@name或@LastName是空 - 所以它不會比較名稱= @名

select id , name , lastname from mytable where 
     (name = isNull(@name,name)) 

    and 

     (lastName= isNull(@lastName,lastName)) 

這裏,如果@name或@ lastName爲空,所以有仍然將是均衡 的name= namelastName=lastName,我認爲這是不好的 表現。

請幫忙?

+0

'name'是可空的嗎?如果是這樣,「問題#1」中的查詢就不一樣了。 – 2012-01-11 12:35:04

+0

@MartinSmith沒有那樣的。我只是認爲,如果我加了哪裏有索引 - 所以它會更快....不是? – 2012-01-11 12:35:12

+0

我刪除了我剛剛回復的第一條評論,並將其替換爲另一條評論... – 2012-01-11 12:35:59

回答

1

如前所述,前兩個查詢是等價的。

name = name總會評價爲真,並且基本上會是一個不斷的評價。這兩個查詢都將運行表掃描。

後面兩個查詢也應該是等效的。

ISNULLISNULL可能會稍微快一些,但我懷疑它 - 優化程序將其擴展爲CASE語句,因此它可能會短路。

+0

name = name - 將要評估每一行...所以我認爲它的心臟表現...不? – 2012-01-11 12:38:18

+1

@RoyiNamir否 - 不是,如果名稱爲空 - 那麼它不會返回該行 – 2012-01-11 12:46:15

+0

@RoyiNamir'name = name'是一個無意義的評估,相當於'1 = 1'。它不會被檢查每一行。 – JNK 2012-01-11 13:17:40

0
  1. 雙方執行,除非你的表是充滿 NULL名字,只有幾個名字一樣有一個值 - 然後1日將執行更快,因爲更少的行會返回
  2. 第一看起來更好,因爲可以通過服務器進行優化,如果任何參數爲空