【SQL】01_全表扫描

发布时间:2026/11/4 6:43:49
【SQL】01_全表扫描

系列文章

【Oracle】数据库服务器限制ip访问
本文链接:https://blog.csdn.net/youcheng_ge/article/details/122220930

【Oracle】Excel导入数据教程
本文链接:https://blog.csdn.net/youcheng_ge/article/details/118722756

【Oracle】数据库还原教程_数据泵
本文链接:https://blog.csdn.net/youcheng_ge/article/details/118054855

【SQL】如何查询表字段并识别主键
本文链接:https://blog.csdn.net/youcheng_ge/article/details/110820405

【SQL】outer apply的用法
本文链接:https://blog.csdn.net/youcheng_ge/article/details/79903489

【SQL】多表连接重复数据处理
本文链接:https://blog.csdn.net/youcheng_ge/article/details/79903619

MySQL安装教程(详细)
本文链接:https://blog.csdn.net/youcheng_ge/article/details/126037520

MySQL卸载教程(详细)
本文链接:https://blog.csdn.net/youcheng_ge/article/details/129279265

文章目录

  • 系列文章
  • 前言
  • 一、技术介绍
  • 二、数据脚本
  • 三、效果展示
  • 四、用法总结

前言

本专栏专注数据库原理与SQL实战。从建表、视图、索引等基础架构,到增删改查(CRUD)、触发器、事务处理及安全授权,全方位覆盖后端必备技能。拒绝碎片化学习,系统掌握嵌入式SQL与企业级数据操作。对内容感兴趣?持续关注不迷路,任何疑问欢迎评论或私信探讨!

一、技术介绍

视图的定义:

视图不是真实存在的基本表,而是一个虚拟表

二、数据脚本

创建表:

createtabletab1(c1 number,c2 varchar2(20));createtabletab2(c3 number,c4 varchar2(20));

插入数据:

declarebeginforrin1..99999loopbegininsertintotab1values(r,'a');end;endloop;insertintotab1values(100000,'b');commit;end;declarebeginforrin1..100000loopbegininsertintotab2values(r,'c'||to_char(r));end;endloop;commit;end;

情况1:查询SQL如下

select*fromtab1 twheret.c1=5000;

通过执行计划,我们确认SQL执行了全表扫描,需要建相关索引,减少扫描的数据块。

创建索引:

createindexcjq.idx_tab1_c1oncjq.tab1(c1)onlinecomputestatistics;

再次执行SQL:

情况2:查询SQL如下

select*fromtab1 twheret.c2='a';select*fromtab1 twheret.c2='b';

是否需要建如下索引?

createindexcjq.idx_tab1_c2oncjq.tab1(c2)onlinecomputestatistics;

情况3:查询SQL如下:

select*fromtab1 t1jointab2 t2ont1.c1=t2.c3wheret2.c4='c5000';

删除之前创建的索引cjq.idx_tab1_c1:

dropindexcjq.idx_tab1_c1;

SQL执行计划如下:

创建where条件索引:(tab2表c4列)

createindexcjq.idx_tab2_c4oncjq.tab2(c4)onlinecomputestatistics;

SQL执行计划如下:

创建表关联列的索引:(tab1表c1列,tab2表的c3列)

createindexcjq.idx_tab1_c1oncjq.tab1(c1)onlinecomputestatistics;createindexcjq.idx_tab2_c3oncjq.tab2(c3)onlinecomputestatistics;

SQL执行计划如下:

衍生:
表的三种连接方式:
1、 nested loop join
2、 hash join
3、 merge join
merge join SQL:
select *
from tab1 t1
join tab2 t2 on t1.c1 = t2.c3
order by c1

三、效果展示

四、用法总结

使用场景:
nested loop join:两个数据源关联,一个数据源数据量较大,一个较小,使用较小的数据源作为驱动表,驱动表的每一行数据循环到大表中匹配,匹配到即返回;
hash join:两个数据源关联,两个数据源的数据量均较大,循环匹配比较耗时,数据库一般把两个大表缓存到PGA内存中进行hash全表交叉匹配,消耗的资源较多,速度较慢;
merge join:hash join的特殊情况,当两个数据源均较大,且存在连接列的排序时,数据库采用该种连接方式。