学习数据库(超越SQL):我在 Oracle 表的第一天
Source: Dev.to

嗯,今天的进展并不像我预期的那样。我本打算继续做平时的 PostgreSQL + SQL 练习,却意外地开始了一个面向开发者的免费 Oracle 课程。我只完成了第一模块,但它让我接触到了之前从未真正思考过的概念:
表格不仅仅是表格。 同一个词,却有截然不同的行为。
本文记录了我在 Oracle 中学习到的表类型、哪些内容立刻能理解、哪些感觉较为高级但很有趣。
表格并不总是“存放行的地方”
在今天之前,我对表格的认知很简单:
- 创建表 →
- 插入行 →
- 查询表。
Oracle 向我展示了表格的物理存储方式非常重要,并且它提供了多种选择。
堆表(Heap Tables)
默认且最常见的类型。行会被放到任何有空闲空间的地方,没有保证的顺序。
create table toys_heap (
toy_name varchar2(100)
) organization heap;
索引组织表(Index‑Organized Tables,IOT)
行会按照主键物理排序,提供快速查找,无需在表和单独的索引之间跳转。
create table toys_iot (
toy_id integer primary key,
toy_name varchar2(100)
) organization index;
当你总是通过主键进行查询时非常有用。
外部表(External Tables)
把文件(例如 CSV)当作表来使用;可以直接对其进行查询,而无需导入数据。
create table toys_ext (
toy_name varchar2(100)
) organization external (
default directory tmp
location ('toys.csv')
);
- 文件位于数据库服务器上。
- 你是直接读取它,而不是把它加载进来。
临时表
全局临时表(Global Temporary Tables)
表的定义是永久的,但行是会话专属的。
create global temporary table toys_gtt (
toy_name varchar2(100)
);
所有会话都能看到这个表,但每个会话只能看到自己的行。会话结束后数据会消失。
私有临时表(Private Temporary Tables)
表本身以及其中的行都只对创建它的会话可见,并且不存储在数据字典中。
create private temporary table ora$ptt_toys (
toy_name varchar2(100)
);
分区表(Partitioned Tables)
根据某个键将大表拆分为更小的块,以提升大规模查询的性能。
支持的分区方式:
- 范围(例如日期)
- 列表(特定值)
- 哈希(均匀分布)
示例(哈希分区):
create table books_hash (
toy_name varchar2(100)
) partition by hash (toy_name) partitions 4;
查询时只会扫描相关的分区。
表簇(Table Clusters)
当不同表共享同一个键时,将它们的行物理上放在一起存储。
create cluster toy_cluster (
toy_name varchar2(100)
);
create table toys_cluster_tab (
toy_name varchar2(100)
) cluster toy_cluster (toy_name);
今天学习的收获
这次的重点不在于编写复杂查询,而是理解核心的存储概念。数据库非常关注数据的存储方式;表的设计是关键决策,而不仅仅是语法问题。有些想法看起来很熟悉,有些则让人望而生畏,但全部都很有价值。
接下来
我会继续学习 Oracle 开发者模块,将每个概念与其用途联系起来,最终再把它们与 PostgreSQL 以及更广泛的数据工程主题相结合。我仍然是个新人,但像今天这样的经历让数据库的世界变得更大、更有趣。如果你也在学习数据库,有时觉得“信息量太大”,请放心——一次只学一个模块,你并不孤单。