SQL Server如何在后台执行此查询

时间:2009-07-11 23:34:45

标签: sql sql-server performance

SELECT 
    *
FROM 
    myTable
WHERE 
    field1 LIKE 'match0' AND
    myfunc(t1.hardwareConfig) LIKE 'match1'

这是我的问题,

field1的匹配快速而快速,但myfunc需要永远返回,我想确保如果field1不匹配,它甚至不会尝试执行myfunc。

SQL会知道这个还是我可以在查询中明确说明?

我正在使用MSSQL 2000,2005和2008,希望有一个共同的答案。

5 个答案:

答案 0 :(得分:7)

要强制执行评估条件的顺序,请使用以下方法,因为记录了CASE保留评估条件的顺序。

SELECT 
        *
FROM 
        myTable
WHERE 
  CASE WHEN field1 LIKE 'match0' THEN 
    CASE WHEN myfunc(t1.hardwareConfig) LIKE 'match1' 
      THEN 1 
    END 
  END = 1

以下文章详细解释了它:Predicates in SQL

答案 1 :(得分:1)

在幕后有很多事情要确定查询是如何执行的,但在这种情况下我会期待它首先在field1上进行过滤。请注意,这不是一个保证 - 查询优化器可以偶尔做出一些奇怪的选择。此外,您可以使用'='运算符而不是'LIKE'运算符来提高您的机会。

答案 2 :(得分:1)

mysp不能是存储过程。它必须是用户定义的函数(顺便说一句,您应该使用其模式名称进行限定)。用户定义的功能被限制为无副作用,并且应遵守某些规则。实质上,SQL Server将组合查询并将其作为单个模块执行,并具有单个执行计划。这不是你所期望的程序函数调用。 SQL描述了要做什么,而不是如何做,查询优化器将生成一个响应完整查询的计划,而不是单独的每个部分。观点也是如此。

答案 3 :(得分:1)

在SQL Server Management Studio(2008和我认为2005)中,您可以告诉它向您显示执行计划。在查询窗口中按Control-M。然后执行查询。这将向您展示细节。

答案 4 :(得分:0)

myfunc只是一个复杂的计算,或者返回值是否经常变化。我想知道,因为如果它不经常改变,这是一个经常执行的查询,可能更好的设计有一个后插入触发器计算值并将其作为单独的列存储在表中。然后,您不必担心评估哪些订单。查询甚至可能运行得更快,尤其是如果您在两列上都有索引。