我有一个标量函数,看起来像这样:
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
查询?
答案 0 :(得分:0)
取决于您的实际查询计划以及所需的查询计划。很难解决。
但是,本文也许可以为您提供一些见解:
按照您的示例,对我来说,您似乎确实希望将其作为一个函数。因此,使用WITH SCHEMABINDING选项可以使函数具有确定性,从而可以帮助查询优化器。
CREATE FUNCTION my_scalar_function
()
RETURNS uniqueidentifier
WITH SCHEMABINDING
AS
BEGIN
RETURN '<GUID>'
END
模式绑定也可以在VIEW上使用,以进行潜在的改进。但是我认为在此示例中,功能不被视为确定性是问题所在,因为优化器对它的处理方式有所不同。
进一步的阅读/信息: