由于闰秒,这个夜晚会更长:https : //en.wikipedia.org/wiki/Leap_second
在我的情况下,我的影响很小,我什至不知道我是否会收到一些奇怪的数据,比如20150630 23:59:60。但是我有来自 windows、linux 和其他系统的监控系统。在最坏的情况下,我将丢失一秒钟的数据。
我在 postgresql 和 SQL Server 中测试了这个奇怪数据的转换。这些是我的结果:
Postgresql 中的这个选择:
SELECT '20150630 23:59:60.001 UTC'::timestamptz;
Run Code Online (Sandbox Code Playgroud)
返回:2015-07-01 02:00:00.001+02
我有相同的结果:
SELECT '20150701 00:00:00.001 UTC'::timestamptz;
Run Code Online (Sandbox Code Playgroud)
我认为这在关键系统中可能很危险,因为如果这些数据由客户端处理,数据可能会以错误的顺序存储,从而为合法数据增加一秒钟。
在 sql server 中,如果我尝试:
SELECT CAST('20150630 23:59:60' AS datetime)
Run Code Online (Sandbox Code Playgroud)
它给了我一个转换错误。所以在 sql server 中是不可能存储这些数据的。
一个给我一个错误,另一个只是添加一秒钟。我不喜欢两者,因为不可能在闰秒中存储事件。
两者都是最新的系统。SQL Server 在 windows 2012 机器上是 2014。Postgresql 在 redhat 机器上是 9.3(不是那么更新,我认为是 6.2)。
如果有人要我存储这些数据怎么办?我读了这个和一些解决方法:https : //stackoverflow.com/questions/19751115/leap-second-handling-in-database
有没有人遇到过这个问题?我的意思是,就我而言,这只是一个理论问题,不是真正的问题(所以如果你不喜欢理论问题,请不要浪费时间)
编辑: 在 Oracle 11.2 中测试,返回错误:
ORA-01852: 秒必须在 0 到 59 之间 01852. 00000 - “秒必须在 0 到 …
我想知道是否有办法将 csv 文件复制到临时表中,其中 csv 文件中的列数未知。我使用的数据库软件是 PgAdmin III。我发现如果我知道列数,那么我可以创建一个包含该列数的临时表,然后像这样复制 csv 文件:
CREATE TEMPORARY TABLE temp
(
col1 VARCHAR(80),
col2 VARCHAR(80),
....
coln VARCHAR(80)
);
COPY temp FROM 'C:/Users/postgres/Boost.txt' CSV HEADER DELIMITER E' '
Run Code Online (Sandbox Code Playgroud)
但是,如果我尝试简单地将 csv 文件复制到临时表中没有列的临时表,Postgresql(8.4 版)会抱怨我正在使用一个列数少于 csv 文件的表。我一直在研究,但似乎在 Postgresql 文档中找不到任何关于此的内容。有谁知道在 Postgresql 中是否可以将 csv 文件复制到具有在运行时决定的任意数量的列的临时表中?一旦临时表加载了 csv 文件,我计划在它被销毁之前用临时表与其他表进行一些比较。csv 文件中的第一行也包含标题。
我是一个数据库/postgres 初学者,所以请耐心等待。
如果我有一张桌子,就像这样。
CREATE TABLE testy (
id INTEGER REFERENCES other_table,
name varchar(128) PRIMARY KEY,
json JSONB NOT NULL
);
Run Code Online (Sandbox Code Playgroud)
我在寻找插入或更新,将设置列之前创建一个触发器id,并name与在相同名称字段的值json。
因此,例如,如果testy包含以下内容UPDATE testy SET json = '{"id":2,"name":"jim"}' WHERE id = 1并被调用。
id | name | json
---+------+-----
1 | "jim"| {"id":1,"name":"jim"}
Run Code Online (Sandbox Code Playgroud)
想要的结果是
id | name | json
---+------+-----
2 | "jim"| {"id":2,"name":"jim"}
Run Code Online (Sandbox Code Playgroud)
我希望使其相当通用,因此不需要对列名进行硬编码。如果相应的 json 字段不存在,则将该列设置为 NULL 即可。到目前为止我有
CREATE TABLE testy_index (
id INTEGER PRIMARY KEY
);
INSERT INTO testy_index VALUES …Run Code Online (Sandbox Code Playgroud) 我有一张名为accounts. 我有兴趣检索状态超过 10 天未更新的那些帐户。我想过这个查询,它似乎有效,但我不确定这是最好的方法:
SELECT * from accounts
WHERE status = 'PENDING_PAYMENT'
AND (date_part('day', (now() - status_updated_at)) > 10);
Run Code Online (Sandbox Code Playgroud)
我不喜欢这个now()部分的一件事是。如果now()不是为每个记录计算而是在开始时计算单个时间戳值,那将是理想的。此外,我希望这个例子返回1:
假设对于一条记录,该status_updated_at列具有以下值:2015-10-05 23:00:00。并now()返回2015-10-06 01:00:00。尽管只有几个小时的差异,但我希望结果是1.
MySQL 的最新版本(使用 InnoDB)支持许多没有独占锁定表的更改表查询。
PostgreSQL 是否支持任何级别?也就是说,我可以在同时读取/写入行的同时从表中添加/删除列吗(即使性能下降)?
使用 Postgres 9.4,我有一个page_views包含一page列的表。我想选择所有不同的页面并在它们之前进行计数并按降序对它们进行排序。我还希望在过去 24 小时内最少计数 20。所以它看起来像这样:
120 / home
56 / about
24 / locations
Run Code Online (Sandbox Code Playgroud)
我刚在想:
select count(*),page from page_views group by page where count(*) > 20;
Run Code Online (Sandbox Code Playgroud)
但这不起作用。这该怎么做?
我有一张包含 100 万条记录的表格。每次针对每种类型的事件(有很多)发生事件时,每天都会创建和更新新记录。我经常需要在许多记录中找到总和,并且执行这些查询的时间逐渐变慢,即使在某些地方有多个索引。由于现在存储了几年的数据,我正在考虑将超过 6 个月的记录迁移到单独的“存档”表,并为每个事件类型创建新记录,其中包括每月聚合(即行的总和)在 2014 年 1 月存储的 31 条记录中,将存储在 1 条记录中)。这有望提高搜索速度,但有更好的策略吗?这种归档方式常见吗?
postgresql optimization compression archive query-performance
我有两张桌子,products并且subscriptions:
CREATE TABLE products (
id bigint NOT NULL,
title character varying(75),
description text,
manufacturer_id bigint,
created_at timestamp without time zone,
updated_at timestamp without time zone,
mpn text,
visible boolean DEFAULT false NOT NULL
);
CREATE TABLE subscriptions (
id bigint NOT NULL,
product_id bigint NOT NULL,
user_id bigint NOT NULL,
created_at timestamp without time zone,
updated_at timestamp without time zone
);
Run Code Online (Sandbox Code Playgroud)
在我的应用程序中,我通常需要知道某个产品的订阅者数量,而在应用程序中所有正确位置使用此逻辑是很棘手的。所以我想products用已经包含该信息的视图替换该表。所以我这样做了:
ALTER TABLE ONLY products
RENAME TO products_raw;
CREATE VIEW products AS …Run Code Online (Sandbox Code Playgroud) 我们在 CentOS 6.5 上运行 Postgres 9.4.4 并且有一个已经工作多年的 SELECT 查询,但在我们从 9.2 升级后停止工作并挂起(花了一段时间才注意到它,所以我不知道它是否是我们升级与否后立即)。
SELECT id || ':' || group_number AS uniq_id
FROM table_one
WHERE id || ':' || group_number NOT IN (
SELECT id || ':' || group_number
FROM table_two
)
AND id NOT IN (
SELECT id
FROM table_three
WHERE timestamp > NOW() - INTERVAL '30 days'
AND client_id > 0
);
Run Code Online (Sandbox Code Playgroud)
在所有表中id都是一个整数,但存储为character varying (15)(旧系统)。group_number存储为smallint.
table_two 的子查询返回大约 250 万条记录。的子查询table_three返回大约 2,500 条记录。如果单独运行,两者都在大约 …
我正在对 PostgreSQL 9.4rc1 上的新数据库设计进行一些性能测试,我看到一些使用窗口函数的查询速度很慢。这是我的表设置:
CREATE TABLE player_stat (
player_id VARCHAR(200) NOT NULL,
stat_id BIGINT NOT NULL,
value BIGINT NOT NULL DEFAULT 0,
last_updated TIMESTAMP WITH TIME ZONE NOT NULL,
last_active TIMESTAMP WITH TIME ZONE DEFAULT NULL,
CONSTRAINT player_stat_pk PRIMARY KEY (player_id, stat_id),
CONSTRAINT player_stat_fk1 FOREIGN KEY(stat_id) REFERENCES stat (id)
);
CREATE INDEX player_stat_stat_value_player_desc
ON player_stat (stat_id, value DESC, player_id ASC);
Run Code Online (Sandbox Code Playgroud)
我在这个表中插入了 3000 万行,分为 3 个统计数据:
INSERT INTO player_stat (player_id, stat_id, value, last_updated) SELECT x.id, 1, x.v, now() FROM (SELECT generate_series(1,10000000) …Run Code Online (Sandbox Code Playgroud) postgresql performance datatypes postgresql-9.4 postgresql-performance
postgresql ×10
performance ×2
aggregate ×1
archive ×1
compression ×1
concurrency ×1
csv ×1
datatypes ×1
datetime ×1
dbms ×1
ddl ×1
join ×1
json ×1
mysql ×1
optimization ×1
plpgsql ×1
sql-server ×1
timestamp ×1
trigger ×1
update ×1
view ×1