Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQLite-帮助提高复杂查询的效率_Sqlite_Performance - Fatal编程技术网

SQLite-帮助提高复杂查询的效率

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列,其中汇总和部门分散在各处(但叶子始

数据是以bucket为结构的金融数据,其中一个bucket(Rollup)可以包含其他bucket的数据。作为示例结构:

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

假设我无法创建临时表,也无法更改数据结构,我想知道是否有更有效的方法来执行此操作

谢谢大家!

  • 所有这些OR都阻止使用索引。 如果可能,删除那些
    @VAR='all'
    比较(或另一个),并根据实际的VAR3/4/5值动态创建SQL字符串
  • LIKE阻止使用索引(因为LIKE(或GLOB)需要索引列上的文本关联)。 将其替换为正常比较,即将
    “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倍。我在报告中添加了一种请求特定数据子集的方法,并修改了原始查询以合并该方法,因此它将搜索表的子集,而不是完整的表扫描。让我知道我如何能给你留下任何代表。我怀疑你的解决方案会奏效,我感谢你提供的信息。