Oracle SQL:是否可以基于选择和按列排序创建表?



我想通过从另一个表中选择一些数据来创建表,同时根据一列(或多列(对它们进行排序。我提供以下示例,知道它是错误的。通常是否可以实现这样的表形成,如果是,是否有任何类似的SQL语句可以实现这一点?

CREATE TABLE NEW_TABLE_NAME AS (
SELECT
*
FROM A_RANDOM_TABLE
)
ORDER BY COLUMN_1,COLUMN_2;

应始终在查询时对数据进行排序。不能保证 Oracle 会按照您插入数据的顺序实际存储数据。即使你会做这样的事情:

CREATE TABLE NEW_TABLE_NAME AS
SELECT *
FROM A_RANDOM_TABLE
ORDER BY COLUMN_1,COLUMN_2
;

在ASSM表空间中(并且没有"追加"(,Oracle将在表中的任何位置查找空闲插槽。

可以使用属性聚类创建和维护物理表顺序。

CREATE TABLE NEW_TABLE_NAME
CLUSTERING BY LINEAR ORDER(COLUMN_1, COLUMN_2) AS
SELECT *
FROM A_RANDOM_TABLE
ORDER BY COLUMN_1, COLUMN_2;

虽然这从字面上回答了您的问题,但可能不是您正在寻找的答案。 属性聚类分析不是提供逻辑排序。 正如其他人所指出的,保证排序的唯一方法是在查询中使用ORDER BY子句。 我们不希望我们的表与数据的物理格式紧密绑定 - 这导致了问题,这些问题实际上是创建关系模型的动机。

属性聚类有助于提供物理排序,以在几种情况下提高性能 - 索引聚类因子、Exadata 中的物化区域映射等。 属性聚类有助于在MOVE或直接路径INSERT期间保持顺序。 但它不会维护所有 DML 语句的顺序,当然也不能保证从表中读取结果时的顺序。

最新更新