当前位置: 首页 > 面试题库 >

sql查询中函数执行的顺序是什么?

单于浩邈
2023-03-14
问题内容

如果我构建自己的函数“ myfunction”并执行以下查询:

select
myfunction(parameters)
from
mytable
where
a and b and c and d

如果mytable有100万行,但是在我之后只有100行。当我执行此查询时,myfunction将执行100或100万行吗?

在这种情况下会发生什么?

select
myfunction(parameters)
from
mytable
where
a and b and c and d and myfunction(parameters) == e

问题答案:

在第一个示例中,它将仅执行100次。您可以通过在函数中添加调试调用来验证这一点:

create table mytable (a, b) as select mod(level, 10), level from dual connect by level <= 50;

create or replace function myfunction(p number)
return number as
begin
  dbms_output.put_line('In function for p=' || p);
  return mod(p,3);
end;
/

set serveroutput on

select myfunction(b)
from mytable
where a = 1;

MYFUNCTION(B)
-------------
            1
            2
            0
            1
            2

In function for p=1
In function for p=11
In function for p=21
In function for p=31
In function for p=41

仅针对与where子句筛选器匹配的行调用该函数。但是,据我所知,这并不能保证。

在第二个示例中,它要复杂得多,并且在很大程度上取决于优化程序。在我的简单演示中,优化器(在本例中为11gR2)首先进行评估a,并且仅针对与之匹配的行调用该函数;但随后会再次为select-
list值调用它:

select myfunction(b)
from mytable
where a = 1
and myfunction(b) = 2;

MYFUNCTION(B)
-------------
            2
            2

In function for p=1
In function for p=11
In function for p=11
In function for p=21
In function for p=31
In function for p=41
In function for p=41

a=1与以前一样,对五行中的每一行调用该函数,对于myfunction(b) = 2第二次被调用的函数,则调用该函数以获取结果集中的值。

同样,对于此示例,您可能认为不会改变这种行为的事情。所有这些都获得完全相同的输出:

select myfunction(b)
from mytable
where myfunction(b) = 2
and a = 1;

select x
from (
  select myfunction(b) as x
  from mytable
  where a = 1
)
where x = 2;

select x
from (
  select /*+ materialize */ myfunction(b) as x
  from mytable
  where a = 1
)
where x = 2;

with t (x) as (
  select myfunction(b)
  from mytable
  where a = 1
)
select x
from t
where x = 2;

优化器在内部将它们全部重写为同一查询,您仍然会获得全部七个函数调用。添加未记录的提示会更改它:

with t (x) as (
  select /*+ materialize */ myfunction(b)
  from mytable
  where a = 1
)
select x
from t
where x = 2;

         X
----------
         2
         2

In function for p=1
In function for p=11
In function for p=21
In function for p=31
In function for p=41

但您不能(或不应)真正使用或依赖它。

索引,分区,优化器版本,统计资料等,都将影响到如何对优化器的行为 您的 查询。

和其他需要考虑的事情一样,您可以具有基于函数的索引或确定性函数…

所以…这取决于。



 类似资料:
  • 问题内容: 假设我将与关联的表存储如下(代表事件的时间戳): 这样我们可以说: 用户1具有ADBCB的事件序列 用户2具有事件序列BBAAC 我想针对这些用户回答的问题类型非常容易表达为事件序列的常规表达式,例如“哪些用户的事件序列与A. * B匹配?” 或“哪些用户的事件序列与A [^ C] * B [^ C] * D匹配?” 等等。 在此表结构上可以用来回答类似查询的SQL技巧或运算符是什么?

  • 问题内容: 在MySQL中执行子句的预定义顺序是什么?它是否在运行时确定,并且此顺序正确吗? 问题答案: MySQL语句的实际执行有些棘手。但是,该标准确实指定了查询中元素解释的顺序。这基本上是在您指定的顺序,但我想和能来后: 条款 条款 条款 条款 条款 条款 这对于了解如何解析查询很重要。例如,您不能使用在子句中的定义的列别名,因为会在之前解析。另一方面,这样的别名可以在子句中。 至于实际执行

  • 问题内容: 假设我有一个查询“ select * from子句,其中id在(0,2,5,1,3)中”,我实际上希望返回的行以它们在where子句中指定的相同顺序返回。ID的顺序将随查询的不同而改变,并且该顺序没有模式。 我知道可以更改数据模型,创建临时表等。但是请相信我,这些类型的解决方案在我的情况下将行不通。我也无法在应用程序代码中更改结果对象的顺序。 我还知道,不同的数据库引擎对事物的排序方式

  • Query 也可以直接执行一个SQL查询,即Select命令。在Postgres中支持原始SQL语句中使用 ` 和 ? 符号。 sql := "select * from userinfo" results, err := engine.Query(sql) 当调用 Query 时,第一个返回值 results 为 []map[string][]byte 的形式。 Query 的参数也允许传

  • 问题内容: 指令功能的执行顺序是什么?该文档似乎没有解决此问题。 防爆 template / templateUrl(已评估) 控制器 编译 链接 从下面的答案中:http ://plnkr.co/edit/79iyKSbfxgkzk2Pivuak(插件显示嵌套和兄弟指令) 模板被解析 (在编译中对模板所做的更改会扩展到链接功能) 问题答案: 预链接功能:在链接子元素之前执行。执行DOM转换并不安

  • 问题内容: 我已经读过这个问题,我的一个同事让我感到怀疑: 在过滤查询中,何时应用过滤器?在执行查询之前还是之后?什么时候缓存结果? 如果事先应用了过滤器,那么在过滤器中复制查询部分不是一件好事吗?如果之后应用了筛选器,那么我将无法理解缓存的内容。 问题答案: 幸运的是,ES为您提供了两种类型的过滤器供您使用: 在第一种情况下,过滤器将应用于查询找到的所有文档。在第二种情况下,将在查询运行之前过滤