SQLite-帮助提高复杂查询的效率
数据是以bucket为结构的金融数据,其中一个bucket(Rollup)可以包含其他bucket的数据。作为示例结构:SQLite-帮助提高复杂查询的效率,sqlite,performance,Sqlite,Performance,数据是以bucket为结构的金融数据,其中一个bucket(Rollup)可以包含其他bucket的数据。作为示例结构: Rollup1 | Dept1 Rollup1 | Rollup2 | Dept2 Rollup1 | Rollup2 | Dept3 Rollup1 | Rollup3 | Dept4 Rollup1 | Rollup3 | Rollup4 | Dept5 Rollup1 | Rollup3 | Rollup4 | Dept6 这有8列,其中汇总和部门分散在各处(但叶子始
Rollup1 | Dept1
Rollup1 | Rollup2 | Dept2
Rollup1 | Rollup2 | Dept3
Rollup1 | Rollup3 | Dept4
Rollup1 | Rollup3 | Rollup4 | Dept5
Rollup1 | Rollup3 | Rollup4 | Dept6
这有8列,其中汇总和部门分散在各处(但叶子始终是单个部门)。大约10万行
查询结果的目标是显示包含所有汇总的单个列,使用变量逻辑正常显示某些汇总,并修改所有其他汇总
例如,如果我的变量包含“Dept4”,我的结果将是:
Rollup1
Rollup3
NA - Rollup2
NA - Rollup4
在实际场景中,有3个变量决定汇总列的显示
这就是我所拥有的,它应该发挥的功能,但是,性能非常差。1查询最长需要5秒钟,我想对此进行改进
SELECT DISTINCT CASE
WHEN "2" NOT IN
(
SELECT "2"
FROM "Finance New"
WHERE (@VAR3 = 'All' OR @VAR3 IN ("2","3","4","5","6","7","8","9"))
AND (@VAR4 = 'All' OR "10" = @VAR4)
AND (@VAR5 = 'All' OR "11" = @VAR5)
)
THEN
'Z N/A - ' || "2"
ELSE
"2"
END AS COL2
FROM "Finance New"
WHERE "5" <> 'All Applicable' AND "1" <> '9999'
AND "2" LIKE '9%'
UNION
SELECT DISTINCT CASE
WHEN "3" NOT IN
(
SELECT "3"
FROM "Finance New"
WHERE (@VAR3 = 'All' OR @VAR3 IN ("2","3","4","5","6","7","8","9"))
AND (@VAR4 = 'All' OR "10" = @VAR4)
AND (@VAR5 = 'All' OR "11" = @VAR5)
)
THEN
'Z N/A - ' || "3"
ELSE
"3"
END AS COL2
FROM "Finance New"
WHERE "5" <> 'All Applicable' AND "1" <> '9999'
AND "3" LIKE '9%'
UNION
Etc, for each of the columns in the Rollup/Dept Tree report.
选择不同的大小写
当“2”不在时
(
选择“2”
从“新金融”
其中(@VAR3='All'或@VAR3 IN(“2”、“3”、“4”、“5”、“6”、“7”、“8”、“9”))
和(@VAR4='All'或“10”=@VAR4)
和(@VAR5='All'或“11”=@VAR5)
)
然后
“Z不适用-”| |“2”
其他的
"2"
以COL2结尾
从“新金融”
其中“5”为“所有适用”,而“1”为“9999”
“2”像“9%”
联合
选择不同的案例
当“3”不在时
(
选择“3”
从“新金融”
其中(@VAR3='All'或@VAR3 IN(“2”、“3”、“4”、“5”、“6”、“7”、“8”、“9”))
和(@VAR4='All'或“10”=@VAR4)
和(@VAR5='All'或“11”=@VAR5)
)
然后
“Z不适用-”| |“3”
其他的
"3"
以COL2结尾
从“新金融”
其中“5”为“所有适用”,而“1”为“9999”
“3”像“9%”
联合
等等,用于汇总/部门树报告中的每一列。
每个联合查询中的内部选择将根据变量条件附加到文本。排序是自动完成的。联合之前的最后一行(和“3”如“9%”
)是实际获取汇总。所有汇总都从9开始
输入参数的标签类似于@VARx
假设我无法创建临时表,也无法更改数据结构,我想知道是否有更有效的方法来执行此操作
谢谢大家!
@VAR='all'
比较(或另一个),并根据实际的VAR3/4/5值动态创建SQL字符串“col”如'9%'
替换为“col”>='9'和“col”<':'
创建索引i_10_11_全部在“金融新”(“10”、“11”、“2”、“3”、“4”、“5”、“6”、“7”、“8”、“9”);
在“新金融”上创建索引i_11_10_全部(“11”、“10”、“2”、“3”、“4”、“5”、“6”、“7”、“8”、“9”);
在“新金融”(“2”、“1”、“5”)上创建索引i_2_1_5;
在“新金融”(“3”、“1”、“5”)上创建索引i_3_1_5;
--以此类推,4..9
“@COL3”
应该是字符串还是参数?在SQL中,字符串必须使用单引号”
,双引号“
用于表/列名。为了与MySQL兼容,SQLite接受其他引号,但这使得此查询无法读取;请修复它。这正是我正在使用的SQLite实现所期望的语法。“@VARNAME”是变量的实现表示形式。在其他情况下,单引号和双引号的使用与您的状态相同-双引号表示列和表名,单引号表示字符串。我将把“@VARNAME”改为@VARNAME,注意这代表一个输入参数。你有索引吗?你能补充一下吗?列的数据类型是什么?您可以更改它们吗?您有哪个SQLite版本?你能告诉我最新情况吗?我周一会试试这个。我很确定我可以实现除CREATE语句之外的所有语句,但我将首先尝试一下。如果我记得的话,有一个GUI选项可以使用列作为索引,但我不知道它是否能实现上面的语句所做的功能。如果您不能创建多列索引,至少可以在所有列上尝试单列索引。我只能在单列上创建它,所以我将尝试此方法。我没有忘记这一点,当我能够返回到这个项目时,我将尝试这样做。我无法用这个实现添加索引。然而,通过重新设计数据的表示方式,将数据分解成更小的数据块,我将其速度提高了大约2倍。我在报告中添加了一种请求特定数据子集的方法,并修改了原始查询以合并该方法,因此它将搜索表的子集,而不是完整的表扫描。让我知道我如何能给你留下任何代表。我怀疑你的解决方案会奏效,我感谢你提供的信息。