使用INTERSECT来提高关联查询的效率
2014-08-07 08:29
253 查看
有三个表分别为et_task_termtt, et_core_thes_term_category ttc , et_core_thes_terms t 其中tt.termid=t.id、ttc.termid=t.id 刚 开始时用自然连接,sql语句为:select t.name from et_task_term tt,et_core_thes_term_category ttc , et_core_thes_terms
t where tt.termid=ttc.termid and tt.taskid=50487 and ttc.inschemeid=14653 and ttc.categoryno='56GA' and tt.termid=t.id 运行时间为:3781ms
效率太低下,不能采用这种方式。
然后改为左外连接,sql为:select t.* from et_core_thes_terms t left outer join et_core_thes_term_category ttc on t.id =ttc.termid left outer join et_task_term tt on t.id =tt.termId where ttc.categoryno='56GA' and tt.taskid=504875
运行时间为:2985ms。虽然比自然连接效率高些,但是还是低下。
最后经过查询数据库手册想到了组合查询,组合查询包括并,交,差,语法为:
query1 UNION [ALL] query2
query1 INTERSECT [ALL] query2
query1 EXCEPT [ALL] query2
query1 和 query2
都是可以使用我们到此为止讨论的所有查询特性的查询。集合操作也可以嵌套和级连,比如
query1 UNION query2 UNION query3
实际上说的是
(query1 UNION query2) UNION query3
UNION 有效地把 query2
的结果附加到 query1 的结果上(不过我们不能保证这就是这些行实际返回的顺序)并且删除结果中所有重复的行,就象DISTINCT做的那样,除非你声明了UNION ALL。
INTERSECT 返回那些同时存在于 query1
的结果中和 query2的结果中的行,除非声明了INTERSECT ALL,否则所有重复行都被删除。
EXCEPT 返回所有在 query1
的结果中但是不在 query2 的结果中的行。 (有时侯这叫做两个查询的差。)除非声明了 EXCEPT ALL,否则所有重复行都被删除。
为了计算两个查询的并,交,差,这两个查询必须是"并集兼容的",也就意味着它们都返回同样数量的列,并且对应的列有兼容的数据类型。
最后的sql语句为:
select ect.id,ect.name from ( select ttc.termid from et_core_thes_term_category ttc where ttc.categoryno='56GA' and ttc.inschemeid=14653
INTERSECT select t.id from et_core_thes_terms t where t.thesid=14652
INTERSECT select tt.termid from et_task_term tt where tt.taskid=504875 ) a,et_core_thes_terms ect where a.termid=ect.id
运行时间为:203ms。效率较前两种情况明显的提高了。
t where tt.termid=ttc.termid and tt.taskid=50487 and ttc.inschemeid=14653 and ttc.categoryno='56GA' and tt.termid=t.id 运行时间为:3781ms
效率太低下,不能采用这种方式。
然后改为左外连接,sql为:select t.* from et_core_thes_terms t left outer join et_core_thes_term_category ttc on t.id =ttc.termid left outer join et_task_term tt on t.id =tt.termId where ttc.categoryno='56GA' and tt.taskid=504875
运行时间为:2985ms。虽然比自然连接效率高些,但是还是低下。
最后经过查询数据库手册想到了组合查询,组合查询包括并,交,差,语法为:
query1 UNION [ALL] query2
query1 INTERSECT [ALL] query2
query1 EXCEPT [ALL] query2
query1 和 query2
都是可以使用我们到此为止讨论的所有查询特性的查询。集合操作也可以嵌套和级连,比如
query1 UNION query2 UNION query3
实际上说的是
(query1 UNION query2) UNION query3
UNION 有效地把 query2
的结果附加到 query1 的结果上(不过我们不能保证这就是这些行实际返回的顺序)并且删除结果中所有重复的行,就象DISTINCT做的那样,除非你声明了UNION ALL。
INTERSECT 返回那些同时存在于 query1
的结果中和 query2的结果中的行,除非声明了INTERSECT ALL,否则所有重复行都被删除。
EXCEPT 返回所有在 query1
的结果中但是不在 query2 的结果中的行。 (有时侯这叫做两个查询的差。)除非声明了 EXCEPT ALL,否则所有重复行都被删除。
为了计算两个查询的并,交,差,这两个查询必须是"并集兼容的",也就意味着它们都返回同样数量的列,并且对应的列有兼容的数据类型。
最后的sql语句为:
select ect.id,ect.name from ( select ttc.termid from et_core_thes_term_category ttc where ttc.categoryno='56GA' and ttc.inschemeid=14653
INTERSECT select t.id from et_core_thes_terms t where t.thesid=14652
INTERSECT select tt.termid from et_task_term tt where tt.taskid=504875 ) a,et_core_thes_terms ect where a.termid=ect.id
运行时间为:203ms。效率较前两种情况明显的提高了。
相关文章推荐
- 验证使用子查询提高MySQL分页效率
- 使用WITH提高查询效率
- 数据库按照手机号分库后,还需要允许用户使用邮箱、用户名等登录,怎么才能提高查询效率?
- 使用NVL代替IS NULL OR IS NOT NULL,提高查询效率
- Oracle批量查询、删除、更新使用BULK COLLECT提高效率
- [转]使用 Bulk Collect提高Oracle查询效率
- Oracle模糊查询之(3.3从使用函数和sql语法角度来提高模糊查询效率 三)使用Oracle的instr函数与索引配合提高模糊查询的效率
- MySQL使用limit 1提高sql查询效率
- 提高多表关联数据查询效率
- 使用MySQL 5.7虚拟列提高查询效率
- 使用WITH提高查询效率
- Oracle模糊查询之(3.1从使用函数和sql语法角度来提高模糊查询效率 一)oracle模糊查询效率提高
- 使用Bulk Collect提高Oracle查询效率
- MySQL中明知道查询结果只有一个,SQL语句中使用LIMIT 1会提高查询效率
- 使用Bulk Collect提高Oracle查询效率
- 使用WITH提高查询效率
- 使用索引统计信息(Index Statistics)优化查询语句,提高查询效率
- 使用子查询提高MySQL分页效率 limit
- 使用Oracle的instr函数与索引配合提高模糊查询的效率
- 提高mysql查询效率及一些使用技巧记录