2012-01-11 41 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. 第一看起来更好,因为可以通过服务器进行优化,如果任何参数为空