可以有人告诉我为什么会出现以下行为(Oracle 10.2):
SQL> create table part_test (
i int primary key,
d date
)
partition by range (d) (partition part_test_1 values less than (to_date(' 2 3 4 5 1980-01-01', 'yyyy-mm-dd')));
create public synonym part_test for part_test;
select object_name, object_type, status from all_objects where object_name = 'PART_TEST';
alter table part_test add partition part_test_2 values less than (to_date('1981-01-01', 'yyyy-mm-dd'));
select object_name, object_type, status from all_objects where object_name = 'PART_TEST';
alter table part_test drop partition part_test_1;
select object_name, object_type, status from all_objects where …Run Code Online (Sandbox Code Playgroud) 我想创建 sqlite 分区结构,我创建了 3 个数据库,我将这 3 个数据库附加到另一个数据库,该数据库将是父数据库
ATTACH DATABASE '1.db' as 1
ATTACH DATABASE '2.db' as 2
ATTACH DATABASE '3.db' as 3
Run Code Online (Sandbox Code Playgroud)
在我.quit的父数据库数据库附件分离后,即使我退出数据库,我如何保持它们的连接?谢谢。
将另一个分区添加到已分区表的最佳方法是什么?
原始CREATE TABLE语句如下所示:
CREATE TABLE `command_log` (
`id` bigint(20) NOT NULL,
`insert_time` datetime NOT NULL,
`start_time` timestamp NULL DEFAULT '0000-00-00 00:00:00',
`end_time` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
`command` varchar(255) NOT NULL,
`parameters` varchar(255) DEFAULT NULL,
`result` mediumblob,
`status` int(11) NOT NULL,
PRIMARY KEY (`id`,`insert_time`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
/*!50100 PARTITION BY RANGE (to_days(insert_time))
(PARTITION p001 VALUES LESS THAN (736237) ENGINE = InnoDB,
PARTITION p002 VALUES LESS THAN (736268) ENGINE = InnoDB,
PARTITION p003 VALUES LESS THAN (736298) …Run Code Online (Sandbox Code Playgroud) 我发现this tutorial关于Oracle中的不同索引。我想知道,是否有人可以解释这三个 create index-statements 之间的区别:
CREATE INDEX invoices_idx ON invoices (invoice_date);
Run Code Online (Sandbox Code Playgroud)
和
CREATE INDEX invoices_idx ON invoices (invoice_date) LOCAL;
Run Code Online (Sandbox Code Playgroud)
和
CREATE INDEX invoices_idx ON invoices (invoice_date) LOCAL
(PARTITION invoices_q1 TABLESPACE users,
PARTITION invoices_q2 TABLESPACE users,
PARTITION invoices_q3 TABLESPACE users,
PARTITION invoices_q4 TABLESPACE users);
Run Code Online (Sandbox Code Playgroud)
我会假设,所有这些都在每个分区上创建相同类型的本地索引。
//编辑:另一个问题。让我们假设我有下表
CREATE TABLE invoices
(invoice_no NUMBER NOT NULL,
invoice_date DATE NOT NULL,
comments VARCHAR2(500))
PARTITION BY RANGE (invoice_date)
(PARTITION invoices_q1 VALUES LESS THAN (TO_DATE('01/04/2001', 'DD/MM/YYYY')) TABLESPACE users,
PARTITION invoices_q2 VALUES LESS THAN (TO_DATE('01/07/2001', 'DD/MM/YYYY')) TABLESPACE …Run Code Online (Sandbox Code Playgroud) 我有一个每月分区的表(时间戳列)。
查询数据时,explain 显示当我使用日期函数构建日期时,所有分区都被查询,而当我使用硬编码日期时,仅扫描目标分区。
所以当这样查询时:
SELECT * FROM vw_comments
WHERE created >= '2019-4-1'
AND created <= '2019-4-30'
limit 100;
Run Code Online (Sandbox Code Playgroud)
它只扫描 1 个分区(1 个月,很好!)但是为了让它更动态,我传递了这样的东西(简化)
SELECT * FROM vw_comments
WHERE created >= (date_trunc('month', now()))::timestamp
AND created <= (date_trunc('month', now() + interval '1 month') - interval '1 day') ::timestamp
limit 100;
Run Code Online (Sandbox Code Playgroud)
上述日期方法与第一个查询的日期完全相同,但 EXPLAIN 显示所有分区都被扫描。
如何使它工作?
编辑:添加表定义并解释
应@a_horse_with_no_name 的要求,我添加了实际表并进行了解释。这样做后,我想出了更多的东西:进行联接时,动态日期不起作用。因此,在下面的查询中省略“用户”表可以使动态日期起作用。
CREATE TABLE public.comments
(
comment_id integer NOT NULL GENERATED BY DEFAULT AS IDENTITY ( INCREMENT 1 START 1 MINVALUE 1 MAXVALUE 2147483647 CACHE 1 ),
comment_id …Run Code Online (Sandbox Code Playgroud) 我正在尝试更改表以在 postgres 11 中使用分区 LIST。我已经尝试了几个小时,但我不断收到错误消息。
我有一个巨大的表,客户,(client_id,customer_id,value)。
我已经创建了一个新的空表,客户端,通过重命名旧表clients_old,然后与创建新表:CREATE TABLE clients( like clients_old including all)。
从这里开始,我在尝试添加 LIST 分区时卡住了。
我试图:
ALTER TABLE Clients attach PARTITION BY LIST (client_id) --> fail;
ALTER TABLE Clients attach PARTITION LIST (client_id) --> fail;
ALTER TABLE Clients ADD PARTITION LIST (client_id) --> fail;
Run Code Online (Sandbox Code Playgroud)
我应该使用什么语法来更改表以使用分区?
我有一个表,其分区如下并具有数百万行数据。表大小为 120 GB。
PARTITION BY RANGE (Read_time) INTERVAL(NUMTOYMINTERVAL(1, 'MONTH'))
Run Code Online (Sandbox Code Playgroud)
现在我想用现有数据和未来数据更改为这种分区策略。表每天按作业插入。
PARTITION BY RANGE (Read_time) INTERVAL(NUMTODSINTERVAL(1, 'DAY'))
Run Code Online (Sandbox Code Playgroud)
我有 12 个月的分区(2018 年 10 月到 2019 年 11 月)。我希望将分区转换为日间分区。
例如:对于 Jul'19 分区,应将其拆分为 01 Jul'19, 02 Jul'19 ....... 31 Jul'19。
数据也应该移动到新分区
我尝试过分割分区。新分区已按天创建,但行未移动到新分区。
实际上我是 PostgreSQL 的新手。我想更改现有分区以增加范围值。例如我有以下分区
PQR_271 对于从 ('260000000') 到 ('270000000') 的值
在这里,我想将范围扩展到最大值,但我无法这样做。
我尝试了下面的解决方案
CREATE TABLE public.PQR_272 PARTITION OF public.stats_to_institution FOR VALUES FROM ('270000000') TO ('280000000');
ALTER TABLE public.PQR_272 OWNER to usr_replica;
Run Code Online (Sandbox Code Playgroud)
这里我可以增加整数值,但不能增加到最大值。有没有办法将范围设置为最大值?
PostgreSQL 版本11
我刚刚使用展开和分区表构建了我的第一个正确的 q/kdb+ 数据库。一切都很顺利,但我刚刚注意到我的符号s列文件大小异常大。以下是我从操作系统和 q 内部可以看到的内容:
# ls -latr 2017.10.30/ngbarx
total 532
-rw-r--r-- 1 root root 24992 Apr 17 20:53 vunadj
-rw-r--r-- 1 root root 24992 Apr 17 20:53 v
-rw-r--r-- 1 root root 300664 Apr 17 20:53 s
...
q)meta ngbarx
c | t f a
------| -----
date | d
s | s p
v | e
vunadj| e
...
q)get `:2017.10.30/ngbarx/s
`p#`sym$`A`AA`AACG`AADI`AADR`AAIC`AAIC-B`AAL`AAM-A`AAMC`AAME`AAOI`AAON`AAP`AA..
q)-22!get `:2017.10.30/ngbarx/v
24990
q)-22!get `:2017.10.30/ngbarx/s
28678
q)all (get `:2017.10.30/ngbarx/s) in sym
1b
q)count sym …Run Code Online (Sandbox Code Playgroud) 我有一张包含大量数据的表格.我需要每天自动进行分区.我需要分区的名称是sysdate的日期.我该怎么做呢?