我正在尝试生成一个结果表,其中包含每个课程代码的最后完成课程日期,以及每位员工最后完成的课程代码.以下是我的查询:
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 ...)行,查询执行得很好,所以我已经将问题隔离到该行,但在搜索这些论坛和互联网后,我看不到我的意思我做错了.有人可以帮忙吗?
是否可以基于char列进行分区?
在查看MySQL 5.1文档后,似乎只能使用整数类型.
它是否正确?或者我可以使用一些函数将char转换为整数?
有问题的char字段包含唯一标识符.
IE如果我们有一个400万行的表.
这得到了一个STATUS可以承担下列值字段:TO_WORK,BLOCKED或WORKED_CORRECTLY.
你会在一个只会改变一次的字段上进行分区(大部分时间从to_work变为working_correctly)吗?你会创建多少个分区?
我有一个由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列的情况下创建索引?
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) 我有一个带有触发器的表,每当记录更改时都会更新“修改的”时间戳。我用 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
TL;DR:我们有长时间运行的导入,它们似乎在父分区表上持有锁,即使没有任何东西直接引用父表。
在我们的系统中,我们有inventories和inventory_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
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.
在Oracle中,我有一个分区表.分区具有不同的大小并且具有不同的数据分布.
我想有hibernate问题SQL语句,其中包括分区键列的文字值而不是绑定变量.当然,它应该对任何其他值使用绑定变量.
使用分区键的文字将允许Oracle提出特定于已知分区和收集的统计信息的计划.对于具有偏斜数据的直方图的列,这可能也很有用.
最好在实体中指定它,否则我们将需要在每个查询中执行此操作.有没有办法在休眠中执行此操作?
我们使用Oracle 10g Dialect进行hibernate 3.6.1.
如果没有办法在Hibernate中本地执行此操作,我可以创建用户类型或方言或其他东西来实现这一目标吗?
我正在使用带有区间分区的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 ×4
partitioning ×4
postgresql ×3
sql ×3
analytics ×1
count ×1
database ×1
hibernate ×1
indexing ×1
mysql ×1
oracle11g ×1
sql-server ×1
teradata ×1
triggers ×1