2015-10-07 2 views
0

У меня есть некоторые данные, некоторые из них были импортированы с различными разделителями, такими как * -. или пробел ... некоторые из них были удалены при импорте, а некоторые - нет. Некоторые из внешних значений, сравниваемых с ним, имеют одинаковую проблему. Таким образом, мы удаляем все разделители и сравниваем это, я не хочу просто обновлять столбцы, пока данные не являются «моими».Функция скалера в месте, где положение действительно медленное? Как использовать Cross Apply вместо этого?

Так как я вижу это снова и снова в коде, я перехожу к хранимым процедурам, я написал сохраненную функцию, чтобы сделать это для меня.

ALTER FUNCTION [dbo].[fn_AccountNumber_Format2] 
    (@parAcctNum  NVARCHAR(50)) 
    RETURNS    NVARCHAR(50) 
    AS 
    BEGIN 
     SET @parAcctNum = REPLACE(REPLACE(REPLACE(REPLACE(@parAcctNum, '.', ''), '*', ''), '-', ''), ' ', ''); 
     RETURN @parAcctNum 
    END 

Обычно запросы выглядели примерно так, и это занимает меньше секунды, чтобы запустить на несколько миллионов строк:

SELECT name1, accountID FROM tblAccounts WHERE (Replace(Replace(Replace(accountnumber, '.', ''), '*', ''), '-', '') = Replace(Replace(Replace('123-456-789', '.', ''), '*', ''), '-', '')); 

Так что моя первая попытка с ним, как это занимает 24 секунд Выполнение выражений:

SELECT name1, accountID FROM tblAccounts WHERE (dbo.fn_AccountNumber_Format2 ([accountnumber])) = Replace(Replace(Replace('123-456-789', '.', ''), '*', ''), '-', ''); 

Это один 43 секунды:

SELECT name1, accountID FROM tblAccounts WHERE (dbo.fn_AccountNumber_Format2(accountnumber)) = (dbo.fn_AccountNumber_Format2 ('123-456-789')); 

Итак, резкое замедление стало для меня полным шоком, так как я ожидал, что пользовательская функция будет работать точно так же, как и системная функция REPLACE ... После некоторых исследований по stackexchange и google кажется, что использование Cross Apply и создание таблица с функцией может быть лучшим решением, но я понятия не имею, как это работает, может ли кто-нибудь помочь мне с этим?

ответ

0

Инлайн Функция

CREATE FUNCTION [dbo].[uspAccountNumber_Format3] 
( 
@parAcctNum NVARCHAR(50)) 
RETURNS TABLE 
AS 
RETURN 
(
    SELECT REPLACE(REPLACE(REPLACE(REPLACE(@parAcctNum, '.', ''), '*', ''),'-', ''), ' ', '') AS AccountNumber 
) 

Использование

SELECT name1 , 
     accountID 
FROM tblAccounts 
     CROSS APPLY dbo.uspAccountNumber_Format3(accountnumber) AS a 
     CROSS APPLY dbo.uspAccountNumber_Format3('123-456-789') AS b 
WHERE a.AccountNumber = b.AccountNumber 

 Смежные вопросы

  • Нет связанных вопросов^_^