我必须删除超过364天的分区.分区命名为"log_20110101",因此必须使用比现在更早的分区
CONCAT('log_',TO_CHAR(SYSDATE -364,'YYYYMMDD'))
现在,如果我尝试这样的声明,我会得到错误
ALTER TABLE LOG
DROP PARTITION CONCAT('log_',TO_CHAR(SYSDATE -364,'YYYYMMDD'));
Run Code Online (Sandbox Code Playgroud)
-
Error report:
SQL Error: ORA-14048: a partition maintenance operation may not be combined with other operations
14048. 00000 - "a partition maintenance operation may not be combined with other operations"
*Cause: ALTER TABLE or ALTER INDEX statement attempted to combine
a partition maintenance operation (e.g. MOVE PARTITION) with some
other operation (e.g. ADD PARTITION or PCTFREE which is illegal
*Action: Ensure that a partition maintenance operation is the …Run Code Online (Sandbox Code Playgroud) 我试图回顾一下我的sql技巧,现在我试图在northwinddb上运行一个简单的查询,向我展示每年的顶级客户,但是一旦我使用TOP功能,只有1条记录显示无论我在哪分区依据,这是我的T-SQL代码
SELECT DISTINCT TOP 1 C.CompanyName
, YEAR(O.OrderDate) AS Year
, SUM(Quantity) OVER(PARTITION BY C.CompanyName, YEAR(O.OrderDate)) AS Total
FROM Customers C JOIN Orders O
ON C.CustomerID = O.CustomerID JOIN [Order Details] OD
ON O.OrderID = OD.OrderID
Run Code Online (Sandbox Code Playgroud) 假设我有一张表(让我们称之为BigTable),每天可以体验5,000,000个INSERTS(可能只有SELECT).插入的每行约为50kb.
这些每日INSERT分为5个客户端(该表有一个FK调用ClientID).无需跨多个客户端选择或加入数据.
随着这个表的增长,我担心数据库性能,所以我提出了两个解决方案.
解决方案1:
BigTable由ClientID实质上,这意味着他们自己的存储设备上的以下分区:
BigTable)BigTable(每天5,000,000行/ 5个客户x 30天= 30,000,000行)BigTable(30,000,000行)BigTable(30,000,000行)BigTable(30,000,000行)BigTable(30,000,000行)BigTable存档BigTable存档BigTable存档BigTable存档BigTable存档归档表中的行数将为(5,000,000)x(以天为单位的DB年龄) - (30,000,000).这仍然是一个巨大的表,但只会用于绘制奇怪的报告.
SQL Server将托管在14GB,8core Azure VM上.
解决方案2:
另一种选择是为每个客户端托管单独的数据库.这意味着每个人都拥有自己专用的SQL Server机器.归档数据仍将进行分区.
由于数据的物理分离,此选项不是最佳选项.必须管理多个数据库的更新可能非常有问题.为每个客户端建立单独的数据库连接也是开发人员的考虑因素.
任何人都可以就这些选择提出建议吗?
sql-server database-design azure database-performance database-partitioning
请原谅我的英语。我有 2 个表,都按日期间隔分区,但在不同的字段上。两个表中都有大量记录(每个分区约 100kk)。第一个表在快速磁盘表空间中保留它的最后 3 个(按日期)分区,其他分区在慢速磁盘表空间中。我还有一些处理数据的系统。它并行执行进程,每个进程通过select语句从第一个表中获取数据并将处理后的数据放入第二个表中。所以我只需要从“快速”(!)分区中选择第一个表中的数据以将其放入第二个表中。但是第二个表在其他(日期也是)字段上分区。当进程并行执行时,当不同的进程试图将数据放入第二个表中的同一分区时,我会陷入死锁。
好的解决方案是,每个进程只从“快速”分区(但一次全部)获取数据,仅获取第二个表中一个分区的数据。在这种情况下,每个进程都会将数据推送到一个分区中。但我不知道该怎么做。
如果我做
select t.field1, t.field2 from (select * from FIRST_TABLE partition("P1") union all
select * from FIRST_TABLE partition("P2") union all
select * from FIRST_TABLE partition("P3")) t
where t.field3='someVal' --Indexed field in FIRST_TABLE
Run Code Online (Sandbox Code Playgroud)
OracleDB 会在 FIRST_TABLE 中的分区上使用本地索引来解析 where 子句吗?这种方式将如何影响性能?
有什么想法可以解决我的问题吗?
PS 关于如何在一个选择语句中从多个分区中选择数据有很多问题,但我没有找到对我的情况有用的答案。
我正在寻找一种方法来估算分区表中的行数。count(*)由于数据的大小,我想避免使用。我尝试使用这个:
SELECT reltuples FROM pg_class WHERE relname = 'my_table_name';
Run Code Online (Sandbox Code Playgroud)
但它总是返回zero。我假设这是因为该表已分区。
有没有办法用来pg_class/pg_inherits获取所有分区中的行数?
任何想法都非常感谢!
我是图表分区的新手,但我认为我问的问题应该已经有了一个很好的答案.我只想将一个巨大的网络(数十亿个节点)划分为几个子图.所以当使用MPI时,每个子图由不同的处理器处理.我目前正在使用图表的邻接列表表示.什么算法可以做到这一点?谢谢!
parallel-processing graph mpi adjacency-list database-partitioning
我有一个表,我想在其上创建自动分区方案,首先按月对表进行分区,然后按 id 进行子分区。
我最近了解到mysql不支持自动分区,创建动态分区的唯一方法是通过存储过程和事件调度程序。
我的要求是新条目自动创建到新分区中,一年后自动删除旧记录。
我该怎么做呢?
请建议我一些关于如何实现存储过程和事件调度程序以支持动态分区并自动删除旧记录的方法。
这是架构:
CREATE TABLE `ORDER_HISTORY` (
`Id` bigint(20) NOT NULL,
`Invoice_Number` varchar(16) NOT NULL,
`User_Id` int(10) NOT NULL,
`Store_ID` mediumint(6) NOT NULL,
`Store_Entity_Id` mediumint(8) NOT NULL,
`Item_List` blob NOT NULL,
`Order_Time` datetime NOT NULL,
`Payment_Time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`Payment_Type` tinyint(2) NOT NULL,
`Payment_Retry_Attempts` tinyint(1) NOT NULL,
`Payment_TransactionID` varchar(32) NOT NULL,
`Sub_Total_Amount` decimal(10,2) NOT NULL DEFAULT '0.00',
`CGST_Tax_Amount` decimal(6,2) NOT NULL DEFAULT '0.00',
`SGST_Tax_Amount` decimal(6,2) NOT NULL DEFAULT '0.00',
`Other_Tax_Amount` decimal(6,2) NOT NULL …Run Code Online (Sandbox Code Playgroud) 我想知道为什么Oracle数据库要求在创建时至少定义了单个分区 PARTITION BY RANGE INTERVAL
这是对的:
CREATE TABLE FOO (
bar VARCHAR2(10),
creation_date timestamp(6) not null
)
PARTITION BY RANGE (creation_date) INTERVAL (NUMTODSINTERVAL(1,'DAY')) (
PARTITION part_01 values LESS THAN (TO_DATE('01-03-2018','DD-MM-YYYY'))
)
然而,这不是:
CREATE TABLE FOO (
bar VARCHAR2(10),
creation_date timestamp(6) not null
)
PARTITION BY RANGE (creation_date) INTERVAL (NUMTODSINTERVAL(1,'DAY'))
我希望在某些迁移情况下需要第一个分区,但在创建新表时则不需要.
有关该文档的Oracle文档:
CREATE TABLE语句的INTERVAL子句为表建立间隔分区.您必须使用PARTITION子句指定至少一个范围分区. https://docs.oracle.com/cd/E11882_01/server.112/e25523/part_admin001.htm#BAJHFFBE
我正在尝试使用下面的SQL语句对Oracle 12C R1中的现有表进行分区.
ALTER TABLE TABLE_NAME MODIFY
PARTITION BY RANGE (DATE_COLUMN_NAME)
INTERVAL (NUMTOYMINTERVAL(1,'MONTH'))
(
PARTITION part_01 VALUES LESS THAN (TO_DATE('01-SEP-2017', 'DD-MON-RRRR'))
) ONLINE;
Run Code Online (Sandbox Code Playgroud)
得到错误:
Error report -
SQL Error: ORA-14006: invalid partition name
14006. 00000 - "invalid partition name"
*Cause: a partition name of the form <identifier> is
expected but not present.
*Action: enter an appropriate partition name.
Run Code Online (Sandbox Code Playgroud)
分区需要在data datatype列的基础上进行,间隔为一个月.
表中日期时间列的最小值为01-SEP-2017.
我有一个表存储用户拥有的列表产品.该表看起来像这样.
create table my_keyspace.userproducts{
userid,
username,
productid,
productname,
producttype,
Primary Key(userid)
}
Run Code Online (Sandbox Code Playgroud)
所有用户都属于一个组,组中最多可以有1到100个用户
userid|groupid|groupname|
1 |g1 | grp1
2 |g2 | grp2
3 |g3 | grp3
Run Code Online (Sandbox Code Playgroud)
我们有新要求在一个组中显示所有用户的所有产品.
所以我更改了我的用户产品,以便我的分区键现在是groupid并将userid作为我的群集密钥,这样我就可以在一个查询中获得所有结果.
或者我保持我的表设计原样并通过从第二个表中选择组中的所有用户来激发多个选择查询,然后为每个用户触发一个选择查询,在我的代码中合并数据然后将其返回给用户
谢谢.
oracle ×3
sql ×3
partitioning ×2
sql-server ×2
azure ×1
cassandra ×1
database ×1
graph ×1
mpi ×1
mysql ×1
nosql ×1
oracle10g ×1
partition ×1
postgresql ×1
scylla ×1