小编Joe*_*e C的帖子

FileTable分隔字符串拆分

编辑 - 要明确我将把目标句放在顶部.测试和我的问题是,是否有一种方法可以在不使用临时表的情况下获得与临时表相同的性能.

我觉得这应该是一个简单的问题,但我被困住了.我正在SQL2014中尝试使用FileTables.我知道一些替代方案可以很好地工作,但目标是建立从文件表中提取文本子串的可行性.

该测试具有35,000个文本文件,其中一行文本如下,每个文件具有平均100字节的非unicode文本.

Aaa|Bbb|Ccc|Ddd|Eee|Fff|Ggg
Run Code Online (Sandbox Code Playgroud)

对于每个文件,所需的输出是一行,而分隔的字符串要分成七列.

我找到了一个快速的字符串解析器函数,但与varchar列相比,在文件流上运行会产生显着的性能影响.

此查询需要18秒才能运行.我试图从filestream转换到varchar只执行一次,但我认为调用UDF可能导致它发生在每一行(文件).

Create View vAddresses As
Select file_type, Convert(Varchar(8000),file_stream) TextData /* Into #Temp */ From InputFiles Where file_type = 'adr'
Go
Select  --TextData,
        dbo.udf_StringSplit(TextData, 1, '|'), dbo.udf_StringSplit(TextData, 2, '|'), dbo.udf_StringSplit(TextData, 3, '|'),
        dbo.udf_StringSplit(TextData, 4, '|'), dbo.udf_StringSplit(TextData, 5, '|'), dbo.udf_StringSplit(TextData, 6, '|'),
        dbo.udf_StringSplit(TextData, 7, '|')--, TextData
    From vAddresses
Run Code Online (Sandbox Code Playgroud)

我已经尝试过它作为一个视图,一个cte和一个子查询.唯一似乎有帮助的是创建临时表.创建临时表需要1秒钟,查询需要一秒钟.因此对于35k行2秒总查询时间与18秒.

Drop Table #Temp
(Select file_type, Convert(Varchar(8000),file_stream) TextData Into #Temp From HumanaInputFiles Where file_type = 'adr')
Select  --TextData,
        dbo.udf_StringSplit(TextData, 1, '|'), dbo.udf_StringSplit(TextData, 2, '|'), dbo.udf_StringSplit(TextData, 3, …
Run Code Online (Sandbox Code Playgroud)

t-sql sql-server user-defined-functions filetable

12
推荐指数
1
解决办法
437
查看次数