精华内容
下载资源
问答
  • 我们经常会对select结果进行对比,常用的函数如minus, 那么当两张表数据量较大时,有什么方式可以提高效率呢? minus 方式 minus 执行计划如下所示, 通过排序后再进行对比 select object_id from t2 minus select...

    我们经常会对select结果进行对比,常用的函数如minus, 那么当两张表数据量较大时,有什么方式可以提高效率呢?

    minus 方式
    minus 执行计划如下所示, 通过排序后再进行对比
    select object_id from t2 minus select object_id from t1;
    ..
    2255 rows selected.
    Elapsed: 00:00:00.93
    Execution Plan

    Plan hash value: 1578327006

    | Id | Operation | Name | Rows | Bytes |TempSpc| Cost (%CPU)| Time |

    | 0 | SELECT STATEMENT | | 102K| 2357K| | 1318 (1)| 00:00:16 |
    | 1 | MINUS | | | | | | |
    | 2 | SORT UNIQUE | | 102K| 1304K| 2024K| 861 (1)| 00:00:11 |
    | 3 | TABLE ACCESS FULL | T2 | 102K| 1304K| | 371 (1)| 00:00:05 |
    | 4 | SORT UNIQUE | | 82926 | 1052K| 1640K| 457 (1)| 00:00:06 |
    | 5 | INDEX FAST FULL SCAN| T1_IDX | 82926 | 1052K| | 60 (0)| 00:00:01 |

    Note

    • dynamic sampling used for this statement (level=2)

    Statistics

      9  recursive calls   --递归
      0  db block gets
       1681  consistent gets
       1798  physical reads
      0  redo size
      41734  bytes sent via SQL*Net to client
       2173  bytes received via SQL*Net from client
    152  SQL*Net roundtrips to/from client
      2  sorts (memory)
      0  sorts (disk)
       2255  rows processed

    使用join方式替代
    尤其数据量越大的情况下,join方式,不排序,走的hash算法,执行游戏效率会更好
    alter system flush buffer cache;
    select t2.object_id t2_id from t1 right join t2 on t1.object_id=t2.object_id where t1.object_id is null;
    2255 rows selected.
    Elapsed: 00:00:00.56
    Execution Plan

    Plan hash value: 4276371593

    | Id | Operation | Name | Rows | Bytes |TempSpc| Cost (%CPU)| Time |

    | 0 | SELECT STATEMENT | | 102K| 2609K| | 653 (1)| 00:00:08 |
    |* 1 | HASH JOIN RIGHT ANTI | | 102K| 2609K| 2032K| 653 (1)| 00:00:08 |
    | 2 | INDEX FAST FULL SCAN| T1_IDX | 82926 | 1052K| | 60 (0)| 00:00:01 |
    | 3 | TABLE ACCESS FULL | T2 | 102K| 1304K| | 371 (1)| 00:00:05 |

    Predicate Information (identified by operation id):

    1 - access("T1"."OBJECT_ID"="T2"."OBJECT_ID")
    Note

    • dynamic sampling used for this statement (level=2)

    Statistics

      0  recursive calls    --没有递归游戏调用
      0  db block gets
       1692  consistent gets
       1534  physical reads
      0  redo size
      41730  bytes sent via SQL*Net to client
       2173  bytes received via SQL*Net from client
    152  SQL*Net roundtrips to/from client
      0  sorts (memory)
      0  sorts (disk)
       2255  rows processed
    展开全文
  • 我认为这是SQL非常重要的东西,但是我不清楚它是什么(我很确定在我之前使用过的其他数据库中,我列出的三种方法都给出了相同的结果 – 尽管我不喜欢现在没有SQL Server或postgres进行测试,所以我可能会错误地记录他们...

    我有两张桌子:

    CREATE TABLE test1

    (id int);

    CREATE TABLE test2

    (id int);

    INSERT INTO test1

    VALUES (1);

    INSERT INTO test1

    VALUES (2);

    INSERT INTO test2

    VALUES (1);

    然后我想查看test1中所有id的列表,而不是test2中的id.

    我至少有三种方法可以做到这一点:

    外部加入:

    SELECT a.id

    FROM test1 a LEFT OUTER JOIN test2 b

    ON a.id = b.id

    WHERE b.id IS NULL;

    减去:

    SELECT id

    FROM test1

    MINUS

    SELECT id

    FROM test2;

    不在:

    SELECT id

    FROM test1

    WHERE id NOT IN (

    SELECT id

    FROM test2

    );

    到现在为止还挺好.所有这三个查询都应该给我相同的结果:1行,值为2.

    如果我在test2中插入一个null,那么OUTER JOIN和MINUS查询将继续返回相同的结果,但NOT IN不会返回任何行.

    这让我很困惑.然后我注意到,如果我把它改成了

    SELECT id

    FROM test1

    WHERE id NOT IN (

    SELECT id

    FROM test2

    WHERE id IS NOT NULL

    );

    我得到了我期待的结果 – 再一行.

    为什么会这样?我认为这是SQL非常重要的东西,但是我不清楚它是什么(我很确定在我之前使用过的其他数据库中,我列出的三种方法都给出了相同的结果 – 尽管我不喜欢现在没有SQL Server或postgres进行测试,所以我可能会错误地记录他们的行为.

    (我想对此的一个答案是“不要担心,只是不要使用NOT IN”,但这在代码可读性方面可能很昂贵 – 有时这比使用外连接或减去所有内容更优雅.)

    展开全文
  • SQL语句中的三个关键字:MINUS(减去),INTERSECT(交集)和UNION ALL(并集); MINUS 你有的我不显示 INTERSECT 共同有的则显示出来 UNION ALL 你的和我的都显示出来 关于集合的概念,中学都应该学过,就不多...

    SQL语句中的三个关键字:MINUS(减去),INTERSECT(交集)和UNION ALL(并集);

     

    MINUS

    你有的我不显示

     

    INTERSECT

    共同有的则显示出来

     

    UNION ALL

    你的和我的都显示出来

     

    关于集合的概念,中学都应该学过,就不多说了.这三个关键字主要是对数据库的查询结果进行操作,正如其中文含义一样:两个查询,MINUS是从第一个查询结果减去第二个查询结果,如果有相交部分就减去相交部分;否则和第一个查询结果没有区别. INTERSECT是两个查询结果的交集,UNION ALL是两个查询的并集;

     

     虽然同样的功能可以用简单SQL语句来实现,但是性能差别非常大,有人做过实验:made_order共23万笔记录,charge_detail共17万笔记录:

        SELECT order_id FROM made_order
      MINUS
      SELECT order_id FROM charge_detail
    耗时:1.14 sec
      
      SELECT a.order_id FROM made_order a
       WHERE a.order_id NOT exists (
         SELECT order_id
         FROM charge_detail
         WHERE order_id = a.order_id
       )
    耗时:18.19 sec
    性能相差15.956倍!因此在遇到这种问题的时候,还是用MINUS,INTERSECT和UNION ALL来解决问题,否则面对业务中随处可见的上百万数据量的查询,数据库服务器还不被咱玩的死翘翘?

    PS:应用两个集合的相减,相交和相加时,是有严格要求的:1.两个集合的字段必须明确(用*就不行,报错);2.字段类型和顺序相同(名称可以不同),如:集合1的字段1是NUMBER,字段2是VARCHAR,那么集合2的字段1必须也是NUMBER,字段2必须是VARCHAR;3.不能排序,如果要对结果排序,可以在集合运算后,外面再套一个查询,然后排序,如前面的例子可以改成:

    SELECT * FROM 
       (SELECT order_id FROM made_order
       MINUS
      SELECT order_id FROM charge_detail)
    ORDER BY ORDER_ID ASC

    转载于:https://www.cnblogs.com/youngerger/p/8490802.html

    展开全文
  • SQL语句中的三个关键字:MINUS(减去),INTERSECT(交集)和UNION ALL(并集);关于集合的概念,中学都应该学过,就不多说了.这三个关键字主要是对数据库的查询结果进行操作,正如其中文含义一样:两个查询,MINUS是从第一个查询...

    SQL语句中的三个关键字:MINUS(减去),INTERSECT(交集)和UNION ALL(并集);

    关于集合的概念,中学都应该学过,就不多说了.这三个关键字主要是对数据库的查询结果进行操作,正如其中文含义一样:两个查询,MINUS是从第一个查询结果减去第二个查询结果,如果有相交部分就减去相交部分;否则和第一个查询结果没有区别. INTERSECT是两个查询结果的交集,UNION ALL是两个查询的并集;

     

     虽然同样的功能可以用简单SQL语句来实现,但是性能差别非常大,有人做过实验:made_order共23万笔记录,charge_detail共17万笔记录:

        SELECT order_id FROM made_order
      MINUS
      SELECT order_id FROM charge_detail
    耗时:1.14 sec
      
      SELECT a.order_id FROM made_order a
       WHERE a.order_id NOT exists (
         SELECT order_id
         FROM charge_detail
         WHERE order_id = a.order_id
       )
    耗时:18.19 sec
    性能相差15.956倍!因此在遇到这种问题的时候,还是用MINUS,INTERSECT和UNION ALL来解决问题,否则面对业务中随处可见的上百万数据量的查询,数据库服务器还不被咱玩的死翘翘?

    PS:应用两个集合的相减,相交和相加时,是有严格要求的:1.两个集合的字段必须明确(用*就不行,报错);2.字段类型和顺序相同(名称可以不同),如:集合1的字段1是NUMBER,字段2是VARCHAR,那么集合2的字段1必须也是NUMBER,字段2必须是VARCHAR;3.不能排序,如果要对结果排序,可以在集合运算后,外面再套一个查询,然后排序,如前面的例子可以改成:

    SELECT * FROM
       (SELECT order_id FROM made_order
       MINUS
      SELECT order_id FROM charge_detail)
    ORDER BY ORDER_ID ASC

     

    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/gan690416372/archive/2009/12/15/5012397.aspx

    展开全文
  • SQLMINUS的用法

    2021-03-24 17:23:17
    minus 指令是运用在两个 SQL 语句上。它先找出第一个 SQL 语句所产生的结果,然后看这些结果有没有在第二个 SQL 语句的结果中。如果有的话,那这一笔资料就被去除,而不会在最后的结果中出现。如果第二个 SQL 语句所...
  • SQL MINUS

    2012-04-24 15:27:00
    MINUS 指令是运用在两个 SQL 语句上。它先找出第一个 SQL 语句所产生的结果,然后看这些结果有没有在第二个 SQL 语句的结果中。如果有的话,那这一笔资料就被去除,而不会在最后的结果中出现。如果第二个 SQL 语句所...
  • sqlMInus

    2009-02-25 12:23:00
    MINUS 指令是运用在两个 SQL 语句上。它先找出第一个 SQL 语句所产生的结果,然后看这些结果有没有在第二个 SQL 语句的结果中。如果有的话,那这一笔资料就被去除,而不会在最后的结果中出现。如果第二个 SQL 语句所...
  • SQL语句教程(20) MINUS

    千次阅读 2007-05-19 09:35:00
    SQL语句教程(20) MINUSMINUS 指令是运用在两个 SQL 语句上。它先找出第一个 SQL 语句所产生的结果,然后看这些结果有没有在第二个 SQL 语句的结果中。如果有的话,那这一笔资料就被去除,而不会在最后的结果中出现。...
  • SQL语句中的三个关键字:MINUS(减去),INTERSECT(交集)和UNION ALL(并集); 关于集合的概念,中学都应该学过,就不多说了.这三个关键字主要是对数据库的查询结果进行操作,正如其中文含义一样:两个查询,MINUS是从第一个...
  • 基本SQL语句、函数&复杂SQL语句

    千次阅读 2018-06-30 11:05:58
    ①oracle基本SQL语句; ②oracle单值、分组函数; ③oracle多表查询、集合运算。 基本SQL语句 SQL 是 Structured Query Language(结构化查询语言)的首字母缩写词 SQL 是数据库语言,Oracle使用该...
  • SQL MINUS

    2012-03-19 13:51:26
    MINUS 指令是运用在两个 SQL 语句上。它先找出第一个 SQL 语句所产生的结果,然后看这些结果有没有在第二个 SQL 语句的结果中。如果有的话,那这一笔资料就被去除,而不会在最后的结果中出现。如果第二个 SQL 语句所...
  • Intersect和Minus的操作和Union基本一致,这里一起总结一下: Union,对两个结果集进行并集操作,不包括重复行,同时进行默认规则的排序; Union All,对两个结果集进行并集操作,包括重复行,不进行排序; ...
  • 它先找出第一个 SQL 语句所产生的结果,然后看这些结果有没有在第二个 SQL语句的结果中。如果有的话,那第一个SQL结果数据就被去除,而不会在最后的结果中出现。如果第一个 SQL 语句所产生的结果并没有存在于第二个 ...
  • 数据库语言及访问接口 SQL的特点:一体化、非过程化、面向集合操作方式、灵活的使用方式(交互式、嵌入式) 视图与表的区别与联系: View是从一个或多个表中产生...SQL语句的书写: SQL语句实例 表操作 例 1 对于表...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 15,030
精华内容 6,012
关键字:

sql语句minus