代码之家  ›  专栏  ›  技术社区  ›  klashar

ISNULL或具有更好的性能吗?

  •  1
  • klashar  · 技术社区  · 16 年前

    我有SQL查询:

    SELECT ISNULL(t.column1, t.column2) as [result]
    FROM t
    

    WHERE ISNULL(t.column1, t.column2) = @filterValue
    

    或:

    WHERE t.column1 = @filterValue OR t.column2 = @filterValue
    

    更新:对不起,我忘了提一下,如果列1被填充,那么列2总是空的。

    4 回复  |  直到 16 年前
        1
  •  5
  •   paxdiablo    16 年前

    量,别猜! 这是您应该自己做的事情,使用类似于生产的数据。 不知道你的数据的组成,这就有很大的不同。

    column3 储存 column1 column2 如果 第1栏

    然后我会有一个insert/update触发器来正确填充该列,索引它并使用尖叫女妖速度:

    select t.column3 as [result] from t
    

    这个 大多数数据库的读取频率高于写入频率,最好是尽可能少地执行此计算(即,当数据更改时,而不是每次选择时)。如果希望数据库具有可伸缩性,请不要使用每行函数。

    如果再添加一个列和触发器是不可能的,我会选择 or

    另一个选择,马克布给了,但因为删除了他的答案,所以我不得不去寻找 另一个 很好的答案是使用 UNION ALL . 如果您的DBMS不够聪明,无法识别 OR 作为一个并行性的机会,它可能足够聪明地认识到 联合所有人

    select column1 as c from t where column1 is not NULL
    union all
    select column2 as c from t where column1 is NULL
    

        2
  •  1
  •   Floyd user1988754    16 年前

    在一个在Col1和Col2上有13.000.000个条目和索引的MSSQL表(MSSQL 2000)上,我得到以下结果:

    select top 1000000 * from Table1 with(nolock) where isnull(Col1,Col2) > '0'
    -- Compile-Time: 4ms
    -- CPU-Time: 18265ms
    -- Elapsed-Time: 24882ms = ~25s
    
    select top 1000000 * from Table1 with(nolock) where Col1 > '0' or (Col1 is null and Col2 > '0')
    -- Compile-Time: 9ms
    -- CPU-Time: 7781ms
    -- Elapsed-Time: 25734 = ~26s
    

    第一个语句需要较少的编译时间,但需要更多的cpu时间来执行(culstered索引扫描)。

    重要的是要知道,许多存储引擎都有一个优化器,它可以重新组织存储以获得更好的结果和执行时间。最终,这两条语句将由优化器重建为基本相同的语句。

        3
  •  0
  •   Nordic Mainframe    16 年前

    我认为,你的替代表达并不意味着相同。假设filterValue为 2 ,那么 ISNULL(1,2)=2 是假的,但是 1=2 or 2=2 这是真的。您需要的表达式更像:

     (c1=filter) or ((c1 is null) and (c2 = filter));
    

    服务器有可能从上的索引中回答此问题 c1 . 解决方案的第一部分是索引扫描 c1=filter c1=null 然后线性搜索 c2=filter . 我甚至可以说聚集索引 (c1,c2) 可以在这里工作。

    OTOH,您应该在做出这样的假设之前进行度量,除非您对实现有深入的了解,否则在SQL中推测通常不起作用。例如,我很确定查询规划人员已经知道了这一点 ISNULL(X,Y)

        4
  •  0
  •   klashar    15 年前

    得到以下结果:

    两种方法的效果几乎相同 估计子树成本 公制。 或者 该方法具有更准确的预测价值 估计行数 公制。

    比为 接近。