日期上的 SQL 分区,它如何为未来的记录工作?

use*_*177 5 mysql sql-server partitioning

我正在设置一个新系统,我想对数据进行分区以提高速度。基本上我想做的是拥有一个包含所有最新信息(例如过去 3 个月)的数据库。然后有一些分区表来存储比这更旧的数据。没有选择 mysql 或 sql server express 因为不确定哪一个具有所需的功能。

我已经阅读了一些关于范围分区如何工作的示例,如下所示:

CREATE TABLE SAMPLE_ORDERS 
(
    ORDER_NUMBER NUMBER,
    ORDER_DATE DATE,
    CUST_NUM NUMBER,
    TOTAL_PRICE NUMBER,
    TOTAL_TAX NUMBER,
    TOTAL_SHIPPING NUMBER
)
PARTITION BY RANGE(ORDER_DATE)
(
    PARTITION SO99Q1 VALUES LESS THAN TO_DATE(‘01-APR-2010’, ‘DD-MON-YYYY’),
    PARTITION SO99Q2 VALUES LESS THAN TO_DATE(‘01-JUL-2010’, ‘DD-MON-YYYY’),
    PARTITION SO99Q3 VALUES LESS THAN TO_DATE(‘01-OCT-2010’, ‘DD-MON-YYYY’),
    PARTITION SO99Q4 VALUES LESS THAN TO_DATE(‘01-JAN-2011’, ‘DD-MON-YYYY’),
    PARTITION SO00Q1 VALUES LESS THAN TO_DATE(‘01-APR-2011’, ‘DD-MON-YYYY’),
    PARTITION SO00Q2 VALUES LESS THAN TO_DATE(‘01-JUL-2011’, ‘DD-MON-YYYY’),
    PARTITION SO00Q3 VALUES LESS THAN TO_DATE(‘01-OCT-2011’, ‘DD-MON-YYYY’),
    PARTITION SO00Q4 VALUES LESS THAN TO_DATE(‘01-JAN-2012’, ‘DD-MON-YYYY’)
);
Run Code Online (Sandbox Code Playgroud)

http://www.devarticles.com/c/a/Oracle/Partitioning-in-Oracle/1/#YCTAmfR0hkvo1at0.99阅读更多

但这似乎更适合对旧数据进行分区。当它到达更新的数据时会发生什么?它会将新数据放入单个分区吗?

我宁愿在新表中有少量数据并转储所有旧信息。

我是否只需要创建多个分区到 2020 年,并在项目运行时继续手动添加它们?

有没有另一种方法可以做到这一点?

我知道我可以通过将所有数据复制到另一个表中并每晚清理旧数据来实现我所需要的,但是我以前遇到过这个问题并且想知道分区是否会做得更好?

Rem*_*anu 6

在 SQL Server 中,您必须拆分表头的分区:

ALTER PARTITION SCHEME partition_scheme_name NEXT USED [ filegroup_name ];
ALTER PARTITION FUNCTION partition_function_name() SPLIT RANGE ( '20120401');
Run Code Online (Sandbox Code Playgroud)

这将为新传入的数据添加一个新分区。您应该始终在表的头部创建一个空分区,以使拆分成为仅针对元数据的即时操作。如果您用行填充了最后一个分区,则拆分必须移动数据。


Cri*_*rta 2

在 MySQL 中,您必须在 CREATE TABLE 语句中添加新分区

\n\n
PARTITION <partitionname> VALUES LESS THAN MAXVALUE\n
Run Code Online (Sandbox Code Playgroud)\n\n

作为替代方案,您可以更改表添加新的 MAXVALUE 分区

\n\n
ALTER TABLE SAMPLE_ORDERS ADD PARTITION (\n  PARTITION <partitionname> VALUES LESS THAN MAXVALUE\n);\n
Run Code Online (Sandbox Code Playgroud)\n\n

来自官方文档

\n\n
\n

MAXVALUE 表示始终大于最大可能整数值的整数值(在数学语言中,它充当最小上限)。现在,ORDER_DATE 列值大于或等于 16(定义的最高值)的任何行都存储在分区中

\n
\n\n

将来,您可以使用 ALTER TABLE 来管理和重新组织大于“最后一个工作分区”的新数据(小于 TO_DATE(\xe2\x80\x9801-JAN-2012\xe2\x80\x99, \xe2\x80\x98DD -MON-YYYY\xe2\x80\x99)\n)" 插入到 MAXVALUE 分区中。

\n\n
ALTER TABLE SAMPLE_ORDERS REORGANIZE PARTITION <partitionname> INTO (\n    PARTITION SXXXQ1 VALUES LESS THAN TO_DATE(\xe2\x80\x9801-APR-2012\xe2\x80\x99, \xe2\x80\x98DD-MON-YYYY\xe2\x80\x99),\n    PARTITION <partitionname> VALUES LESS THAN MAXVALUE \n);\n
Run Code Online (Sandbox Code Playgroud)\n\n

您可以在以下位置找到更多详细信息:

\n\n

http://dev.mysql.com/doc/refman/5.1/en/partitioning-range.html

\n\n

http://dev.mysql.com/doc/refman/5.1/en/partitioning-management-range-list.html

\n\n

希望这有帮助

\n\n

克里斯蒂安

\n