广告
返回顶部
首页 > 资讯 > 数据库 >怎么增加Distinct提高查询效率
  • 334
分享到

怎么增加Distinct提高查询效率

2024-04-02 19:04:59 334人浏览 薄情痞子
摘要

这篇文章将为大家详细讲解有关怎么增加Distinct提高查询效率,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。  只有增加DISTINCT关键字,oracle必然需要对后

这篇文章将为大家详细讲解有关怎么增加Distinct提高查询效率,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

  只有增加DISTINCT关键字,oracle必然需要对后面的所有字段进行排序。以前也经常发现由于开发人员对sql不是很理解,在 SELECT列表的20多个字段前面添加了DISTINCT,造成查询基本上不可能执行完成,甚至产生ORA-7445错误。所以一直向开发人员强调 DISTINCT给性能带来的影响。下面编程网小编来讲解下如何增加Distinct提高查询效率?

  如何增加Distinct提高查询效率

  首先想到的是可能DISTINCT是在子查询中,由于加上了DISTINCT,将第一步结果集缩小了,导致查询性能提高,结果一看SQL,发现DISTINCT居然是在查询的最外层。

  由于原始SQL太长,而且牵扯的表太多,很难说清楚,这里模拟了一个例子,这个例子由于数据量和SQL的复杂程度限制,无法看出二者执行时间上的明显差别。这里从两种情况的逻辑读对比来说明问题。

  首先建立模拟环境:

  SQL> CREATE TABLE T1 AS SELECT * FROM DBA_OBJECTS

  2 WHERE OWNER = 'SYS'

  3 AND OBJECT_TYPE NOT LIKE '%BODY'

  4 AND OBJECT_TYPE NOT LIKE 'JAVA%';

  Table created.

  SQL> CREATE TABLE T2 AS SELECT * FROM DBA_SEGMENTS WHERE OWNER = 'SYS';

  Table created.

  SQL> CREATE TABLE T3 AS SELECT * FROM DBA_INDEXES WHERE OWNER = 'SYS';

  Table created.

  SQL> ALTER TABLE T1 ADD CONSTRaiNT PK_T1 PRIMARY KEY (OBJECT_NAME);

  Table altered.

  SQL> CREATE INDEX IND_T2_SEGNAME ON T2(SEGMENT_NAME);

  Index created.

  SQL> CREATE INDEX IND_T3_TABNAME ON T3(TABLE_NAME);

  Index created.

  SQL> EXEC DBMS_STATS.GATHER_TABLE_STATS(USER, 'T1', METHOD_OPT => 'FOR ALL INDEXED COLUMNS SIZE 100', CASCADE => TRUE)

  PL/SQL procedure successfully completed.

  SQL> EXEC DBMS_STATS.GATHER_TABLE_STATS(USER, 'T2', METHOD_OPT => 'FOR ALL INDEXED COLUMNS SIZE 100', CASCADE => TRUE)

  PL/SQL procedure successfully completed.

  SQL> EXEC DBMS_STATS.GATHER_TABLE_STATS(USER, 'T3', METHOD_OPT => 'FOR ALL INDEXED COLUMNS SIZE 100', CASCADE => TRUE)

  PL/SQL procedure successfully completed.

  仍然沿用上面例子中的结构,看看原始SQL和增加DISTINCT后的差别:

  如何增加Distinct提高查询效率

  SQL> SET AUTOT TRACE

  SQL> SELECT T1.OBJECT_NAME, T1.OBJECT_TYPE, T2.TABLESPACE_NAME

  2 FROM T1, T2

  3 WHERE T1.OBJECT_NAME = T2.SEGMENT_NAME

  4 AND T1.OBJECT_NAME IN

  5 (

  6 SELECT INDEX_NAME FROM T3

  7 WHERE T3.TABLESPACE_NAME = T2.TABLESPACE_NAME

  8 );

  311 rows selected.

  Execution Plan

  ----------------------------------------------------------

  0 SELECT STATEMENT Optimizer=CHOOSE (Cost=12 Card=668 Bytes=62124)

  1 0 HASH JOIN (SEMI) (Cost=12 Card=668 Bytes=62124)

  2 1 HASH JOIN (Cost=9 Card=668 Bytes=39412)

  3 2 TABLE ACCESS (FULL) OF 'T2' (Cost=2 Card=668 Bytes=21376)

  4 2 TABLE ACCESS (FULL) OF 'T1' (Cost=6 Card=3806 Bytes=102762)

  5 1 TABLE ACCESS (FULL) OF 'T3' (Cost=2 Card=340 Bytes=11560)

  Statistics

  ----------------------------------------------------------

  0 recursive calls

  0 db block gets

  93 consistent gets

  0 physical reads

  0 redo size

  8843 bytes sent via SQL*Net to client

  723 bytes received via SQL*Net from client

  22 SQL*Net roundtrips to/from client

  0 sorts (memory)

  0 sorts (disk)

  311 rows processed

  SQL> SELECT DISTINCT T1.OBJECT_NAME, T1.OBJECT_TYPE, T2.TABLESPACE_NAME

  2 FROM T1, T2

  3 WHERE T1.OBJECT_NAME = T2.SEGMENT_NAME

  4 AND T1.OBJECT_NAME IN

  5 (

  6 SELECT INDEX_NAME FROM T3

  7 WHERE T3.TABLESPACE_NAME = T2.TABLESPACE_NAME

  8 );

  311 rows selected.

  Execution Plan

  ----------------------------------------------------------

  0 SELECT STATEMENT Optimizer=CHOOSE (Cost=16 Card=1 Bytes=93)

  1 0 SORT (UNIQUE) (Cost=16 Card=1 Bytes=93)

  2 1 HASH JOIN (Cost=12 Card=1 Bytes=93)

  3 2 HASH JOIN (Cost=5 Card=668 Bytes=44088)

  4 3 TABLE ACCESS (FULL) OF 'T3' (Cost=2 Card=340 Bytes=11560)

  5 3 TABLE ACCESS (FULL) OF 'T2' (Cost=2 Card=668 Bytes=21376)

  6 2 TABLE ACCESS (FULL) OF 'T1' (Cost=6 Card=3806 Bytes=102762)

  Statistics

  ----------------------------------------------------------

  0 recursive calls

  0 db block gets

  72 consistent gets

  0 physical reads

  0 redo size

  8843 bytes sent via SQL*Net to client

  723 bytes received via SQL*Net from client

  22 SQL*Net roundtrips to/from client

  1 sorts (memory)

  0 sorts (disk)

  311 rows processed

  从统计信息可以看出,添加了DISTINCT后,语句的逻辑读反而比不加DISTINCT要高。为什么会产生这种情况,还要从执行计划说起。

  不加DISTINCT的情况,由于使用IN子查询的查询,Oracle对第二个连接采用了HASH JOIN SEMI,这种HASH JOIN SEMI相对于普通的HASH JOIN,代价要大一些。

  而添加了DISTINCT之后,Oracle知道最终肯定要进行排序去重的操作,因此在连接的时候就选择了HASH JOIN作为了连接方式。这就是为什么加上了DISTINCT之后,逻辑读反而减少了。但是同时,加上了DISTINCT之后,语句增加了一个排序操作, 而在不加DISTINCT的时候,是没有这个操作的。

  当连接的表数据量很大,但是SELECT的最终结果不是很多,且SELECT列的 个数不是很多的时候,加上DISTINCT之后,这个排序的代价要小于SEMI JOIN连接的代价。这就是增加一个DISTINCT操作查询效率反而提高,这个似乎不可能发生的情况的真正原因。

  最后需要说明一下, 这篇文章意在说明,优化的时候没有什么东西是一成不变的,几乎任何事情都有可能发生,不要被一些所谓死规则限制住。明白了这一点就可以了。这篇文章并不是 打算提供一种优化SQL的方法,严格意义上将,加上DISTINCT和不加DISTINCT是两个完全不同的SQL语句。虽然在这个例子中,二者是等价 的,但是这是表结构、约束条件和数据本身共同限制的结果。换了另一个环境,这两个SQL得到的结果可能会相去甚远,所以,不要试图将本文的例子作为优化时 的一种方法。

关于“怎么增加Distinct提高查询效率”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

您可能感兴趣的文档:

--结束END--

本文标题: 怎么增加Distinct提高查询效率

本文链接: https://www.lsjlt.com/news/55181.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 怎么增加Distinct提高查询效率
    这篇文章将为大家详细讲解有关怎么增加Distinct提高查询效率,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。  只有增加DISTINCT关键字,Oracle必然需要对后...
    99+
    2022-10-18
  • 怎么提高MySQL查询效率
    本篇内容介绍了“怎么提高MySQL查询效率”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!MySQL由于它本...
    99+
    2022-10-18
  • 怎么提高sql查询效率
    怎么提高sql查询效率 ?这个问题可能是我们日常学习或工作经常见到的。希望通过这个问题能让你收获颇深。下面是小编给大家带来的参考内容,让我们一起来看看吧!1.对查询进行优化,应尽量避免全表扫描,首先应考虑在...
    99+
    2022-10-18
  • ElasticSearch中怎么提高查询效率
    ElasticSearch中怎么提高查询效率,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。性能优化的杀手锏——filesystem cache你往 es 里写的...
    99+
    2023-06-02
  • mongodb数组查询效率怎么提高
    要提高MongoDB数组查询的效率,可以考虑以下几个方面:1. 索引优化:为数组字段创建适当的索引,以加快查询速度。在创建索引时,可...
    99+
    2023-09-12
    mongodb
  • mongodb联表查询效率怎么提高
    要提高MongoDB联表查询的效率,可以尝试以下几种方法:1. 使用索引:在关联字段上创建索引,可以加快关联查询的速度。确保在关联字...
    99+
    2023-09-06
    mongodb
  • oracle视图查询效率怎么提高
    要提高Oracle视图的查询效率,可以采取以下几个方法:1. 索引优化:为视图的底层表创建合适的索引,以加快查询速度。通过分析查询语...
    99+
    2023-08-15
    oracle
  • 怎么优化php模糊查询以提高查询效率
    本篇内容主要讲解“怎么优化php模糊查询以提高查询效率”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么优化php模糊查询以提高查询效率”吧!一、了解模糊查询模糊查询是指在数据库中按模式匹配数据...
    99+
    2023-07-05
  • 怎么提高MySQL数据库查询效率
    这篇文章主要讲解了“怎么提高MySQL数据库查询效率”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么提高MySQL数据库查询效率”吧!  使用statem...
    99+
    2022-10-18
  • 【③MySQL 数据查询】:提高查询的效率
    前言 ✨欢迎来到小K的MySQL专栏,本节将为大家带来MySQL数据查询的讲解(基本、分组、排序、聚合、分页、条件查询) 目录 前言一、基本查询二、条件查询三、聚合函数(统计函数)四、分组查询五、排序查询五、分页查询六、总结 ...
    99+
    2023-08-19
    mysql 数据库 sql
  • 如何提高mysql查询效率
    今天小编给大家分享一下如何提高mysql查询效率的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。数据库设计优化数据库设计是My...
    99+
    2023-07-06
  • 怎么提高MySQL的Order by语句查询效率
    这篇文章主要讲解了“怎么提高MySQL的Order by语句查询效率”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么提高MySQL的Order by语句查...
    99+
    2022-10-18
  • 提高SQL查询效率的21种方法
    对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。 应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如...
    99+
    2021-04-03
    提高SQL查询效率的21种方法 数据库入门 数据库基础教程 数据库 mysql
  • MySQL索引提高查询效率的方法
    这篇文章主要介绍了MySQL索引提高查询效率的方法,具有一定借鉴价值,需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获。下面让小编带着大家一起了解一下。正文MySQL的索引本质上是一种数据结构让我们先...
    99+
    2022-10-18
  • 怎么在一个千万级的数据库查询中提高查询的效率
    小编给大家分享一下怎么在一个千万级的数据库查询中提高查询的效率,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!在实际项目中,当数据...
    99+
    2022-10-18
  • 怎么使用PHP实现MySQL分表来提高查询效率
    这篇文章主要介绍“怎么使用PHP实现MySQL分表来提高查询效率”,在日常操作中,相信很多人在怎么使用PHP实现MySQL分表来提高查询效率问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么使用PHP实现My...
    99+
    2023-07-05
  • MySQL索引提高查询效率的原因是什么
    小编给大家分享一下MySQL索引提高查询效率的原因是什么,希望大家阅读完这篇文章后大所收获,下面让我们一起去探讨吧!mysql教程栏目介绍索引提高查询效率的原因。背景我相信大家在数据库优化的时候都会说到索引...
    99+
    2022-10-18
  • 深入理解MySQL MVCC 原理,提高查询效率
    深入理解MySQL MVCC 原理,提高查询效率在数据库中,有效地处理并发事务一直是一个重要的挑战。MySQL 中的多版本并发控制(Multi-Version Concurrency Control,MVCC)是一种处理并发事务的机制,它能...
    99+
    2023-10-22
    MySQL MVCC(Multi-Version Concurrency Control) 查询效率
  • 为了提高查询效率而做分表心得
    为了提高查询效率而做分表心得 原博主帖子 http://www.cnblogs.com/zhangyabin---acm/p/5955001.html   针对超大业务数...
    99+
    2022-10-18
  • MySQL中索引提高查询效率的原因是什么
    MySQL中索引提高查询效率的原因是什么,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。磁盘IO和预读:先说一下磁盘IO,磁盘读...
    99+
    2022-10-18
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作