Параметры медленной настройки запросов T-SQL? - PullRequest
0 голосов
/ 30 апреля 2018

Использование SQL Server 2016. Я выполняю следующий запрос на обновление:

update a set a.[Project Definition]=b.[Project] FROM [Table1] a 
inner join [Table2] b 
on dbo.fReplace(a.[Project Definition]) = dbo.fReplace(b. 
[PROJECT #]) 
and a.[Project Definition] <>'' 
and difference(a.[Project Description],b.[Project Name])>=3

Где [fReplace] определяется следующим образом (он просто удаляет все нечисловые символы из поля):

CREATE function [dbo].[fReplace](@strtext varchar(2000))
returns varchar(2000)
as
begin
declare @i int = 32, @rplc varchar(1) = '';
while @i < 256
begin
    if (@i < 48 or @i > 57) and CHARINDEX(char(@i),@strtext) > 0
    begin
        --° #176 ~ 0   --¹ #185 ~ 1   --² #178 ~ 2   --³ #179 ~ 3
        set @rplc = case @i
        when 176 then '0'
        when 185 then '1'
        when 178 then '2'
        when 179 then '3'
        else '' end;

        set @strtext = REPLACE(@strtext,CHAR(@i),@rplc);
    end

    set @i = @i + 1;
end
return ltrim(rtrim(@strtext));
end

Запрос выполняется очень медленно ... Есть ли способ ускорить его? Обратите внимание, что я уже добавил индексы по полям выше.

С уважением, М.Р.

Ответы [ 2 ]

0 голосов
/ 01 мая 2018

Индексы не помогут, потому что вы ищете не значения, а результат функции. Для этого необходимо выполнить сканирование таблиц в обеих таблицах и запустить функцию для каждой строки. Если бы вы могли создать столбец вычислений в каждой таблице и создать индекс по нему, он должен ускориться:

ALTER TABLE Table1
ADD ComputeId AS (dbo.fReplace([Project Definition]))

CREATE INDEX Table1_ComputedIndex ON Table1 (ComputeId)
0 голосов
/ 30 апреля 2018

Использование функций в условиях соединения, вероятно, и является причиной вашей медлительности, поскольку создает условие RBAR (строка за агонизирующей строкой). SQL Server не может выполнить ваше JOIN как заданную операцию, он должен использовать циклы. Если вы запустите свой запрос и вернете план выполнения, вы, скорее всего, это увидите.

Добавление в таблицу столбцов для хранения возвращаемых значений функции поможет ускорить ваше JOIN.

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