2010-10-19 60 views
1

我一直在使用Python應用程序sqlite3的,和測試時,我有時查詢導致程序凍結。一個粗糙的(從內存)的例子:嵌套SELECT查詢有時候停

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

通常,我第一次嘗試這樣的事情,程序簡單地凍結。現在,如果我先嚐試子查詢,然後再嘗試整個嵌套混亂,那麼它幾乎可以立即運行。

我在猜測它緩存了第一個更簡單的查詢的結果,以後這會讓事情下次更快,但即便如此,我想知道如何避免這種拖延。兩個表中

回答

1

你沒有提到關於索引什麼... name至少應被索引。

下面是一個使用等效連接:

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很可能是一個更好的選擇比:

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')) 
+0

我對於SQL來說很新,並且從來沒有加入JOIN,因此它會回到關於這方面的書籍。另外,似乎很多SQL性能問題都以「創建索引」來回答。儘管我可以看到這樣做的語法,但我並不完全理解索引的作用。你能爲我推薦一個解釋嗎?我不想對這種貨物進行邪教並且不理解它就使用某些東西。 – spook 2010-10-21 11:53:26

+0

@spook:這裏的答案作爲索引上的一個很好的入門(http://stackoverflow.com/questions/105400/what-are-indexes-and-how-can-i-use-them-to-optimize -queries功能於我的數據庫) – 2010-10-21 15:38:16

0

選擇... ...在那裏......在查詢往往表現不佳。它們通常是由優化器視爲一個潛在的非常大的系列(名稱= VAL1或名稱=值2或者...或者名稱= 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' 
     )