如何获得具有一定差异的行?

时间:2011-11-06 01:54:53

标签: python sql database sqlite

如果我有这样的表:

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记录的表上运行。反正有加速吗?

3 个答案:

答案 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),它应该运行得非常快。我建议您仔细检查您的代码和时间。有些东西没凝固。