如果记录超过100k,则Oracle中的查询不会执行

时间:2013-02-06 13:43:04

标签: sql oracle oracle11g

我正在使用数据库oracle 11g。 我的应用程序在某些特定情况下运行查询,如下所示

Select distinct demo.table1.id, demo.table2.status 
FROM demo.table1, demo.table2
WHERE demo.table1.id=demo.table2.id
AND ((demo.table2.userID = '1') or (demo.table2.userID='2'))

如果记录数约为20-25K,它会给我正确的输出。 但是如果记录数超过50K,查询不返回任何内容并且应用程序挂起。

但是,如果我删除'AND'条件;查询给了我想要的输出(即50K记录)

我为MSSQL server 2005运行了相同的场景,所有上述指定方案都运行良好。即使是100K记录,应用程序也没有挂起。

我不知道这里出了什么问题。是我的查询还是我需要在oracle中进行一些配置更改?

请帮助我,因为我是oracle数据库的新手。

2 个答案:

答案 0 :(得分:1)

首先,确保您要加入的任何字段以及您在where条件中使用的任何字段都有索引。看起来至少是Table1.id,Table2.Id和Table2.userID。

然后我建议您使用INNER JOININ条款将查询更改为以下内容:

Select DISTINCT t.id, t2.status 
FROM demo.table1 t
   INNER JOIN demo.table2 t2 on t.id=t2.id
WHERE demo.table2.userID IN (1,2)

- 编辑

我不明白为什么你的userId字段是一个字符串 - 这可能应该被重构为一个标识/自动增量。但是,您需要将上面的WHERE子句调整为IN('1','2')才能工作。

祝你好运。

答案 1 :(得分:1)

另外......你可以考虑摆脱不同的。它大大降低了性能。我相信这就是你的查询挂起的原因。然后我用UNION / UNION ALL替换OR - 取决于...这里有一些关于如何避免不同的一般例子:

-- DISTINCT --
SELECT DISTINCT d.deptno, dname FROM scott.dept D, scott.emp E 
 WHERE D.deptno = E.deptno
/  

-- Same as Distinct but may be faster --
SELECT deptno, dname FROM scott.dept D 
 WHERE EXISTS ( SELECT 'X' FROM scott.emp E WHERE E.deptno = D.deptno)
/