如果我有这样的表:
CREATE TABLE #TEMP (id1 int, id2 int, val int)
INSERT INTO #TEMP VALUES(0, 0, 0)
INSERT INTO #TEMP VALUES(0, 1, 1)
INSERT INTO #TEMP VALUES(0, 2, 2)
INSERT INTO #TEMP VALUES(0, 3, 3)
INSERT INTO #TEMP VALUES(0, 4, 4)
INSERT INTO #TEMP VALUES(0, 5, 5)
INSERT INTO #TEMP VALUES(1, 0, 0)
INSERT INTO #TEMP VALUES(1, 1, 1)
INSERT INTO #TEMP VALUES(1, 2, 2)
INSERT INTO #TEMP VALUES(1, 3, 3)
INSERT INTO #TEMP VALUES(1, 4, 4)
INSERT INTO #TEMP VALUES(1, 5, 5)
INSERT INTO #TEMP VALUES(2, 0, 0)
INSERT INTO #TEMP VALUES(2, 1, 1)
INSERT INTO #TEMP VALUES(2, 2, 2)
INSERT INTO #TEMP VALUES(3, 0, 0)
INSERT INTO #TEMP VALUES(3, 1, 1)
INSERT INTO #TEMP VALUES(3, 2, 2)
INSERT INTO #TEMP VALUES(3, 3, 3)
INSERT INTO #TEMP VALUES(3, 4, 4)
INSERT INTO #TEMP VALUES(3, 5, 5)
INSERT INTO #TEMP VALUES(4, 0, 0)
INSERT INTO #TEMP VALUES(4, 1, 1)
INSERT INTO #TEMP VALUES(4, 2, 2)
DROP TABLE #TEMP
我正在努力获得所有唯一的id1
,其中两个给定的id1
可以有特定的差异(来自第三列)。目前,我已经在id1和id2上添加了一个索引,并编写了这样的查询:
SELECT X.id1
FROM #TEMP X
INNER JOIN #TEMP Y
ON (X.id2 = Y.id2)
AND (X.id1 = 2 AND Y.id1 = 3) // numbers are only for illustration
AND (Y.val - X.val = 1)
此查询目前需要4秒才能在包含18M记录的表上运行。反正有加速吗?
答案 0 :(得分:1)
我会删除索引并尝试仅在val上创建索引。这是决定应该返回什么的部分。它可能会鼓励优化器首先评估差异,然后只有在知道差异为1之后才加入那里,因为反对首先连接所有数据只是为了发现差异不是1而这是浪费的操作。
答案 1 :(得分:0)
也许它正在整个表上执行内连接,然后将where
子句应用于它。这将导致18Mx18M = 324M的表,这可能需要4秒。
您的SQLite数据库中是否有statistics?
您是否尝试使用indexed by关键字强制使用索引?
尝试使用相关子查询,例如:
select x.id1
from #TEMP x
where x.id1 = 2 and
(
select y.val
from #TEMP y
where y.id1 = 3
and y.id2 = x.id2
)
- X.val = 1
也许这只会通过索引搜索来执行。
答案 2 :(得分:0)
这个查询似乎存在严重缺陷(礼貌地说)......
SELECT X.id1
FROM #TEMP X
INNER JOIN #TEMP Y
ON (X.id2 = Y.id2)
AND (X.id1 = 2 AND Y.id1 = 3) // numbers are only for illustration
AND (Y.val - X.val = 1)
可以概括为
SELECT X.id1 LABORIOUSLY FRON a_pile_of_stuff WHERE X.id1 = 2
并且无论如何如果你有一个索引(id1,id2),它应该运行得非常快。我建议您仔细检查您的代码和时间。有些东西没凝固。