【问题标题】:What is the best practise to avoid executing a huge intermediate query multiple times?避免多次执行巨大的中间查询的最佳实践是什么?
【发布时间】:2018-07-17 07:30:29
【问题描述】:

由于业务原因,我无法指定查询。此外,我无法创建新视图、表,我只有对数据源的只读访问权限。

所以,问题是我有一个视图,后面有一个非常庞大的查询。这是无法改变的。然后,我有一个从该视图获取数据的查询。我们称之为 LONGQUERY。 (运行时间非常长 - 我无法更改查询)

然后,这个选择查询是几个较小查询的基础(所以所有这些查询都类似于“从 LONGQUERY 中选择 [...]”)——其中将近 30 个,但所有这些小查询都有相同的列。

如何只查询一次 LONGQUERY?

【问题讨论】:

    标签: sql qlikview


    【解决方案1】:

    如果我了解您的需求,您可以将整个 LongQuery 存储到一个文件中,然后对其进行查询 - 或执行常驻加载(或者更快 - 这取决于您在做什么)。

    你会做类似的事情

    LongQuery: SELECT * FROM LONGQUERY;
    Store LongQuery into [c:\Data\LongQuery.qvd] (qvd);
    Drop Table LongQuery;
    SmallQuery1: LOAD field1, field2 from [c:\Data\LongQuery.qvd] (qvd) where A=1;
    SmallQuery2: LOAD field1, field2 from [c:\Data\LongQuery.qvd] (qvd) where B=1;
    

    LongQuery: SELECT * FROM LONGQUERY;
    SmallQuery1: LOAD field1, field2 Resident LongQuery where A=1;
    SmallQuery2: LOAD field1, field2 Resident LongQuery where B=1;
    Drop Table LongQuery;
    

    也就是说,我不确定您为什么要使用相同的字段进行 30 个子查询 - 在一个带有多个过滤器的查询中它们不是可能的吗?在上述两种情况下,您实际上只会得到 1 个表“SmallQuery1”,因为 Qlik 会自动将两个表与...中的相同字段连接起来。

    这就是你所追求的吗?

    从长远来看,最佳做法是将重新加载过程分成两部分 - 一个文件从 LONGQUERY 执行选择和存储,另一个文件从 QVD 文件执行其余处理,这样可以节省- 这样,当您对 30 个其他查询进行开发工作时,您不必重新查询 LONGQUERY...这是在 Qlik 中非常常见的多层架构的开始。

    【讨论】:

    • 我需要 30 个查询的原因如下:假设您有一个表,其中存储了您拥有的水果数量。所以,通常你会有一个“水果类型”列和一个“数量”列。现在,我有 Apple、Orange、Lemon、Watermelon 列,而不是这些列,它们都有各自的数量。所以,我必须将它们转换为第一个版本。另一方面,我会试试你的解决方案!
    • 感谢您的解决方案,它似乎正在进行一些修改! (我需要居住区的 LOAD 语句)
    • 您可能希望查看交叉表脚本函数(也称为 unpivot)来一次性整理列...这是一个函数将列拆分为行。通常在顶部完成数月或类似的时间,但对您的水果有用...help.qlik.com/en-US/qlikview/November2017/Subsystems/Client/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-22
    • 1970-01-01
    • 2021-01-06
    • 1970-01-01
    • 2016-01-23
    • 2016-11-25
    相关资源
    最近更新 更多