脚本的以下部分是否有可能获得更好的性能?
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 脚本中计算这部分,但我认为这对提高性能没有意义。 有什么想法可以帮助提高性能吗?
很难说出这里发生了什么,但看起来这个脚本有条件地解析一些存储为字符串的 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
部分)。