我正在尝试REAL使用这样的简单查询对 800 万个浮点 ( ) 值求和:
SELECT SUM(metric) FROM metrics;
Run Code Online (Sandbox Code Playgroud)
但是,它返回的结果非常不准确。它应该返回 137,586.77,但它返回 137,303(283.77 差异)
有没有办法强制查询更精确?
无法O (log n)及时索引和执行查询。
该查询包括一个INNER JOIN、一个ORDER BY和一个相等运算。如果我正确理解了数据库的规律,O (log n)如果一个非等式运算符没有在多于一列上使用,则可以及时(或大约)索引和执行查询。在这种情况下,我相信INNER JOIN确实算作相等运算符,而非相等运算符将是ORDER BY查询的一部分。该表有超过 10,000,000 行,需要每秒处理多次读取和写入。
使用 PostgreSQL。这就是桌子的样子。如您所见,“Names”列是一个列表属性,它是与之相反的列INNER JOIN:
Age Names Date
34 ['carla', 'john', 'sam'] 3/13/2011
26 ['json', 'cindy', 'joel'] 3/13/2011
72 ['beth', 'amber', 'susie'] 3/13/2011
14 ['john', 'jim', 'debie'] 3/13/2011
Run Code Online (Sandbox Code Playgroud)
这是我们尝试执行的查询:
SELECT * FROM the_table WHERE Age==26 AND Names=='john' ORDER BY Date
Run Code Online (Sandbox Code Playgroud)
我的背景来自使用 App Engine 的 Big Table,所以我在这里使用了相等运算符来指示它'john'应该是Names列中的名称之一。这将是 GAE 大表中可接受的查询,它将O (log N)及时执行,因为所有大表查询都需要执行。我假设在 …
当从被黑的 Ubuntu 12.04 服务器恢复 Postgresql 数据库时,我将数据目录复制到另一个位置,重新安装操作系统和 PostgreSQL,停止 PostgreSQL 服务,删除数据目录中的内容并从以前的安装中复制回内容。
问题: PostgreSQL 现在无法启动,显示以下错误。为什么会发生这种情况,我们如何解决这个问题?
service postgresql restart
* Restarting PostgreSQL 9.1 database server
Run Code Online (Sandbox Code Playgroud)
* Error: could not exec /usr/lib/postgresql/9.1/bin/pg_ctl /usr/lib/postgresql/9.1/bin/pg_ctl start -D /var/lib/postgresql/9.1/main -l /var/log/postgresql/postgresql-9.1-main.log -s -o -c config_file="/etc/postgresql/9.1/main/postgresql.conf" :
现在重新启动 PostgreSQL 服务会出现错误:
* Restarting PostgreSQL 9.1 database server
* The PostgreSQL server failed to start. Please check the log output:
2013-04-16 01:52:10 EDT PANIC: could not open control file "global/pg_control": Permission denied
Run Code Online (Sandbox Code Playgroud) 来自文档的引用:
Read Committed 是 PostgreSQL 中的默认隔离级别。当事务使用此隔离级别时,SELECT 查询(没有 FOR UPDATE/SHARE 子句)只会看到在查询开始之前提交的数据;它永远不会看到未提交的数据或并发事务在查询执行期间提交的更改。实际上,SELECT 查询会在查询开始运行的那一刻看到数据库的快照。但是,SELECT 确实会看到在其自己的事务中执行的先前更新的影响,即使它们尚未提交。另请注意,如果其他事务在第一个 SELECT 执行期间提交更改,则两个连续的 SELECT 命令可以看到不同的数据,即使它们位于单个事务中。
那么 PostgreSQL 是否看到另一个事务提交的更改?
我想编写一个 PostgreSQL 存储函数,它的行为本质上类似于我从 MSSQL 和 MySQL 中了解和喜爱的存储过程,我可以在其中包装一个不带参数的查询并让它返回该结果集,而无需指定输出的格式并在每次更新查询时更改该定义。这在 PostgreSQL 中甚至可能吗?
我使用 PostgreSQL 9.2 尝试了以下操作:
CREATE OR REPLACE FUNCTION test()
RETURNS SETOF record
Run Code Online (Sandbox Code Playgroud)
这给了我以下错误:
错误:返回“记录”的函数需要列定义列表
我也试过:
CREATE OR REPLACE FUNCTION test()
RETURNS table ()
Run Code Online (Sandbox Code Playgroud)
但显然这是无效的语法。
因此,如果我将一行插入到 postgres 数据库中,则需要 18 毫秒。如果我在这样的循环中执行此操作:
INSERT INTO contacts (numbers)
SELECT distinct array[
(random() * 99999999)::integer,
(random() * 99999999)::integer
]
FROM generate_series(1,4000000) AS x(id);
Run Code Online (Sandbox Code Playgroud)
我改变插入的行数,时间是非线性的。这是数据:
-1 条记录 - 18 毫秒
-20k 条记录 - 36 秒
-50k 条记录 - 151 秒
-100k 条记录 - 750 秒
为什么这会呈指数级增长?我的数据库中需要 1000 万条记录进行负载测试,插入 50k 行然后再次重新插入 50k 似乎更快,因为 151 + 151 < 750
对这个主题的任何见解将不胜感激。我认为这是因为 postgres 将数据保存到回滚,以防查询严重失败或被用户取消,并且 postgres 不想“一半插入”整个请求。
在 Postgresql 中,hstore 和 json 数据类型似乎具有非常相似的用例。你什么时候会选择使用一个和另一个?初步想法:
在PostgreSQL文档状态:
任何有副作用的函数都必须标记为 VOLATILE...
考虑以下函数:
CREATE OR REPLACE FUNCTION count_items()
RETURNS integer AS
$BODY$
DECLARE
v_result INTEGER DEFAULT 0;
BEGIN
SELECT
count( t.id )
INTO
v_result
FROM
some_table t;
RETURN v_result;
EXCEPTION
WHEN OTHERS THEN
PERFORM error_log_insert( SQLSTATE, SQLERRM, current_query() );
RETURN 0;
END;
$BODY$
LANGUAGE plpgsql STABLE
COST 10;
Run Code Online (Sandbox Code Playgroud)
由于error_log_insert更改数据库(对异常执行插入),这是否意味着该count_items函数具有副作用(尽管是间接的),因此不能声明STABLE,但必须声明VOLATILE?
换句话说,函数的稳定性或波动性是否也取决于它在其异常块中调用的函数?
如果是这种情况,那么您将如何STABLE在 PostgreSQL 中创建将所有异常记录到数据库表中的函数?
我要查询的表只有大约 3000 行和 3 列:
int/varchar(100)/varchar(100)
Run Code Online (Sandbox Code Playgroud)
但是查询它们需要大约 30 秒!
然后我看到表大小是 1331MB 但索引大小是 25GB!
该表只有一个索引,即 pkey。
VACCUM FULL 每 24 小时运行一次,无论如何桌子应该是静态的
我的问题是为什么索引这么大(我想这就是查询如此缓慢的原因),我该怎么做才能解决这个问题?
希望你有任何想法,因为我没有,我在谷歌上也没有找到任何东西。
编辑:Postgres 版本是 8.1.18
我想知道 PostgreSQL 是否有更新查询有点像他们的插入值语法。
我目前在此表单中有一组更新的数据:
INSERT INTO bought_in_control_panel(ID,PARENT_ID,BOUGHT_IN_FORM_TYPE_ID,PRIORITY,NAME,HEADING,DESCRIPTION,ICON,BOUGHT_IN_CONTROL_PANEL_FILE_ID)
VALUES(109,1,28,100,'Tooling','Tooling','Enter your Machine Tools here','tooling.png',null);
Run Code Online (Sandbox Code Playgroud)
并且我想将已有的行更新为新数据,我正在寻找类似以下内容的内容,我可以在其中更新所有行而无需重复自己:
UPDATE ON ID
bought_in_control_panel(ID,PARENT_ID,BOUGHT_IN_FORM_TYPE_ID,PRIORITY,NAME,HEADING,DESCRIPTION,ICON,BOUGHT_IN_CONTROL_PANEL_FILE_ID)
VALUES(
(109,1,28,100,'Tooling','Tooling','Enter your Machine Tools here','tooling.png',null),
(1,0,1,200,'Bought In','Bought In','','boughtin.png',null)
);
Run Code Online (Sandbox Code Playgroud)
以上将检查匹配ID值,并用新数据更新匹配。
注意:我真的希望避免手动映射所有列名。PostgreSQL 已经知道我的列,而且我已经将它们映射到数据上。为什么要以更长的格式再次这样做?
postgresql ×10
performance ×2
datatypes ×1
exception ×1
functions ×1
gin-index ×1
index ×1
logs ×1
plpgsql ×1
psql ×1
transaction ×1
ubuntu ×1
update ×1