Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql AYS\u订单\u批次将调用1000000次,一次用于 每行 如果900000行在VALIDATE_TODAYS_ORDER_批次中通过验证,则POST_TODAYS_ORDER_批次将调用900000次 如果只有850000行成功过帐,那么VALIDATE_TODAYS_ORDER_BATCH需要关闭一些漏洞LOL,DATA_WAREHOUSE_TODAYS_ORDER_BATCH将调用850000次 如果850000行成功进入数据仓库(即,未生成其他异常),则表TODAYS\u ORDER\u PROCESSING\u异常将填充1000000-850000=150000个异常行_Sql_Postgresql - Fatal编程技术网

Sql AYS\u订单\u批次将调用1000000次,一次用于 每行 如果900000行在VALIDATE_TODAYS_ORDER_批次中通过验证,则POST_TODAYS_ORDER_批次将调用900000次 如果只有850000行成功过帐,那么VALIDATE_TODAYS_ORDER_BATCH需要关闭一些漏洞LOL,DATA_WAREHOUSE_TODAYS_ORDER_BATCH将调用850000次 如果850000行成功进入数据仓库(即,未生成其他异常),则表TODAYS\u ORDER\u PROCESSING\u异常将填充1000000-850000=150000个异常行

Sql AYS\u订单\u批次将调用1000000次,一次用于 每行 如果900000行在VALIDATE_TODAYS_ORDER_批次中通过验证,则POST_TODAYS_ORDER_批次将调用900000次 如果只有850000行成功过帐,那么VALIDATE_TODAYS_ORDER_BATCH需要关闭一些漏洞LOL,DATA_WAREHOUSE_TODAYS_ORDER_BATCH将调用850000次 如果850000行成功进入数据仓库(即,未生成其他异常),则表TODAYS\u ORDER\u PROCESSING\u异常将填充1000000-850000=150000个异常行,sql,postgresql,Sql,Postgresql,本例中的表函数调用仅返回单个列,但它们可能返回多个列。例如,验证订单行的表函数可以返回订单验证失败的原因 在这种设计中,实际上消除了HLL和数据库之间的所有干扰,因为HLL请求者要求数据库在一个请求中处理整个批次。这将减少数百万个对数据库的SQL请求,大量删除数百万个HLL过程或方法调用,并因此提供了巨大的运行时改进。相反,通常一次只处理一行的遗留代码通常会发送1000000个fetch SQL请求,今天的订单批处理中每行1个,加上至少1000000个HLL和/或SQL请求以进行验证,再加上至少

本例中的表函数调用仅返回单个列,但它们可能返回多个列。例如,验证订单行的表函数可以返回订单验证失败的原因

在这种设计中,实际上消除了HLL和数据库之间的所有干扰,因为HLL请求者要求数据库在一个请求中处理整个批次。这将减少数百万个对数据库的SQL请求,大量删除数百万个HLL过程或方法调用,并因此提供了巨大的运行时改进。相反,通常一次只处理一行的遗留代码通常会发送1000000个fetch SQL请求,今天的订单批处理中每行1个,加上至少1000000个HLL和/或SQL请求以进行验证,再加上至少1000000个HLL和/或SQL请求以进行过账,加上1000000个HLL和/或SQL请求,用于将订单发送到数据仓库。当然,使用这种表函数设计,表函数内部的SQL请求被发送到数据库,但是当数据库向自身发出请求时(即从表函数内部),SQL请求的服务速度要快得多(特别是与HLL请求者从远程系统执行单行处理的遗留场景相比,最坏的情况是通过WAN-OMG,请不要这样做)

如果使用表函数“获取结果集”,则很容易遇到性能问题然后将该结果集连接到其他表。在这种情况下,SQL优化器无法预测表函数将返回哪一组行,因此无法优化到后续表的连接。因此,我很少使用它们获取结果集,除非我知道结果集的行数非常少,hence不会导致性能问题,或者我不需要连接到后续表

在我看来,表函数未得到充分利用的一个原因是,它们通常被视为获取结果集的工具,而结果集的性能往往很差,因此它们被认为是一个“糟糕”的工具

表函数对于将更多功能推送到服务器、消除数据库服务器和远程系统上的程序之间的大部分聊天,甚至消除数据库服务器和同一服务器上的外部程序之间的聊天,都非常有用。即使是同一服务器上的程序之间的聊天,也会带来表函数的强大功能的核心在于使用它们在结果集处理中执行操作


有更多的高级设计模式用于使用基于上述模式的表函数,您可以进一步最大化结果集处理,但这篇文章对于大多数人来说已经很难理解了。

将一个集合返回函数的结果传递到另一个函数中的正确方法是什么?:没有,因为函数不匹配ept resultsets作为输入。可能让人产生相反想法的是
select xxs(xs())
正在工作,但这是一个特例,是一个黑客。它实际上调用
xs()
一次,在行上迭代,调用
xss(x)
对于每个查询。如果您想传递结果集,请使用光标。@DanielVérité我开始担心这种情况。我觉得奇怪的是,我们可以:(I)从子查询中选择,例如,
select*from(select…
;(ii)编写从查询中返回结果集的函数,例如,
创建函数foo()…从…
中选择*;以及(iii)从这些函数的返回值中选择,例如,
select*from foo()
;但不能(iv)再抽象出一个级别,并执行
创建函数栏的soime变体(X)…从X中选择@DanielVérit与此同时,我将研究游标,但这似乎是一个遗漏[这门语言的新手说;)]因为在大多数语言中,如果你可以用对一个函数的调用来替换一个表达式,这个函数以表达式为主体,那么你也可以用一个变量来替换函数调用,这个变量保存了之前对函数调用的结果。但是正如我所说的,我在这里是一个新手,所以我没有任何接近这个角度的东西在其他情况下,可能有一些很好的理由我还没有看到。你收到“函数xxs(x)不存在”的原因,这是因为数据库倾向于支持函数重载,其中可以有多个函数具有相同的函数名,但每个函数具有不同的参数集。因此,在运行时,当它尝试查找函数时,它会同时使用函数名和参数来查找函数的正确副本。函数xxs(x)显然存在,但不接受结果集作为输入。@MikeJones
xxs(x)
中的
x
是参数的类型(因为
x
是表的名称)。奇怪的是,
xs()
返回一个
集合x
,系统正在寻找一个接受单个
x
的函数。正如上面DanielVerite所解释的,原因是xxs(xs())实际上正在调用xs(),返回结果(一组x)并尝试对每个函数调用xxs(…),这意味着xxs(x)是nee
select * from (select * from foo ...) 
create function foos() 
returns setof foo
language sql as $$
  select * from foo ...
$$;

select * from foos()
create function more_foos( some_foos setof foo )
language sql as $$
  select * from some_foos ...  -- or unnest(some_foos), or ???
$$:

select * from more_foos(foos())
-- 1. create a table x with three rows                                                                                                                                                            
drop table if exists x cascade;
create table if not exists x (id int, name text);
insert into x values (1,'a'), (2,'b'), (3,'c');

-- 2. xs() is a function with type `setof x`
create or replace function xs()
returns setof x
language sql as $$
  select * from x
$$;

-- 3. xxs() should return the context of x, too
--    Ideally the argument would be a `setof x`,
--    but that's not allowed (see below).
create or replace function xxs(x[])  
returns setof x
language sql as $$
  select x.* from x
  join unnest($1) y
       on x.id = y.id
$$;
create table TODAYS_ORDER_PROCESSING_EXCEPTIONS as (

select      TODAYS_ORDER_BATCH.*
           ,VALIDATION_RESULT.ROW_VALID
           ,POST_RESULT.ROW_POSTED
           ,WAREHOUSE_RESULT.ROW_WAREHOUSED

from        TODAYS_ORDER_BATCH

cross join  VALIDATE_TODAYS_ORDER_BATCH ( ORDER_NUMBER, [either pass the remainder of the order columns or fetch them in the function]  ) 
              as VALIDATION_RESULT ( ROW_VALID )  --example: 1/0 true/false Boolean returned

left join   POST_TODAYS_ORDER_BATCH ( ORDER_NUMBER, [either pass the remainder of the order columns or fetch them in the function] )
              as POST_RESULT ( ROW_POSTED )  --example: 1/0 true/false Boolean returned
      on    ROW_VALIDATED = '1'

left join   DATA_WAREHOUSE_TODAYS_ORDER_BATCH ( ORDER_NUMBER, [either pass the remainder of the order columns or fetch them in the function] )
              as WAREHOUSE_RESULT ( ROW_WAREHOUSED )  --example: 1/0 true/false Boolean returned
      on    ROW_POSTED = '1'

where       coalesce( ROW_VALID,      '0' ) = '0'   --Capture only exceptions and unprocessed work.  
      or    coalesce( ROW_POSTED,     '0' ) = '0'   --Or, you can flip the logic to capture only successful rows.
      or    coalesce( ROW_WAREHOUSED, '0' ) = '0'

) with data