缩放功能在哪个条款真的很慢?如何使用Cross Apply而不是?

时间:2015-10-07 18:19:13

标签: where-clause stored-functions 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并创建了具有该功能的表可能是更好的解决方案,但我不知道它是如何工作的,任何人都可以帮助我吗?

1 个答案:

答案 0 :(得分: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