2014-06-11 98 views
0

我有2個表,headers有2百萬行,而files有30行。跨越多個表的索引列

我有一個查詢,假設獲得每個目錄的標題總數。

的SQL看起來如下:

SELECT files.dir_id, COUNT(*) AS "TOTAL" 
FROM headers 
LEFT JOIN files ON headers.file_id = files.file_id 
GROUP BY files.dir_id 

目前,執行上述SQL正在20秒。我如何索引它以使其更快?

我試過CREATE INDEX IF NOT EXISTS HEADERS_FILE ON HEADERS(FILE_ID)。這使得GROUP BY file_id得到即時響應(無需加入文件表)。但是,它不會改進上述原始查詢的性能。

我在想像CREATE INDEX INDEX_NAME ON HEADERS, FILES(FILE_ID, DIR_ID)應該工作。但我無法創建這樣的索引。

感謝您的幫助。謝謝!

+0

這應該是'headers LEFT JOIN files',而不是'files LEFT JOIN headers'嗎? –

回答

0

LEFT加入阻止數據庫使用files作爲嵌套循環聯接中的外部表。

嘗試使用內部聯接,然後手動添加缺少的行;這可能會允許更好地優化兩個子查詢:

SELECT files.dir_id, COUNT(*) AS "TOTAL" 
FROM headers 
-- LEFT JOIN expanded by hand for better optimization 
INNER JOIN files ON headers.file_id = files.file_id 
GROUP BY files.dir_id 
UNION ALL 
SELECT dir_id, 0 
FROM files 
WHERE file_id NOT IN (SELECT file_id 
         FROM headers)