哪个Oracle查询更快

Posted

技术标签:

【中文标题】哪个Oracle查询更快【英文标题】:Which Oracle query is faster 【发布时间】:2018-11-24 15:08:50 【问题描述】:

我正在尝试使用 C# WPF 视图显示员工属性。

我的数据库中有“2”个不同的 oracle 表中的数据:

那些高层次的表结构是……

员工表 (EMP) - 列:

ID, Name, Organisation

员工属性表 (EMPPR) - 列

ID, PropertyName, PropertyValue

用户将输入“员工姓名列表”,我需要使用“2”表中的数据显示员工属性。

每个员工在EMPPR 表中拥有 40-80 的属性,即每个员工 40-80 行。在这种情况下,哪种方法更有效?

方法 #1 - 单次查询数据检索:

SELECT Pr.PropertyName, Pr.PropertyValue
FROM EMP Emp, EMPPR Pr
WHERE Emp.ID = Pr.ID
  AND Emp.Name IN (<List of Names entered>)

方法 #2 - 使用一个查询获取 ID 列表,并在第二个查询中使用该 ID 获取属性

查询 #1:

SELECT ID
FROM EMP
WHERE Name IN (<List of Names entered>)

Query #2:

SELECT PropertyName, PropertyValue
FROM EMPPR
WHERE ID IN (<List of IDs got from Query#1>)

我需要一次检索大约 10K 员工的详细信息,其中每个员工都有 40-80 个属性。

哪种方法好?

【问题讨论】:

Bad habits to kick : using old-style JOINs - 旧式 逗号分隔的表格列表 样式已替换为 ANSI 中的 proper ANSI JOIN 语法-92 SQL 标准(25 多年前),不鼓励使用它 【参考方案1】:

哪个查询更快?

第一个,它使用单个查询来获取您的结果。 为什么?处理查询所花费的大部分时间,尤其是像您这样具有中等大小行的查询,都消耗在从客户端到数据库服务器的来回传输上。

另外,当你有太多值时,WHERE something IN (val, val, val, val ... ... val) 构造可能会引发错误。所以第一个查询更健壮。

专业提示:进入 21 世纪并使用新的 JOIN 语法。

 SELECT Pr.PropertyName, Pr.PropertyValue
   FROM EMP Emp
   JOIN EMPPR Pr ON Emp.ID = Pr.ID
  WHERE Emp.Name IN (<List of Names Inputted>)

【讨论】:

同意这一点,数据库做“加入”的工作比让它在应用层/程序中完成要好得多,就像你在第二种方法中所做的那样 谢谢大家。如果我们使用与问题中提到的不同的 JOIN 语法,则性能会有所提高。 @UpendharSingirikonda - 不,性能没有差异。许多人发现显式连接语法更清晰。【参考方案2】:

使用第一种方法连接两个表,这比使用两次where子句要好得多。

【讨论】:

以上是关于哪个Oracle查询更快的主要内容,如果未能解决你的问题,请参考以下文章

Oracle 执行计划:成本与实际问题:成本较高的查询运行得更快

Oracle中,为啥同样的SELECT查询语句,加了CREATE TABLE AS后速度更快了?

如何在没有昂贵查询的情况下更快地自连接表(Oracle SQL)

oracle查询语句中使用between and 查询效率高吗? 与to_char相比如何?

请问,怎样查询是哪个用户(ip )导致oracle用户被锁

根据ID ,查询一个字段和全部查询哪个快