JOIN之后的WHERE子句减慢了我的查询速度

时间:2013-10-08 13:04:22

标签: sql oracle join where-clause

我的查询:

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'子句。当包含它时,它运行得很慢。

感谢您的投入。

5 个答案:

答案 0 :(得分:2)

这不一样吗?

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

答案 1 :(得分: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.%';  

答案 2 :(得分:1)

您是否在name表的source列上有索引?

为什么不像这样编写查询:

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

答案 3 :(得分:0)

以下情况如何?

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

答案 4 :(得分:0)

将条件更改为简单条件并反转表格顺序:

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

索引位于source(name)file_info(source_ID)

这会更快,因为where子句可以被监视到连接表列表中的第一个表,因此索引可以与条件一起使用。