为什么我的相关子查询永远不会完成?

时间:2016-09-02 17:25:36

标签: sql sql-server tsql

我有一张看起来像这样的表

目录nvarchar(max)
扩展nvarchar(10)
长度bigint

我还有另一个提供文件类型(查找表)的表 extension nvarchar(10)
FileType nvarchar(50)

话虽如此,我有一个相关的子查询,我想迁移到一个sproc,它接受来自root的级别,并返回该特定级别的目录及其文件类型。主表中有大约400k行,查找表中有大约800个扩展名。

查询是这样的:

declare @levelsFromRoot as int = 7
--declare @auditName as varchar(max) = 'Aetna'

select
    ef.Type,
    sf.Directory,
    (select count(distinct part)
     FROM dbo.vwAuditView
     cross APPLY dbo.SplitPath( substring([Directory],1,LEN([Directory])

                        -CHARINDEX('\',REVERSE([Directory]))) ,'\') AS Results
                                where Directory = sf.Directory) as [LevelsFromRoot]
from dbo.FS02V_SourceFiles sf
inner join dbo.ExtensionFix ef
    on sf.Extension = ef.Extension
Where (select count(distinct part)
     FROM dbo.vwAuditView
     cross APPLY dbo.SplitPath( substring([Directory],1,LEN([Directory])

                        -CHARINDEX('\',REVERSE([Directory]))) ,'\') AS Results
                                where Directory = sf.Directory) = @levelsFromRoot
order by Directory asc

子查询中的交叉应用部分计算从根开始的每个路径中的级别。您应该能够从根目录传递多少级别,并传回该级别的目录列表及其相应的文件类型。此查询已运行25分钟。它正在向我返回数据。我能做些什么来改善这个吗?我在相关子查询中相当新,并且我在这里做错了。

为清楚起见,视图如下所示:

select    Directory
        --, ef.Extension
        , ef.Type
        , sum(Length) as [Size - Bytes]
from dbo.FS02V_SourceFiles sf
INNER JOIN dbo.ExtensionFix ef
    on sf.Extension = ef.Extension 
group by ef.type, Directory

功能:

ALTER FUNCTION [dbo].[CHARINDEX2]
(
    @TargetStr varchar(8000), 
    @SearchedStr varchar(8000), 
    @Occurrence int
)

RETURNS int
AS
BEGIN

    DECLARE @pos INT, @counter INT, @ret INT

    set @pos = CHARINDEX(@TargetStr, @SearchedStr)
    set @counter = 1

    if @Occurrence = 1 set @ret = @pos
    else
    begin

        while (@counter < @Occurrence)
        begin

            select @ret = CHARINDEX(@TargetStr, @SearchedStr, @pos + 1)

            set @counter = @counter + 1

            set @pos = @ret

        end

    end

    RETURN @ret

1 个答案:

答案 0 :(得分:1)

分裂器很可能是你问题的根源。您应该考虑使用基于集合的拆分器替换它。这里有很多很好的例子。 http://sqlperformance.com/2012/07/t-sql-queries/split-strings