0

我正在使用数据库 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 数据库的新手。

4

2 回答 2

1

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

然后我建议使用INNER JOINandIN子句将您的查询更改为以下内容:

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') 才能工作。

祝你好运。

于 2013-02-06T13:52:10.150 回答
1

另外...你可以考虑去掉distinct。它大大降低了性能。我相信这就是您的查询挂起的原因。然后我会用 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)
/
于 2013-02-06T14:49:54.090 回答