distinct oracle_distinct很慢 oracle - CSDN
精华内容
参与话题
  • ORACLE中的distinct的用法

    千次阅读 2012-11-29 11:29:18
    distinct主要是统计不重复的字段,过滤掉重复的字段,对重复的字段只后去一次  eg.  我现在要14和6 这个是人员的id   SELECT DISTINCT(t.user_id) from 表名 t  查询结果于下:  我还要...

                           distinct主要是统计不重复的字段,过滤掉重复的字段,对重复的字段只后去一次

       eg.

           我现在要14和6  这个是人员的id 


          SELECT DISTINCT(t.user_id) from  表名  t

        查询结果于下:


      我还要对其统计条数

    SELECT COUNT(1) AS 人员的数量 from(SELECT DISTINCT(t.user_id) from  表名  t)


    自己的一点小笔记。大笑

    展开全文
  • oracledistinct的用法详解

    千次阅读 2016-12-16 09:47:32
    distinct这个关键字来过滤掉多余的重复记录只保留一条,但往往只用它来返回不重复记录的条数,而不是用它来返回不重记录的所有值。其原因是distinct只有用二重循环查询来解决,而这样对于一个数据量非常大的站来说,...

    作者:Eric.Yan

    distinct这个关键字来过滤掉多余的重复记录只保留一条,但往往只用它来返回不重复记录的条数,而不是用它来返回不重记录的所有值。其原因是distinct只有用二重循环查询来解决,而这样对于一个数据量非常大的站来说,无疑是会直接影响到效率的。

    下面先来看看例子:

    table表

    字段1     字段2    id        name    1           a    2           b    3           c    4           c    5           b

    库结构大概这样,这只是一个简单的例子,实际情况会复杂得多。

    比如我想用一条语句查询得到name不重复的所有数据,那就必须使用distinct去掉多余的重复记录。

    select distinct name from table 得到的结果是:

    ----------

    name    a    b    c

    好像达到效果了,可是,我想要得到的是id值呢?改一下查询语句吧:

    select distinct name, id from table

    结果会是:

    ----------

    id name    1 a    2 b    3 c    4 c    5 b

    distinct怎么没起作用?作用是起了的,不过他同时作用了两个字段,也就是必须得id与name都相同的才会被排除。。。。。。。

    我们再改改查询语句:

     select id, distinct name from table

    很遗憾,除了错误信息你什么也得不到,distinct必须放在开头。难到不能把distinct放到where条件里?能,照样报错。

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

    下面方法也不可行:

    select *, count(distinct name) from table group by name

    结果:

    ORA-00979: not a GROUP BY expression
    00979. 00000 - "not a GROUP BY expression"

    依然报错, 

    group by 必须放在 order by 和 limit之前,不然会报错

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

    偶认为这样可行

    select max(id), name from table group by name;

    结果:

    id name
    1  a
    2  b
    4  c
    5  d

    用法二:

    一、数据:

    1    zjx    001    AAAiBZAAQAAAAVPAAA
    2    zjx    002    AAAiBZAAQAAAAVPAAB
    3    zjx    001    AAAiBZAAQAAAAVPAAC

    二、多字段

    select distinct t.name,t.code from test1 t
    select distinct t.* from test1 t

    结果:

    1    zjx    001
    2    zjx    002

    三、单字段

    select distinct t.name from test1 t

    结果:

    1    zjx

    展开全文
  • oracle distinct

    2010-06-04 16:16:08
    distinct这个关键字来过滤掉多余的重复记录只保留一条,但往往只用 它来返回不重复记录的条数,而不是用它来返回不重记录的所有值。其原因是distinct只有用二重循环查询来解决,而这样对于一个数据量非常大的站来说...
    distinct这个关键字来过滤掉多余的重复记录只保留一条,但往往只用 它来返回不重复记录的条数,而不是用它来返回不重记录的所有值。其原因是distinct只有用二重循环查询来解决,而这样对于一个数据量非常大的站来说,无疑是会直接影响到效率的。

    下面先来看看例子:

    table表

    字段1 字段2
    id name
    1 a
    2 b
    3 c
    4 c
    5 b

    库结构大概这样,这只是一个简单的例子,实际情况会复杂得多。

    比如我想用一条语句查询得到name不重复的所有数据,那就必须使用distinct去掉多余的重复记录。

    select distinct name from table
    得到的结果是:



    ----------

    name
    a
    b
    c

    好像达到效果了,可是,我想要得到的是id值呢?改一下查询语句吧:

    select distinct name, id from table

    结果会是:

    ----------

    id name
    1 a
    2 b
    3 c
    4 c
    5 b

    distinct怎么没起作用?作用是起了的,不过他同时作用了两个字段,也就是必须得id与name都相同的才会被排除。。。。。。。

    我们再改改查询语句:

    select id, distinct name from table

    很遗憾,除了错误信息你什么也得不到,distinct必须放在开头。难到不能把distinct放到where条件里?能,照样报错。

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

    下面方法可行:

    select *, count(distinct name) from table group by name

    结果:

    id name count(distinct name)
    1 a 1
    2 b 1
    3 c 1

    最后一项是多余的,不用管就行了,目的达到。。。。。

    group by 必须放在 order by 和 limit之前,不然会报错
    =====================================以上是关于oracle的distinct的一种用法========================================
    用distinct关键字只能过滤查询字段中所有记录相同的(记录集相同),而如果要指定一个字段却没有效果,另外distinct关键字会排序,效率很低。

    select distinct name from t1 能消除重复记录,但只能取一个字段,现在要同时取id,name这2个字段的值。
    select distinct id,name from t1 可以取多个字段,但只能消除这2个字段值全部相同的记录
    所以用distinct达不到想要的效果,用group by 可以解决这个问题。
    展开全文
  • Oracle DISTINCT 关键字

    千次阅读 2013-11-12 01:32:24
    只要有增加DISTINCT关键字,Oracle必然需要对后面的所有字段进行排序。以前也经常发现由于开发人员对SQL不是很理解,在SELECT列表的20多个字段前面添加了DISTINCT,造成查询基本上不可能执行完成,甚至产生ORA-7445...

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

      没想到开发人员在测试一条大的SQL的时候,告诉我如果加上了DISTINCT,则查询大概需要4分钟左右可以执行完,如果不加DISTINCT,则查询执行了10多分钟,仍然得不到结果。

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

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

      首先建立模拟环境: 



    Code highlighting produced by Actipro CodeHighlighter (freeware)
    http://www.CodeHighlighter.com/

    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后的差别



    Code highlighting produced by Actipro CodeHighlighter (freeware)
    http://www.CodeHighlighter.com/

    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 (FULLOF 'T2' (Cost=2 Card=668 Bytes=21376)
      
    4 2 TABLE ACCESS (FULLOF 'T1' (Cost=6 Card=3806 Bytes=102762)
      
    5 1 TABLE ACCESS (FULLOF '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 (FULLOF 'T3' (Cost=2 Card=340 Bytes=11560)
      
    5 3 TABLE ACCESS (FULLOF 'T2' (Cost=2 Card=668 Bytes=21376)
      
    6 2 TABLE ACCESS (FULLOF '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得到的结果可能会相去甚远,所以,不要试图将本文的例子作为优化时的一种方法

    展开全文
  • Oracle去重函数distinct

    千次阅读 2019-11-27 10:40:24
    distinct用于返回唯一不同的值。 表table1: id value 1 a 1 a 2 b 3 b 4 c 5 c 表table2: username password tom s123456 toms 123456 表table3: ...
  • oracle distinct用法

    万次阅读 2019-09-18 12:53:04
    针对distinct不能一次查询用户想要的结果,采用group by解决 查询表(大批量的车牌号重复、要把重复的车牌号去掉,同时显示完整信息id、车牌号、型号) SQL> select a.cid,a.cbrand,a.cmodel from aps_car a; ...
  • Oracledistinct的用法实例 摘要: 此外,distinct 会对返回的结果集进行排序 所以会大大影响查询效率,大数据集时比较明显 。所以,最好和order by 结合使用,可以提高效率 。 select distinct a,b,c from t...
  • Oracle -- DISTINCT的用法

    2014-05-20 09:38:19
    distinct这个关键字来过滤掉多余的重复记录只保留一条,但往往只用 它来返回不重复记录的条数,而不是用它来返回不重复记录的所有值。其原因是distinct只有用二重循环查询来解决,而这样对于一个数据量非常大的站来...
  • oracledistinct和count函数组合使用

    万次阅读 2017-01-11 08:56:21
    oracle中的distinct关键字和count函数需要经常组合起来使用 例如,如果我们拿到一个仅有员工基本信息的列表,我们希望得到这个公司共有多少个部门。 我们可以这样做: select count(a.deptno) from ...
  • oracle数据库使用distinct多个字段

    万次阅读 2014-01-24 13:13:53
    select DISTINCT(t.f_resume_id||t.f_resume_status),t.f_resume_status,t.f_resume_status,t.f_recruit_channel,  t.f_small_channel_id   from css.T_RESUME_INFO t where t.f_resume_st
  • oracledistinct多个字段

    万次阅读 2010-10-18 09:35:00
    select DISTINCT(t.f_resume_id||t.f_resume_status),t.f_resume_status,t.f_resume_status,t.f_recruit_channel, t.f_small_channel_id from wintalent3.T_CORP_LOG_RESUME_INFO t where t.f_resume_status in ...
  • oracle distinct多字段去重

    千次阅读 2016-02-19 10:59:00
    --select * from ti_vw_boss结果: transactionid dn dn_type productid src_spid opt_type opt_time state 100000000000011213 15855057001 0 PI
  • oracle统计数量count和distinct组合使用

    千次阅读 2015-07-21 15:12:28
    先去除重复的,然后使用count计算数量 select count(distinct(t.列)) from 表 t
  • Oracle中通过distinct无法过滤关联查询出来的数据,这个查询是关联了很多子查询. select    distinct   sys_guid(),........from ....... 只能通过group by来进行过滤 select    distinct   sys_...
  • Oracle——distinct的用法(效率)

    万次阅读 2015-12-31 16:28:09
    Oracle——distinct的用法 博客分类:  Oracle oracledistinctgroup by  distinct这个关键字来过滤掉多余的重复记录只保留一条,但往往只用 它来返回不重复记录的条数,而不是用它来返回不...
  • oracle查询对某个字段进行去重处理

    千次阅读 2019-10-29 14:57:51
    oracle查询对某个字段进行去重处理需要使用distinct函数 比如从A表查询aa字段和bb字段,然后对aa字段进行去重,查询语句如下: SELECT distinct(a.aa) as aa,a.bb as bb FROM A a 提示:去重的字段必须放在第一...
  • 事例在Oracle数据库中执行SQL:  select distinct name from tableName order by id 原本想过滤name字段重复值,并按照id进行排序,但是SQL报错,无法执行。 原因:SELECT语句中含有DISTINCT关键字或者有...
  • 1.当select语句中包含distinct时,无论遇到多少个空值,结果中只返回一个null
  • Oracle】sql循环遍历查询结果

    万次阅读 2017-03-09 17:43:16
    轨迹表特点: 一天一张轨迹表,存储武汉市全市渣土车数据,名称以GA_GPS_HISTORY_开头,大概一天会有几千台车,每天数据量大概几百万条记录至千万条记录,目前存储有5个月的数据。 需求: ...
  • oracle 中select distinct 和order by 的问题

    千次阅读 2015-01-17 23:02:46
    select distinct name from tableName order by id 原本想过滤name字段重复值,并按照id进行排序,但是SQL报错,无法执行。 网上搜到解释如下: 在 ordere by 中指定多个列,结果将先按照子句中的第一列排序...
1 2 3 4 5 ... 20
收藏数 61,240
精华内容 24,496
关键字:

distinct oracle