我是一个全栈开发人员,对SQL知之甚少。
考虑下面的代码->
(我已经将我的大问题减少到这里,以确定我的疑虑)
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的唯一值执行?我正在尝试优化查询。
发布于 2020-08-04 17:47:26
您可以尝试:
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
发布于 2020-08-04 17:49:47
SQL存储函数(或存储过程)可以是确定性的。这意味着你的函数的结果只依赖于它的输入值,而不依赖于其他东西。例如,GETDATE()不是确定性的,而SQRT((x * x) + (y * y))是确定性的。
当函数是确定性函数时,服务器优化器会避免对相同的值多次调用该函数。如果函数不是确定性的,那么服务器优化器通常就没有这种自由。
如果您的函数包含SQL,那么明智的做法是将查询重构为联接或类似的结构,将函数的SQL直接放入查询中。这将允许MySQL优化器以尽可能好的方式合并其操作。
无论如何,您的示例将为File.fileId中的每个值调用您的函数。您可以通过使用嵌套查询强制它只处理不同的值,如下所示。
SELECT get_lowest_due_date(fileId)
FROM (
SELECT DISTINCT f.fileId
FROM File f
JOIN Order o
ON o.fileId = f.fileId
) f发布于 2020-08-04 17:49:13
从select语句返回的每一行都会调用标量函数,是的,标量函数不能很好地执行。
您可以将此标量函数转换为内联表值函数(以便表返回一个表,而不是标量值),并使用CROSS APPLY或OUTER APPLY调用该函数。
函数定义:
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
);你的新查询:
SELECT *
FROM File f
JOIN Order o
ON o.fileId = f.fileId
CROSS APPLY get_lowest_due_date(f.fileId)https://stackoverflow.com/questions/63244029
复制相似问题