- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我们收集数据已有一段时间了,并使用 timestamptz 字段。我犯了一个错误,我应该使用时间戳。我们所做的是从不同的位置收集大量数据,然后在将数据推送到 Postgres 之前自己计算 UTC。据我了解,无论哪种方式,timestamp 和 timestamptz 数据都是相同的 8 个字节,timestamptz 为您提供的是神奇(且不可见)的 AT TIME ZONE
转换。意思是,数据没有不同,只是 Postgres 处理不同数据的方式不同。在我们的例子中,这意味着我们通过将数据作为 UTC 推送到 Postgres 然后再将其拉出到本地而搞砸了。我们服务器的数据没有一个时区,这就是为什么我们在内部将其设置为 UTC,就像 Postgres 一样。为了使报告更简单,分析表通常有一个用于 local_dts 和 utc_dts 的冗余列。这样,我们就可以运行报告,比较不同时区设施的“周一早上 8 点到 11 点”。不同的设施有不同的时区,因此我们使用“本地”值,即他们的本地的此类查询。但是如果我们需要一个统一的时间线,那么我们就使用UTC。简单地说:同一个表中的行可能来自不同时区的来源。
好的,这就是背景,我现在有数千万行要更新。结构修改看起来很简单:
-- Change the data type, this is instantaneous.
ALTER TABLE assembly
ALTER COLUMN created_dts
SET DATA TYPE timestamp;
-- Reset the default, it's probably not necessary, but the ::timestamptz is misleading/confusing here otherwise.
ALTER TABLE assembly
ALTER COLUMN created_dts
SET DEFAULT '-infinity'::timestamp
我将不得不删除并重新创建一些 View ,但这只是运行一些备份脚本的问题。
我的问题是如何在不拖累服务器的情况下有效地进行更新?我正在想象一次按 5K 行等进行批处理。为了简单起见,假设我们所有的服务器都设置为美国/中部。当我们最初以 UTC 格式推送数据时,它又被 Postgres 转换了,所以现在数据因我们服务器时间和 UTC 之间的偏移而偏移。 (我认为。)如果是这样,最简单的更新可能如下所示:
SET TIME ZONE 'UTC'; -- Tell Postgres we're in UTC to line up the data with the UTC clock it's set to.
UPDATE analytic_scan
SET created_dts = created_dts at time zone 'US/Central' -- Tell Postgres to convert the value back to where we started.
这似乎可行(?),忽略了处理夏令时的明显遗漏。我可以添加一个 WHERE
子句来处理它,但这并没有改变我的问题。现在的问题是,我有这样的记录数:
analytic_productivity 728,708
analytic_scan 4,296,273
analytic_sterilizer_load 136,926
analytic_sterilizer_loadinv 327,700
record_changes_log 17,949,132
所以,不是很大,但也不是什么都没有。有没有一种方法可以在 SQL 中对数据进行明智的切片,以便
所有的表都有一个 UUID ID PK 字段,一对夫妇有一个生成的身份列,就像从这个报告表中截取的一样:
CREATE TABLE IF NOT EXISTS "data"."analytic_productivity" (
"id" uuid NOT NULL DEFAULT NULL,
"pg_con_id" integer GENERATED BY DEFAULT AS IDENTITY UNIQUE,
"data_file_id" uuid NOT NULL DEFAULT NULL,
"start_utc" timestamptz NOT NULL DEFAULT '-infinity',
"start_local" timestamptz NOT NULL DEFAULT '-infinity',
"end_utc" timestamptz NOT NULL DEFAULT '-infinity',
"end_local" timestamptz NOT NULL DEFAULT '-infinity')
我的一个想法是使用 UUID::text
的子字符串或散列来制作较小的批处理:
select * from analytic_sterilizer_loadinv
where left(id::text,1) = 'a'
这看起来很慢而且很糟糕。散列似乎好一点:
select abs(hashtext(id::text)) % 64,
count(*)
from analytic_sterilizer_loadinv
桶的大小不是那么均匀,但可能已经足够了,如果需要,我可以增加桶的数量。不幸的是,我不知道如何使用存储桶在 SQL 中循环运行我的代码。如果有人应该指出如何,我将不胜感激。而且,如果有一个简单的内置分块功能,我很想知道。
我还没有想清楚如何处理将被修改捕获的传入数据的明确问题,而不是锁定整个表。我也许能做到。
最佳答案
如果您负担得起,请不要分批执行 UPDATE
,而是一次性执行。主要缺点是这会使表膨胀,之后您应该在表上运行 VACUUM (FULL)
,这会导致停机。
我会编写客户端代码来批量更新,例如在 bash 中:
typeset -i part=0
# PostgreSQL client time zone
export PGTZ=UTC
while [ $part -lt 64 ]
do
psql <<-EOF
UPDATE data.analytic_productivity
SET created_dts = created_dts at time zone 'US/Central'
WHERE abs(hashtext(id::text)) % 64 = '$part'
EOF
psql -c "VACUUM data.analytic_productivity"
part=part+1
done
关于postgresql - 分块表以将 timestamptz 批量更新为 timestamp,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58211632/
标题基本上说明了一切。 我主要对更新案例感兴趣。假设我们正在尝试更新具有时间戳记字段的记录,并且我们希望将该字段设置为记录更新的时间戳记。有没有办法做到这一点? 最佳答案 经过一些实验,我找到了合适的
我正在学习一门类(class),其中我必须将日期转换为 unix 时间戳。 import pandas as pd df = pd.read_csv('file.csv') print type(df
我在两个不同的数据库中运行了相同的语句:我的本地数据库和 Oracle Live SQL . CREATE TABLE test( timestamp TIMESTAMP DEFAULT SY
我在两个不同的数据库中运行了相同的语句:我的本地数据库和 Oracle Live SQL . CREATE TABLE test( timestamp TIMESTAMP DEFAULT SY
bson.timestamp.Timestamp需要两个参数:time 和 inc。 time 显然是存储在 Timestamp 中的时间值。 什么是公司?它被描述为递增计数器,但它有什么用途呢?它应
2016-08-18 04:52:14 是我从数据库中获取的时间戳,用于跟踪我想从哪里加载更多记录,这些记录小于该时间 这是代码 foreach($explode as $stat){
我想将 erlang:timestamp() 的结果转换为正常的日期类型,公历类型。 普通日期类型表示“日-月-年,时:分:秒”。 ExampleTime = erlang:timeStamp(),
我想将 erlang:timestamp() 的结果转换为正常的日期类型,公历类型。 普通日期类型表示“日-月-年,时:分:秒”。 ExampleTime = erlang:timeStamp(),
我是 Java 新手。我正在使用两个 Timestamp 对象 dateFrom和dateTo 。我想检查是否dateFrom比 dateTo早 45 天。我用这个代码片段来比较这个 if(dateF
在将 panda 对象转换为时间戳时,我遇到了这个奇怪的问题。 Train['date'] 值类似于 01/05/2014,我正在尝试将其转换为 linuxtimestamp。 我的代码: Train
我正在努力让我的代码运行。时间戳似乎有问题。您对我如何更改代码有什么建议吗?我看到之前有人问过这个问题,但没能成功。 这是我在运行代码时遇到的错误:'Timestamp' object has no
我正在尝试运行以下查询: SELECT startDate FROM tests WHERE startDate BETWEEN TIMESTAMP '1555248497'
我正在使用 Athena 查询以 bigInt 格式存储的日期。我想将其转换为友好的时间戳。 我试过了: from_unixtime(timestamp DIV 1000) AS readab
最近进行了一些数据库更改,并且 hibernate 映射出现了一些困惑。 hibernate 映射: ...other fields 成员模型对象: public class Mem
rng = pd.date_range('2016-02-07', periods=7, freq='D') print(rng[0].day) print(rng[0].month) 7 2 我想要
rng = pd.date_range('2016-02-07', periods=7, freq='D') print(rng[0].day) print(rng[0].month) 7 2 我想要
我必须在我的数据库中保存 ServerValue.TIMESTAMP 但它必须是一个字符串。当我键入 String.valueOf(ServerValue.TIMESTAMP); 或 ServerVa
在我的程序中,每个表都有一列 last_modified: last_modified int8 DEFAULT (date_part('epoch'::text, now()::timestamp)
我想将此时间戳对象转换为日期时间此对象是在数据帧上使用 asfreq 后获得的这是最后一个索引 Timestamp('2018-12-01 00:00:00', freq='MS') 想要的输出 2
我有一个包含时间序列传感器数据的大表。大型是指分布在被监控的各个 channel 中的从几千到 10M 的记录。对于某种传感器类型,我需要计算当前读数和上一个读数之间的时间间隔,即找到当前读数之前的最
我是一名优秀的程序员,十分优秀!