首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL优化-对于连接查询中的每个不同的id,只执行一次函数

SQL优化-对于连接查询中的每个不同的id,只执行一次函数
EN

Stack Overflow用户
提问于 2020-08-04 17:36:03
回答 4查看 400关注 0票数 0

我是一个全栈开发人员,对SQL知之甚少。

考虑下面的代码->

(我已经将我的大问题减少到这里,以确定我的疑虑)

代码语言:javascript
复制
    SELECT get_lowest_due_date(f.fileId)
    FROM File f
    JOIN Order o 
     ON o.fileId =  f.fileId

    File

    fileId     fileName
    --------------------
    1            file1
    2            file2

    Order

    orderId     orderName      fileId
    ----------------------------------
    1            order1           1
    2            order2           1
    3            order3           2

我相信对于Join查询返回的所有fileId值(即使是重复的),都会执行get_lowest_due_date()

有没有什么办法可以让函数只对fileId的唯一值执行?我正在尝试优化查询。

EN

回答 4

Stack Overflow用户

发布于 2020-08-04 17:47:26

您可以尝试:

代码语言:javascript
复制
SELECT get_lowest_due_date(a.fileId)
FROM (SELECT f.fileId 
      FROM File f
      JOIN Order o 
      ON o.fileId =  f.fileId
      GROUP BY f.fileId) a

内部查询返回唯一的fileIds

票数 1
EN

Stack Overflow用户

发布于 2020-08-04 17:49:47

SQL存储函数(或存储过程)可以是确定性的。这意味着你的函数的结果只依赖于它的输入值,而不依赖于其他东西。例如,GETDATE()不是确定性的,而SQRT((x * x) + (y * y))是确定性的。

当函数是确定性函数时,服务器优化器会避免对相同的值多次调用该函数。如果函数不是确定性的,那么服务器优化器通常就没有这种自由。

如果您的函数包含SQL,那么明智的做法是将查询重构为联接或类似的结构,将函数的SQL直接放入查询中。这将允许MySQL优化器以尽可能好的方式合并其操作。

无论如何,您的示例将为File.fileId中的每个值调用您的函数。您可以通过使用嵌套查询强制它只处理不同的值,如下所示。

代码语言:javascript
复制
 SELECT get_lowest_due_date(fileId)
   FROM (
           SELECT DISTINCT f.fileId
             FROM File f
            JOIN Order o 
                 ON o.fileId =  f.fileId
        ) f
票数 1
EN

Stack Overflow用户

发布于 2020-08-04 17:49:13

从select语句返回的每一行都会调用标量函数,是的,标量函数不能很好地执行。

您可以将此标量函数转换为内联表值函数(以便表返回一个表,而不是标量值),并使用CROSS APPLY或OUTER APPLY调用该函数。

函数定义:

代码语言:javascript
复制
CREATE FUNCTION dbo.get_lowest_due_date (@fileId INT)
RETURNS TABLE 
AS
RETURN 
(
  /* or whatever your logic is */
 SELECT Value from SomeTable WHERE fileId = @fileId
);

你的新查询:

代码语言:javascript
复制
 SELECT *
    FROM File f
    JOIN Order o 
     ON o.fileId =  f.fileId
    CROSS APPLY  get_lowest_due_date(f.fileId)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63244029

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档