Задержка в результате запроса SQL Server с удалением начального и конечного символов - PullRequest
0 голосов
/ 22 мая 2019

У меня есть запрос в SQL Server 2012 , который занимает 8 секунд, чтобы получить 1158 строк. В запросе, который мне нужно объединить на двух полях, я должен обрезать начальные и конечные 0 при объединении.

ниже запроса: для получения 1158 строк требуется 8 секунд

Select value1, value2
from TableA LEFT JOIN TableB
ON 
SUBSTRING(REVERSE(SUBSTRING(REVERSE(TableA.[policy#]),PATINDEX('%[^' + '0' + ' ]%',REVERSE(TableA.[policy#])),100)),PATINDEX('%[^' + '0' + ' ]%',REVERSE(SUBSTRING(REVERSE(TableA.[policy#]),PATINDEX('%[^' + '0' + ' ]%',REVERSE(TableA.[policy#])),100))),100)
  = SUBSTRING(REVERSE(SUBSTRING(REVERSE(TableB.[policy#]),PATINDEX('%[^' + '0' + ' ]%',REVERSE(TableB.[policy#])),100)),PATINDEX('%[^' + '0' + ' ]%',REVERSE(SUBSTRING(REVERSE(TableB.[policy#]),PATINDEX('%[^' + '0' + ' ]%',REVERSE(TableB.[policy#])),100))),100)  
  WHERE {some conditions}

Вместо того, чтобы писать некрасивый код для удаления начальных и конечных нулей, я создал две функции, которые делают то же самое

  ALTER FUNCTION [dbo].[L_TRIM](@String VARCHAR(MAX), @Char varchar(5))
RETURNS VARCHAR(MAX)
BEGIN
   RETURN SUBSTRING(@String,PATINDEX('%[^' + @Char + ' ]%',@String),100)
END

ALTER FUNCTION [dbo].[R_TRIM](@String VARCHAR(MAX), @Char varchar(5))
RETURNS VARCHAR(MAX)
BEGIN
  RETURN REVERSE(SUBSTRING(REVERSE(@String),PATINDEX('%[^' + @Char + ' ]%',REVERSE(@String)),100))
END

Ниже запроса: для получения 1158 строк требуется 1 минута 40 секунд

Select value1, value2
from TableA LEFT JOIN TableB
ON 
 dbo.L_trim(dbo.R_trim( TableA.[policy#], '0'),'0') = dbo.L_trim(dbo.R_trim(TableB.[policy#], '0'),'0') 
 WHERE {some conditions}

Может ли кто-нибудь подсказать мне, как я могу извлечь строки за меньшее время без написания некрасивого кода?

...