首页 > 解决方案 > INNER JOIN 造成内存问题

问题描述

在 Android 应用程序和 SQLite 中,

INNER JOIN在一个QUERY创建内存问题如下:

窗口已满:请求分配 372 字节,可用空间 106 字节,窗口大小 2097152 字节

查询如下:

SELECT * FROM TABLEA A 
INNER JOIN TABLEB B 
ON A.ID1 = B.ID1 AND A.ID2 = B.ID2 
WHERE B.DATA3 = 'Y'

表 A 由以下 4 列组成:

ID1,ID2,DATA1,DATA2: 

ID1   ID2   DATA1   DATA2 
A     E     D1      D4
B     F     D2      D5
C     G     D3      D6
D     H     D4      D7

表 B 由以下 3 列组成:

ID1,ID2,DATA3: 

ID1   ID2   DATA3 
A     E     Y
B     F     N
C     G     Y
D     H     N

QUERY结果如下:

ID1   ID2   DATA1   DATA2 
A     E     D1      D4
C     G     D3      D6

关键是当我将记录数增加到数千个时,我看到了问题,并且它适用于较少的记录

还有一点是为了测试内存问题,我用了另外一个QUERY,只从A表中取数据,不INNER JOIN带表B,取到的记录号和上面用INNER JOIN的查询的记录号是一样的,但是没有内存问题
所以我得出的结论是 INNER JOIN 正在造成内存问题
换句话说,问题不在于记录的数量,因为QUERYwith INNER JOIN 太多了,因为我得到了很多其他QUERY的记录而没有任何内存问题

为什么?

标签: androidsqlite

解决方案


来自维基百科的引述:

相反,当在大容量查询中与 SQL Where 子句中的数据库函数结合使用时,内部连接可能会导致灾难性的性能下降甚至服务器崩溃。 [2][3][4] SQL Where 子句中的函数可能导致数据库忽略相对紧凑的表索引。在使用取决于计算值的过滤器减少行数之前,数据库可能会从两个表中读取并内连接选定的列,从而导致相对大量的低效处理。


推荐阅读