我想在PostgreSQL中对表进行大量更新,但我不需要在整个操作中维护事务完整性,因为我知道我正在更改的列不会被写入或读取更新.我想知道psql控制台中是否有一种简单的方法可以更快地完成这些类型的操作.
例如,假设我有一个名为"orders"的表,有3500万行,我想这样做:
UPDATE orders SET status = null;
Run Code Online (Sandbox Code Playgroud)
为避免被转移到offtopic讨论,让我们假设3500万列的所有状态值当前都设置为相同(非空)值,从而使索引无用.
此语句的问题是需要很长时间才能生效(仅因为锁定),并且所有更改的行都将被锁定,直到整个更新完成.此更新可能需要5个小时,而类似
UPDATE orders SET status = null WHERE (order_id > 0 and order_id < 1000000);
Run Code Online (Sandbox Code Playgroud)
可能需要1分钟.超过3500万行,执行上述操作并将其分成35块只需要35分钟,节省了4小时25分钟.
我可以用脚本进一步分解它(在这里使用伪代码):
for (i = 0 to 3500) {
db_operation ("UPDATE orders SET status = null
WHERE (order_id >" + (i*1000)"
+ " AND order_id <" + ((i+1)*1000) " + ")");
}
Run Code Online (Sandbox Code Playgroud)
此操作可能仅在几分钟内完成,而不是35分钟.
所以这归结为我真正的要求.我不想写一个怪异的脚本来分解操作,每次我想做这样一个大的一次性更新.有没有办法在SQL中完成我想要的东西?
分页来自数据库的数据时,您需要知道将有多少页面呈现页面跳转控件.
目前我通过运行查询两次,一次包装count()以确定总结果,第二次应用限制以获取当前页面所需的结果.
这似乎效率低下.有没有更好的方法来确定在LIMIT应用之前会返回多少结果?
我正在使用PHP和Postgres.
我有一个像pg这样的表:
CREATE TABLE t (
a BIGSERIAL NOT NULL, -- 8 b
b SMALLINT, -- 2 b
c SMALLINT, -- 2 b
d REAL, -- 4 b
e REAL, -- 4 b
f REAL, -- 4 b
g INTEGER, -- 4 b
h REAL, -- 4 b
i REAL, -- 4 b
j SMALLINT, -- 2 b
k INTEGER, -- 4 b
l INTEGER, -- 4 b
m REAL, -- 4 b
CONSTRAINT a_pkey PRIMARY KEY (a)
);
Run Code Online (Sandbox Code Playgroud)
以上每行最多可添加50个字节.我的经验是,我需要另外40%到50%的系统开销,甚至没有任何用户创建的索引.所以,每行约75个字节.我将在表中有许多行,可能超过1450亿行,因此该表将推动13-14太字节.我可以使用什么技巧来压缩这个表?我的可能想法如下......
将 …
我想知道getContentResolver()调用的上下文?
我有一个这样的场景:
我有一个活动A,它调用myFunc()B类方法而不是活动.
所以,在BI类中必须使用getContentResolver().我直接打电话getContentResolver().它显示错误.然后我myFunc(Acitivy act)从活动中调用并调用 act.getContentResolver()它解决了我的问题.这是唯一的调用方式getContentResolver(),这意味着它可以在活动的上下文中使用,也可以单独使用.
我有一个added_at类型的列timestamp without time zone.我希望它的默认值是当前的日期时间但没有时区.该函数也now()返回一个时区.
我该如何解决这个问题?
我已经习惯了Oracle并在我的架构中创建了一个dblink,然后访问了这样一个远程数据库:mytable@myremotedb那么对于PostgreSQL有没有相同的做法?
现在我正在使用这样的dblink:
SELECT logindate FROM dblink('host=dev.toto.com
user=toto
password=isok
dbname=totofamily', 'SELECT logindate FROM loginlog');
Run Code Online (Sandbox Code Playgroud)
当我执行此命令时,我收到以下错误:
提示:没有函数匹配给定的名称和参数类型.您可能需要添加显式类型转换.
有人有想法吗?我们是否必须"激活"dblinks或在使用它们之前做些什么?
我们要查询的远程数据库有什么问题吗?我们还要激活dblink吗?我一直都有could not establish connection.这是行类型:
SELECT dblink_connect_u('host=x.x.x.x dbname=mydb user=root port=5432');
Run Code Online (Sandbox Code Playgroud)
IP地址正确,Postgres正在远程服务器上运行.任何的想法?
出于分页目的,我需要使用LIMIT和OFFSET子句运行查询.但是我还需要计算没有LIMIT和OFFSET子句的查询返回的行数.
我想跑:
SELECT * FROM table WHERE /* whatever */ ORDER BY col1 LIMIT ? OFFSET ?
Run Code Online (Sandbox Code Playgroud)
和:
SELECT COUNT(*) FROM table WHERE /* whatever */
Run Code Online (Sandbox Code Playgroud)
同时.有没有办法做到这一点,特别是让Postgres优化它的方式,这样它比单独运行更快?
想要查找某个json列包含空对象的所有行,{}.这可以使用JSON数组,或者如果我在对象中查找特定键.但我只是想知道对象是否为空.似乎找不到会这样做的运营商.
dev=# \d test
Table "public.test"
Column | Type | Modifiers
--------+------+-----------
foo | json |
dev=# select * from test;
foo
---------
{"a":1}
{"b":1}
{}
(3 rows)
dev=# select * from test where foo != '{}';
ERROR: operator does not exist: json <> unknown
LINE 1: select * from test where foo != '{}';
^
HINT: No operator matches the given name and argument type(s). You might need to add explicit type casts.
dev=# select * from …Run Code Online (Sandbox Code Playgroud) millisecond如果second零件也从timestampw/o中取出,我该如何丢弃/绕过零件timezone?
我正在尝试创建一个临时表,只选择某个数据register_type.我写了这个查询,但它不起作用:
$ CREATE TABLE temp1
(Select
egauge.dataid,
egauge.register_type,
egauge.timestamp_localtime,
egauge.read_value_avg
from rawdata.egauge
where register_type like '%gen%'
order by dataid, timestamp_localtime ) $
Run Code Online (Sandbox Code Playgroud)
我正在使用PostgreSQL.
你能告诉我查询有什么问题吗?
postgresql ×9
sql ×5
dblink ×2
timestamp ×2
android ×1
bigdata ×1
casting ×1
count ×1
json ×1
jsonb ×1
limit ×1
pagination ×1
php ×1
plpgsql ×1
rounding ×1
sql-limit ×1
sql-update ×1
storage ×1
temp-tables ×1
transactions ×1
types ×1