嵌套的SELECT查询有时会停止

时间:2010-10-19 03:37:48

标签: python sql sqlite

我一直在python应用程序中使用sqlite3,在测试时,我的查询有时会导致程序冻结。粗略(来自记忆)的例子:

SELECT id,name FROM main_table WHERE name IN 
(SELECT name FROM another_table WHERE another_table.attribute IN 
('foo', 'bar', 'baz'))

通常,我第一次尝试这样的事情时,程序就会冻结。现在,如果我首先尝试子查询,然后是整个嵌套的混乱,它几乎立即起作用。

我猜测它会缓存第一个更简单的查询结果,以便下次使用更快,但即便如此,我也想知道如何避免这种停滞。

2 个答案:

答案 0 :(得分:1)

您没有提及索引的任何内容......两个表中的name应至少编入索引。

这是使用JOIN的等价物:

SELECT DISTINCT
       x.id,
       x.name 
  FROM main_table x
  JOIN ANOTHER_TABLE y ON y.name = x.name
                      AND y.attribute IN ('foo', 'bar', 'baz')

但请注意,如果ANOTHER_TABLE中有多条记录与MAIN_TABLE记录相关联,则JOIN将产生重复记录。因此需要DISTINCT(或GROUP BY,如果这是你的偏好)。

EXISTS可能是比IN更好的选择:

SELECT x.id,
       x.name 
  FROM main_table x
 WHERE EXISTS(SELECT NULL
                FROM ANOTHER_TABLE y 
               WHERE y.name = x.name
                 AND y.attribute IN ('foo', 'bar', 'baz'))

答案 1 :(得分:0)

选择...其中......在...查询通常表现不佳。它们通常被优化器视为可能非常大的系列(name = val1或name = val2或...或name = valn)

尝试使用子查询的内部联接:

SELECT 
    id
    ,name 
FROM 
    main_table 
    INNER JOIN another_table on 
        main_table.name=another_table.name
        and another_table.attribute in (
            'foo','bar','baz'
        )