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

用户定义标量函数的SQL*服务器常量值-性能

  •  1
  • user340535  · 技术社区  · 14 年前

    我有一个查询,当运行如下时,它的性能非常好:

    SELECT YADAYADA FROM MYTABLE WHERE FVAL <= 100 AND TVAL >= 100
    

    由于有一个索引(fval,tval),查询是完全最优的,因为整个查询都是非聚集索引搜索。

    现在,最好在这里使用从用户定义函数返回的常量。函数将返回 整个交易 ,而不仅仅是这个查询。但是这样做:

    SELECT YADAYADA FROM MYTABLE WHERE FVAL <= dbo.myVal() AND TVAL >= dbo.myVal()
    

    产生次优结果-查询计划不再像索引搜索那样运行良好,而是坚持搜索,然后 过滤 ,这显然是 更慢-即使在这个例子中,我的函数被定义为在这个非常简单的情况下返回一个常量值。

    我试过使用中间条款-没有更好的。我已经尝试了表值函数,没有更好的(事实上,查询计划变得更快更复杂)。

    任何 说服SQL*服务器“嘿,伙计,这是一个 常数 我们在这里得到的价值,并相应地优化计划??

    2 回复  |  直到 14 年前
        1
  •  1
  •   Adam Robinson    14 年前

    最好是在查询中声明一个变量,将udf的值赋给该变量,然后在查询中使用该变量。

        2
  •  1
  •   root    13 年前

    sql server试图变得聪明,并建议查询的值是什么,但有时开发人员知道得更好。

    下面的概念应该可以帮助您

    DECLARE @fval INT
    DECLARE @tval INT
    SET @fval = dbo.myVal()
    SET @tval = dbo.myVal()
    
    SELECT YADAYADA FROM MYTABLE WHERE FVAL <= @fval AND TVAL >= @tval
    OPTION (OPTIMIZE FOR(@fval= 100, @tval = 100))