用视图定义中的返回值替换对标量函数的调用

时间:2019-10-23 09:21:18

标签: sql sql-server

我有一个标量函数,看起来像这样:

CREATE FUNCTION my_scalar_function
()
RETURNS uniqueidentifier
BEGIN
    RETURN '<GUID>'
END

我也有一个调用此标量函数的视图定义(带有一堆联接)。以下是它的表示形式:

CREATE VIEW my_view AS
    SELECT Id, Col1, Col2, Col3
    FROM my_table
    WHERE Id = my_scalar_function()

我无法将标量函数更改为TVF或其他任何内容,并且其中包含的GUID是特定于计算机的。在设置过程中会赋予该值,此后不会更改。 对my_scalar_function的调用导致SQL无法正确优化查询。如果我将通话手动替换为<GUID>,就像这样:

ALTER VIEW my_view AS
    SELECT Id, Col1, Col2, Col3
    FROM my_table
    WHERE Id = '<GUID>'

然后,优化是正确的。

所以我的问题是,我该如何在视图定义中用其结果替换对标量函数的调用,最好在创建时,或者以后用 ALTER VIEW 查询?

1 个答案:

答案 0 :(得分:0)

取决于您的实际查询计划以及所需的查询计划。很难解决。

但是,本文也许可以为您提供一些见解:

https://www.mssqltips.com/sqlservertip/5864/four-ways-to-improve-scalar-function-performance-in-sql-server/

按照您的示例,对我来说,您似乎确实希望将其作为一个函数。因此,使用WITH SCHEMABINDING选项可以使函数具有确定性,从而可以帮助查询优化器。

CREATE FUNCTION my_scalar_function
()
RETURNS uniqueidentifier
WITH SCHEMABINDING
AS
BEGIN
    RETURN '<GUID>'
END

模式绑定也可以在VIEW上使用,以进行潜在的改进。但是我认为在此示例中,功能不被视为确定性是问题所在,因为优化器对它的处理方式有所不同。

进一步的阅读/信息:

http://www.sqlhammer.com/sql-server-schemabinding/

https://blogs.msdn.microsoft.com/sqlprogrammability/2006/05/12/improving-query-plans-with-the-schemabinding-option-on-t-sql-udfs/