gpt4 book ai didi

sql - 这是编写 SQL 查询的低效方法吗?

转载 作者:行者123 更新时间:2023-12-01 11:55:40 25 4
gpt4 key购买 nike

假设我有一个 View ,如下所示:

CREATE VIEW EmployeeView 
AS
SELECT ID, Name, Salary(PaymentPlanID) AS Payment
FROM Employees

用户定义的函数 Salary 有点昂贵。

如果我想做这样的事情,

SELECT *
FROM TempWorkers t
INNER JOIN EmployeeView e ON t.ID = e.ID

Salary 会在 Employees 的每一行上执行,还是会先执行连接,然后仅在连接过滤的行上调用?如果 EmployeeView 是子查询或表值函数而不是 View ,我是否可以期待相同的行为?

最佳答案

该函数只会在相关的地方被调用。如果您的最终选择语句不包含该字段,则根本不会调用它。如果您的最终选择引用了表格的 1%,则只会针对表格的那 1% 调用它。

对于子查询/内联 View ,这实际上是相同的。您可以为子查询中的字段指定函数,然后永远不要使用该字段,在这种情况下永远不会调用该函数。


顺便说一句:标量函数在很多方面确实是出了名的昂贵。您可能可以通过将其形成为内联表值函数来降低成本。

SELECT
myTable.*,
myFunction.Value
FROM
myTable
CROSS APPLY
myFunction(myTable.field1, myTable.field2) as myFunction

只要 MyFunction 是内联的(不是多语句)并且每组输入只返回一行,这通常比标量函数具有更好的扩展性。


这与使整个 View 成为一个返回许多行的表值函数略有不同。

如果这样的 TVF 是多语句的,它将为每条记录调用 Salary 函数。但是内联函数可以内联扩展,就像一个SQL宏,所以只在需要时调用Salary;喜欢这里的景色。

不过,作为 TVF 的一般规则,不要返回随后将被丢弃的记录。

关于sql - 这是编写 SQL 查询的低效方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7623608/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com