Замените вызов скалярной функции возвращаемым значением в определении представления - PullRequest
0 голосов
/ 23 октября 2019

У меня есть скалярная функция, которая выглядит примерно так:

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 голосов
/ 23 октября 2019

В зависимости от ваших фактических планов запросов и того, что является желаемым планом запроса. Устранить неполадки довольно сложно.

Однако, возможно, эта статья может дать вам некоторые идеи:

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/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...