我正在使用数据库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数据库的新手。
答案 0 :(得分:1)
首先,确保您要加入的任何字段以及您在where条件中使用的任何字段都有索引。看起来至少是Table1.id,Table2.Id和Table2.userID。
然后我建议您使用INNER JOIN
和IN
条款将查询更改为以下内容:
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)
/