数据比较和使用SQL查找最佳解决方案

时间:2017-02-25 22:05:03

标签: sql oracle bash logic

我有2张桌子。一个人有所有邀请的客人的数据。其他人都参加了派对。我如何检查未使用SQL的访客。假设有500,000名客人受邀,300,000位客人到场,您能否高效率假设。

如果我们必须使用脚本说bash脚本来自动化它。脚本会是什么样的?

4 个答案:

答案 0 :(得分:1)

我不确定该名称是否足够独特,但是,这是一个查询,它将从一个表中获取另一个表中不存在的行:

SELECT name
FROM tablea
WHERE NOT EXISTS
(SELECT name FROM tableb)
;

答案 1 :(得分:1)

有时,集合运算符是最简单的:

select name from invited
minus
select name from attended

答案 2 :(得分:0)

如果定义了合适的索引,我会使用反连接模式

 SELECT i.guest
   FROM invited i
     -- anti-join exclude
   LEFT
   JOIN attended a
     ON a.guest = i.guest 
  WHERE a.guest IS NULL

可以使用其他查询模式返回等效结果。

例如,带有相关子查询的NOT EXISTS

 SELECT i.guest
   FROM invited i
  WHERE NOT EXISTS ( SELECT 1
                       FROM attended a
                      WHERE a.guest = i.guest
                   )

EXPLAIN输出可能会显示相同的查询访问计划。

为了获得这些查询的最佳性能,我们需要定义索引

ON attended (guest)

答案 3 :(得分:0)

基于之前的评论,我想展示一下MINUS和ANTI JOIN之间的区别

我有一张大约1.8M的INVITED表和大约1.1M的GUESTS(参加者)

使用MINUS,

select name from invited
minus
select name from attended

---------------------------------------------------------------------------------------
| Id  | Operation           | Name    | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     |
---------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT    |         |       |       |       | 14364 (100)|          |
|   1 |  MINUS              |         |       |       |       |            |          |
|   2 |   SORT UNIQUE       |         |  1835K|    10M|    21M|  8977   (1)| 00:00:01 |
|   3 |    TABLE ACCESS FULL| INVITED |  1835K|    10M|       |  3038   (1)| 00:00:01 |
|   4 |   SORT UNIQUE       |         |  1101K|  6451K|    12M|  5388   (1)| 00:00:01 |
|   5 |    TABLE ACCESS FULL| GUESTS  |  1101K|  6451K|       |  1824   (1)| 00:00:01 |
---------------------------------------------------------------------------------------

使用ANTI JOIN

SELECT i.name
   FROM invited i
     -- anti-join exclude
   LEFT
   JOIN guests g
     ON g.name = i.name
  WHERE g.name IS NULL
;


----------------------------------------------------------------------------------------
| Id  | Operation            | Name    | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     |
----------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT     |         |       |       |       |  7744 (100)|          |
|*  1 |  HASH JOIN RIGHT ANTI|         |  1835K|    21M|    18M|  7744   (1)| 00:00:01 |
|   2 |   TABLE ACCESS FULL  | GUESTS  |  1101K|  6451K|       |  1824   (1)| 00:00:01 |
|   3 |   TABLE ACCESS FULL  | INVITED |  1835K|    10M|       |  3038   (1)| 00:00:01 |
----------------------------------------------------------------------------------------

正如您所看到的,ANTI JOIN方法不需要执行排序,最终只需MINUS版本的一半。