标签: database-partitioning

MAX()和MAX()OVER PARTITION BY在Teradata Query中产生错误3504

我正在尝试生成一个结果表,其中包含每个课程代码的最后完成课程日期,以及每位员工最后完成的课程代码.以下是我的查询:

SELECT employee_number,
       MAX(course_completion_date) 
           OVER (PARTITION BY course_code) AS max_course_date,
       MAX(course_completion_date) AS max_date
FROM employee_course_completion
WHERE course_code IN ('M910303', 'M91301R', 'M91301P')
GROUP BY employee_number
Run Code Online (Sandbox Code Playgroud)

此查询产生以下错误:

3504 : Selected non-aggregate values must be part of the associated group
Run Code Online (Sandbox Code Playgroud)

如果我删除MAX()OVER(PARTITION BY ...)行,查询执行得很好,所以我已经将问题隔离到该行,但在搜索这些论坛和互联网后,我看不到我的意思我做错了.有人可以帮忙吗?

sql aggregate-functions teradata database-partitioning

8
推荐指数
2
解决办法
10万
查看次数

如何基于char列对MySQL表进行分区?

是否可以基于char列进行分区?

在查看MySQL 5.1文档后,似乎只能使用整数类型.

它是否正确?或者我可以使用一些函数将char转换为整数?

有问题的char字段包含唯一标识符.

mysql database-partitioning

8
推荐指数
1
解决办法
3万
查看次数

分区表真正有益的大小(行数)是多少?

IE如果我们有一个400万行的表.

这得到了一个STATUS可以承担下列值字段:TO_WORK,BLOCKEDWORKED_CORRECTLY.

你会在一个只会改变一次的字段上进行分区(大部分时间从to_work变为working_correctly)吗?你会创建多少个分区?

sql oracle partitioning database-partitioning

8
推荐指数
2
解决办法
2754
查看次数

SQL Server分区 - 唯一索引错误

我有一个由TRANSACTION_DATE_TIME分区的表.

表有一列:ID.

我想在分区方案上为ID创建唯一索引:

CREATE UNIQUE NONCLUSTERED INDEX [IX_ID_ON_PS_DATETIME] ON [CRD].[TRANSACTION] 
(
    [ID] ASC
) ON [PS_DATETIME_WEEKLY]([TRANSACTION_DATE_TIME])
Run Code Online (Sandbox Code Playgroud)

但SQL说"唯一索引的分区列必须是索引键的子集".

我在这个索引中真的不需要TRANSACTION_DATE_TIME列.

如何在不使用TRANSACTION_DATE_TIME列的情况下创建索引?

sql sql-server indexing database-partitioning

8
推荐指数
1
解决办法
5268
查看次数

使用具有重叠约束的postgres表分区是否安全?

Postgres文档说表格分区中的条件不应重叠

确保约束保证不同分区中允许的键值之间没有重叠.

但我不明白为什么,因为必须插入数据的确切分区仍由触发器决定,这可能意识到重叠约束

我有以下情况,一个包含大量文本信息和update_date时间戳的表,这个表按季度分区,所有新的或更新的行都进入最新的分区,问题是gin trigram索引太慢了,所以我想避免在当天构建trigram索引

目前主表上的触发器负责动态创建分区,我打算为当天添加新分区,这将与季度分区重叠,我想禁用当前分区的trigram索引(合并数据)进入季度分区将是另一项维护任务)

我已经尝试使用重叠的update_date约束手动创建分区表,并且postgres没有抱怨,我甚至做了搜索,并且两个表都在计划中使用,所以它似乎工作得很好,但文档说约束不能重叠,这是为什么?

如果我有适当的触发器和维护,创建具有重叠约束的分区是否安全?

UPD:

CREATE TABLE master (text_value text, update_date timestamp);

CREATE TABLE partition_year (
    CHECK ( update_date >= DATE '2015-01-01' AND update_date < DATE '2015-12-31' )
) INHERITS (master);

CREATE TABLE partition_month (
    CHECK ( update_date >= DATE '2015-07-01' AND update_date < DATE '2015-8-01' )
) INHERITS (master);

-- in production this would be handled by trigger
insert into partition_year(text_value, update_date) values ('year', '2015-01-02');
insert into partition_month(text_value, update_date) values ('month', '2015-07-02');

-- this scans …
Run Code Online (Sandbox Code Playgroud)

postgresql partitioning database-partitioning

8
推荐指数
1
解决办法
573
查看次数

如何创建修改分区 Postgres 表中记录的触发器?

我有一个带有触发器的表,每当记录更改时都会更新“修改的”时间戳。我用 BEFORE 触发器做到了:

CREATE OR REPLACE FUNCTION update_modified()
  RETURNS trigger AS
$$
BEGIN
  NEW.modified = now();
  RETURN NEW;
END;
$$
LANGUAGE plpgsql;

CREATE TRIGGER contact_update_modified
  BEFORE UPDATE
  ON contacts
  FOR EACH ROW
  EXECUTE PROCEDURE update_modified();
Run Code Online (Sandbox Code Playgroud)

然后我对表进行分区,当我尝试添加触发器时,我得到:

ERROR:  "contacts" is a partitioned table
DETAIL:  Partitioned tables cannot have BEFORE / FOR EACH ROW triggers.
SQL state: 42809
Run Code Online (Sandbox Code Playgroud)

如果我将其更改为 AFTER 触发器,它不会更新修改的字段(这是有道理的)。

如果我手动将触发器添加到每个子分区表,它似乎确实有效。我可以做到这一点,但并不理想。有没有更好的办法?

postgresql triggers partitioning database-partitioning database-trigger

8
推荐指数
1
解决办法
5949
查看次数

Postgres 长时间运行的事务在父分区表上持有锁

TL;DR:我们有长时间运行的导入,它们似乎在父分区表上持有锁,即使没有任何东西直接引用父表。

背景

在我们的系统中,我们有inventoriesinventory_items。库存往往有 200k 左右的物品,对于我们的访问模式来说,使用本机分区对inventory_items表进行分区是有意义的inventory_id(我们使用的是 Postgres 12)。换句话说,每个库存都有自己的 inventory_items 分区表。这是通过以下 DDL 完成的:

CREATE TABLE public.inventory_items (
  inventory_id integer NOT NULL,
  /* ... */
)
PARTITION BY LIST (inventory_id);
Run Code Online (Sandbox Code Playgroud)

在我们的应用程序代码中,当通过 Web 仪表板创建库存时,我们会通过以下方式自动创建分区子 inventory_items 表:

CREATE TABLE IF NOT EXISTS inventory_items_#{inventory_id}
  PARTITION OF inventory_items
  FOR VALUES IN (#{inventory_id});
Run Code Online (Sandbox Code Playgroud)

长期进口工作阻碍创造新库存

这些库存通常每天通过 CSV 或其他方式完全重新加载/重新导入一次,并且这些导入任务有时可能需要一段时间。

我们注意到,当这些长时间导入正在运行时,不可能创建新的清单,因为如上所述,创建清单意味着创建分区子表inventory_items,并且长时间运行的导入和创建分区子表之间存在一些锁争用。网络仪表板中的库存,这很糟糕:我们不能仅仅因为发生了完全不相关的导入就阻止用户创建库存。

导入运行时尝试创建清单时的事件/锁定序列

我在 psql 中使用以下查询来确定谁持有哪些锁:

select pid, relname, mode
from pg_locks l
join pg_class t on l.relation = t.oid
where t.relkind …
Run Code Online (Sandbox Code Playgroud)

database postgresql database-partitioning database-locking postgresql-12

8
推荐指数
1
解决办法
4300
查看次数

What does PARTITION BY 1 mean?

For a pair of cursors where the total number of rows in the resultset is required immediately after the first FETCH, ( after some trial-and-error ) I came up with the query below

SELECT
 col_a,
 col_b,
 col_c,
 COUNT(*) OVER( PARTITION BY 1 ) AS rows_in_result
FROM 
 myTable JOIN theirTable ON
 myTable.col_a = theirTable.col_z
GROUP BY
 col_a, col_b, col_c
ORDER BY 
 col_b
Run Code Online (Sandbox Code Playgroud)

Now when the output of the query is X rows, rows_in_result reflects this accurately.

  • What does PARTITION BY 1 …

oracle analytics count database-partitioning

7
推荐指数
2
解决办法
8811
查看次数

有没有办法让Hibernate使用文字值而不是绑定变量?

在Oracle中,我有一个分区表.分区具有不同的大小并且具有不同的数据分布.

我想有hibernate问题SQL语句,其中包括分区键列的文字值而不是绑定变量.当然,它应该对任何其他值使用绑定变量.

使用分区键的文字将允许Oracle提出特定于已知分区和收集的统计信息的计划.对于具有偏斜数据的直方图的列,这可能也很有用.

最好在实体中指定它,否则我们将需要在每个查询中执行此操作.有没有办法在休眠中执行此操作?

我们使用Oracle 10g Dialect进行hibernate 3.6.1.

如果没有办法在Hibernate中本地执行此操作,我可以创建用户类型或方言或其他东西来实现这一目标吗?

oracle hibernate database-partitioning

7
推荐指数
1
解决办法
2644
查看次数

Oracle:如何删除特定分区的子分区

我正在使用带有区间分区的oracle 11表,并像这样列出子分区(简化):

CREATE TABLE LOG
(
  ID NUMBER(15, 0) NOT NULL PRIMARY KEY
, MSG_TIME DATE NOT NULL
, MSG_NR VARCHAR2(16 BYTE)
) PARTITION BY RANGE (MSG_TIME) INTERVAL (NUMTOYMINTERVAL (1,'MONTH'))
  SUBPARTITION BY LIST (MSG_NR)
    SUBPARTITION TEMPLATE (
     SUBPARTITION login VALUES ('FOO')
   , SUBPARTITION others VALUES (DEFAULT)
   )
   (PARTITION oldvalues VALUES LESS THAN (TO_DATE('01-01-2010','DD-MM-YYYY')));
Run Code Online (Sandbox Code Playgroud)

如何在不知道子系统的(系统生成的)名称的情况下删除特定月份的特定子分区?有一个语法"alter table ... drop subpartition for(subpartition_key_value,...)"但我没有看到指定我删除子分区的月份的方法.该分区管理指南没有给出任何的例子,无论是.8}

oracle partitioning oracle11g database-partitioning

7
推荐指数
1
解决办法
3万
查看次数