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

发布: (2026年1月17日 GMT+8 07:12)
5 min read
原文: Dev.to

Source: Dev.to

《学习数据库超越SQL:我的Oracle表格第一天》封面图片

嗯,今天的进展并不像我预期的那样。我本打算继续做平时的 PostgreSQL + SQL 练习,却意外地开始了一个面向开发者的免费 Oracle 课程。我只完成了第一模块,但它让我接触到了之前从未真正思考过的概念:

表格不仅仅是表格。 同一个词,却有截然不同的行为。

本文记录了我在 Oracle 中学习到的表类型、哪些内容立刻能理解、哪些感觉较为高级但很有趣。

表格并不总是“存放行的地方”

在今天之前,我对表格的认知很简单:

  1. 创建表 →
  2. 插入行 →
  3. 查询表。

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 以及更广泛的数据工程主题相结合。我仍然是个新人,但像今天这样的经历让数据库的世界变得更大、更有趣。如果你也在学习数据库,有时觉得“信息量太大”,请放心——一次只学一个模块,你并不孤单。

Back to Blog

相关文章

阅读更多 »