我有一张看起来像这样的表
目录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
答案 0 :(得分:1)
分裂器很可能是你问题的根源。您应该考虑使用基于集合的拆分器替换它。这里有很多很好的例子。 http://sqlperformance.com/2012/07/t-sql-queries/split-strings