QlikView 脚本中的 SQL - 如何在“案例”语句中获得更好的性能

问题描述 投票:0回答:1

脚本的以下部分是否有可能获得更好的性能?

case when recip = 'client' 
        then 
            cast(cast(cast(replace(replace(cast(x.MESSAGE_DATA as varchar(12)),'ac:','ac'),
            substring(replace(cast(x.MESSAGE_DATA as varchar(12)),'ac:','ac'),
            charindex('<Jv-Ins',
            replace(cast(x.MESSAGE_DATA as varchar(12)),'ac:','ac'),1),
                        charindex('<Claim',replace(cast(x.MESSAGE_DATA as varchar(12)),'ac:','ac'),1)-    charindex('<Jv-Ins',
            replace(cast(x.MESSAGE_DATA as varchar(12)),'ac:','ac'),1)),'<Jv-Ins>') as xml).query('data(/Jv-Ins/Claim/Contract/SharePercentage/Rate)') as varchar(6)) as float)
            
     when recip = 'reClient' 
        then 
            cast(cast(cast(replace(replace(cast(x.MESSAGE_DATA as varchar(12)),'ac:','ac'),
            substring(replace(cast(x.MESSAGE_DATA as varchar(12)),'ac:','ac'),
            charindex('<Jv-Ins',
            replace(cast(x.MESSAGE_DATA as varchar(12)),'ac:','ac'),1),
            charindex('<Claim',replace(cast(x.MESSAGE_DATA as varchar(12)),'ac:','ac'),1)-charindex('<Jv-Ins',
            replace(cast(x.MESSAGE_DATA as varchar(12)),'ac:','ac'),1)),'<Jv-Ins>') as xml).query('data(/Jv-Ins/Claim/Contract/SharePercentage/Rate)') as varchar(6)) as float)  end  [Percent Share],



这条线减慢了重新加载的速度,现在已经超过 2 小时了。如果没有此行,脚本将在 4 分钟内重新加载。 此 sql 脚本内置于 Qlikview 脚本中,因此数据通过连接器传输。 我是 SQL 的新手,所以我考虑在 QVD 中存储表并在 Qlikview 脚本中计算这部分,但我认为这对提高性能没有意义。 有什么想法可以帮助提高性能吗?

sql performance qlikview qliksense
1个回答
0
投票

很难说出这里发生了什么,但看起来这个脚本有条件地解析一些存储为字符串的 XML,然后查询它以获得

[Rate]
值? Qlik 让你加载 XML files 但我不相信你可以从已经加载的字符串值中解析 XML。

请注意,我在下面的建议是尝试充分利用您的情况,最好的做法可能只是在将 XML 存储到数据库之前对其进行解析。除此之外,继续...

你可以做的就是按原样加载原始字段:

-- SQL:
case
    when recip in ('client', 'reClient') then x.MESSAGE_DATA
    when recip = 'etc' then ...
end

(那时你可能甚至不需要

case
声明,但我不知道你的脚本的其余部分是什么样的。)

然后只需使用基本的 Qlik 字符串函数即可获得所需的

[Rate]
值,如下所示:

// Qlik load script:
Load 
    [XML String Full]
  , Num#(KeepChar(TextBetween([XML String Full], '<Rate>', '</Rate>'), '0123456789')) / 100 as [Percent Share]
Resident [Raw data from DB];

该脚本使用

TextBetween()
函数 获取
<Rate>
XML 节点中的值。然后它使用
KeepChar()
函数
来确保我们只有它的数字。然后使用
Num#()
函数
来确保我们正确地将其解释为数值。最后,我们将所有这些除以 100 以获得实际速率值(假设来自数据库的值类似于 "4%" 而不是 0.04;如果不是,您可以放弃
/ 100
部分)。

© www.soinside.com 2019 - 2024. All rights reserved.