2013-10-08 55 views
0

我的查詢放緩:WHERE克勞斯後,JOIN是我的查詢

SELECT source.name, file_info.* 
from FILE_INFO 
JOIN source 
ON source.id = file_info.source_ID 
where file_info.source_ID in 
    (select ID from Source where name like 'Donatello.%'); 

我的表:

FILE_INFO  
FILE_NAME | FILE_ID | SOURCE_ID | DATE_SEEN | CURRENT_STATUS 

SOURCE 
NAME | ID | CATEGORY 

背景:

在我的數據庫,文件與提供它們的來源相關聯。每個文件都有一個FILE_ID,每個源都有一個ID(與表FILE_INFO中的SOURCE_ID相同)。但是,表FILE_INFO不包含與SOURCE_ID關聯的名稱。

我試圖打印表FILE_INFO以及各自的SOURCE名稱的所有行,我只想要提供該文件的源文件以「DONATELLO」開頭的行。

該查詢對我的作品,但它的運行速度非常慢。我的代碼有更好的方法嗎?它工作正常,直到我添加最後'where'子句。當它包含時,它運行得很慢。

我很欣賞你的意見。

+1

您需要查看Explain Plan 以顯示服務器正在執行的操作。 (該鏈接適用於Oracle 9,您應該使用您正在使用的版本的鏈接) – Mark

回答

0

有關下列哪些?

SELECT source.name, file_info.* 
from FILE_INFO 
JOIN source 
ON source.id = file_info.source_ID and source.name like 'Donatello.%'; 
2

這不一樣嗎?

SELECT source.name, file_info.* 
FROM FILE_INFO 
    JOIN source 
     ON source.id = file_info.source_ID 
WHERE source.name like 'Donatello.%' 
1

IN子句使用子查詢,在查詢再次source表。

爲什麼不簡單你的SQL如下?

SELECT source.name, file_info.* 
from FILE_INFO 
JOIN source 
ON source.id = file_info.source_ID 
where source.name like 'Donatello.%'; 
1

你有從source表上name列的索引?

你爲什麼不只是寫您的查詢這樣的:

SELECT source.name, file_info.* 
from FILE_INFO 
JOIN source 
ON source.id = file_info.source_ID 
where source.name like 'Donatello.%'; 
0

變化的條件,一個簡單的和反轉表順序:在source(name)file_info(source_ID)

SELECT source.name, file_info.* 
from source 
JOIN FILE_INFO 
    ON source.id = file_info.source_ID 
where source.name like 'Donatello.%' 

使用索引。

這會更快,因爲where子句可以被查詢到連接表列表中的第一個表,因此索引可以與條件一起使用。