Oracle select distinct

本文讨论了在Oracle数据库查询中滥用DISTINCT关键字的问题,并通过具体示例说明了其可能导致的性能开销。建议开发者注意DISTINCT的使用场景,避免不必要的性能损失。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

做项目,写oracle查询语句的时候,总是喜欢滥用distinct关键字。但后来发现,某些场合下,distinct的性能开销非常大。

with 
diag_list as 
(select distinct diagnosis_desc from medrec.diagnosis where diagnosis_desc is not null),
diag_dict as 
(select distinct diagnosis_name,diagnosis_code from comm.diagnosis_dict where diagnosis_name is not null and diagnosis_code is not null)
select <span style="color:#ff0000;">distinct</span> t1.diagnosis_desc,t2.diagnosis_code,t2.diagnosis_name from diag_list t1,diag_dict t2 
where INSTR(t1.diagnosis_desc,t2.diagnosis_name)>0;

红色的distinct是完全没有必要的。而且,这个distinct的性能开销极大。


有时间的时候,可以使用profiler之类的工具对不同场景下的distinct对性能的影响进行量化分析。这里先做个备忘。

### OracleDISTINCT 的使用方法 在 Oracle 数据库中,`DISTINCT` 关键字用于从查询结果中去除重复的记录,仅返回唯一的值。它通常用在 `SELECT` 语句中,并且只能与 `SELECT` 一起使用[^1]。`DISTINCT` 是 ANSI SQL 标准的一部分,而 `UNIQUE` 是 Oracle 特有的同义词,但为了数据库迁移和兼容性考虑,建议优先使用 `DISTINCT`。 #### 基本语法 ```sql SELECT DISTINCT column_name FROM table_name; ``` 上述语法将返回指定列中所有不重复的值。 #### 示例 假设有一个名为 `employees` 的表,其数据如下: | employee_id | department | |-------------|------------| | 1 | HR | | 2 | IT | | 3 | HR | | 4 | Sales | | 5 | IT | 如果希望获取所有不同的部门名称,则可以使用以下查询: ```sql SELECT DISTINCT department FROM employees; ``` 执行该查询后,将返回以下结果: | department | |------------| | HR | | IT | | Sales | 通过这种方式,可以轻松地过滤掉重复的部门信息,仅保留唯一的部门名称[^2]。 #### 多列去重 `DISTINCT` 还可以应用于多个列,以确保多列组合的唯一性。例如: ```sql SELECT DISTINCT department, location FROM employees; ``` 此查询将返回 `department` 和 `location` 组合后的唯一记录集。 ### DISTINCT 与 UNIQUE 的比较 在 Oracle 中,`DISTINCT` 和 `UNIQUE` 是等效的,都可以实现去重功能。然而,`DISTINCT` 是 ANSI SQL 标准的一部分,适用于大多数数据库系统,而 `UNIQUE` 是 Oracle 特定的语法。因此,在编写可移植的 SQL 代码时,推荐使用 `DISTINCT`。 ### 性能注意事项 虽然 `DISTINCT` 是一个非常有用的工具,但在处理大数据集时可能会影响性能。这是因为 Oracle 需要对结果集进行排序并去除重复值,这可能会消耗较多的 CPU 和内存资源。因此,在某些情况下,可以通过索引优化或避免不必要的去重操作来提升查询效率。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值