ISNULL或OR有更好的表现吗?

kla*_*har 1 sql performance

我有SQL查询:

SELECT ISNULL(t.column1, t.column2) as [result]
FROM t
Run Code Online (Sandbox Code Playgroud)

我需要通过[result]列过滤掉数据.从下面列出的两个方面来看,有关绩效的最佳方法是什么:

WHERE ISNULL(t.column1, t.column2) = @filterValue
Run Code Online (Sandbox Code Playgroud)

要么:

WHERE t.column1 = @filterValue OR t.column2 = @filterValue
Run Code Online (Sandbox Code Playgroud)

更新:对不起,我忘了提到如果column1被填充,column2始终为null.

pax*_*blo 5

测量,不要猜!这是你自己应该做的事情,有类似生产的数据.我们不知道您的数据的构成,这会产生很大的不同.

话虽如此,我不会这样做.我创建了另一列,如果非NULL 则column3存储column1,column2如果column1为NULL.

然后我有一个插入/更新触发器来正确填充该列,索引它并使用screaming-banshee-speed:

select t.column3 as [result] from t
Run Code Online (Sandbox Code Playgroud)

浩瀚广大的数据库往往比读取写入,如果这个计算的几十倍地完成它的更好(即,当数据变化,而不是每次你选择它的时间).如果您希望数据库可伸缩,请不要使用每行函数.

牺牲磁盘空间的速度是完全有效的,触发器确保数据不会变得不一致.

如果添加另一个列和触发器是or不可能的,我会选择解决方案,因为它通常可以由更智能的DBMS引擎拆分为两个并行查询.

MarkB给出了一个替代方案,但是由于删除了他的答案,所以我将不得不去寻找他的另一个好的答案:up -ote :-),就是用UNION ALL.如果您的DBMS不够聪明,无法将其OR视为并行机会,那么UNION ALL在该上下文中可能足够聪明,例如:

select column1 as c from t where column1 is not NULL
union all
select column2 as c from t where column1 is NULL
Run Code Online (Sandbox Code Playgroud)

但同样,它取决于您的数据库和数据.智能DBA会将整个事物放在存储过程中,这样如果数据更改其属性,它们就可以无缝地交换新方法.

  • +2表示"测量,不要猜测".-1表示触发器.所以这总体上是+1.:) (2认同)