小编art*_*hur的帖子

估计 Postgres 中的(记录的)大小和开销

考虑 Postgres 9.4 中的下表:

CREATE TABLE t
(
  a1 bigserial,
  a2 bigint NOT NULL,
  a3 bigint NOT NULL,
  a4 integer, 
  a5 timestamp with time zone NOT NULL,
  a6 timestamp with time zone NOT NULL DEFAULT now(),
  a7 bigint NOT NULL,
  a8 bigint NOT NULL,
  a9 real,
  a10 integer,

  CONSTRAINT kkkey PRIMARY KEY (a1)
)
Run Code Online (Sandbox Code Playgroud)

保存这张表的估计成本是多少?

创纪录的成本:

size(bigserial) 
+ size(bigint) 
+ size(bigint) 
+ size(integer) 
+ size(timestamp) 
+ size(timestamp) 
+ size(bigint) 
+ size(bigint) 
+ size(real) 
+ size(integer)
= 8 + 8 + …
Run Code Online (Sandbox Code Playgroud)

postgresql size postgresql-9.4 cardinality-estimates

9
推荐指数
1
解决办法
5854
查看次数

从 UDF 返回的匿名记录自动转换为众所周知的表类型

专有代码(我们无法更改)有一堆用户定义的函数类型:

create or replace function f() returns record as $$ ... $$
Run Code Online (Sandbox Code Playgroud)

我们通过以下方式调用它(例如):

SELECT status, log FROM f() as (status boolean, log text);
Run Code Online (Sandbox Code Playgroud)

(status boolean, log text)是 table 的行类型T。是否可以在不列出属性的情况下自动将record(或setof record返回类型)转换为T行类型?我正在寻找的是那种:

SELECT * FROM f() as T%rowtype
Run Code Online (Sandbox Code Playgroud)

postgresql type-conversion plpgsql functions composite-types

8
推荐指数
1
解决办法
8791
查看次数

UUID V1 和 V4 在顺序插入和删除后显着膨胀。与串行和时间 BTree(不会膨胀)相比,为什么会这样?

我试图了解在大量插入和删除后删除对表和索引膨胀的影响。插入和删除遵循相当严格的模式:首先,记录按顺序插入,在下一个时间段(通常为五年)内很少(或几乎从不)更新,一旦超过此阈值(五年)就删除。这是许多企业软件系统中的典型场景,出于合规性原因需要保留记录。

数据库 (PostgreSQL 9.6.5) 以非常标准的配置运行(增加了一些参数以进行快速查询和维护处理)。

我正在尝试模拟和分析表和(典型)索引的膨胀。在概念层面上,(1)创建一个表,(2)分析它(3)插入记录(4)再次分析它,(5)删除一半的记录(6)分析它(7)再次分析它,( 8) 再次插入已删除记录的数量 (9) 分析它并 (10) 再次分析它和 (11) 检查索引和表是否膨胀。

完整的SQL代码如下:

set LC_MESSAGES ='C'

create extension "uuid-ossp"

drop table v1;
create table v1 (
    id serial primary key, 
    id_uuid_v1 uuid default uuid_generate_v1(), 
    id_uuid_v4 uuid default uuid_generate_v4(), 
    t timestamp with time zone default clock_timestamp(),
    name varchar
);
create index ix_v1_uuid on v1 (id_uuid_v1);
create index ix_v4_uuid on v1 (id_uuid_v4);
create index ix_v1_t on v1 (t);

vacuum (verbose, analyze, freeze) v1;

select pg_size_pretty(pg_relation_size('v1')), count(*)
from v1;

-- emtpy …
Run Code Online (Sandbox Code Playgroud)

index postgresql-9.6 index-bloat

6
推荐指数
1
解决办法
336
查看次数

postgresql 中的转义分隔符

我正在尝试将数据导入到 postgres 中。数据字段以逗号分隔,字符串可能包含逗号,在这种情况下,这些字段将被转义:

数据结构:

create table v (a varchar);
Run Code Online (Sandbox Code Playgroud)

数据文件:

bus
'Gat\,\\e\'way_MQB'
Run Code Online (Sandbox Code Playgroud)

导入命令(在Linux下从bash运行)

cat data.csv | psql -d database -c "copy v (a) from stdin with delimiter ',' escape '\\' CSV header"
Run Code Online (Sandbox Code Playgroud)

错误:

ERROR:  extra data after last expected column
Run Code Online (Sandbox Code Playgroud)

我已经和谷歌对抗这个问题好几个小时了,不明白我做错了什么?

postgresql import copy

5
推荐指数
1
解决办法
2万
查看次数

即使函数中止,也会在 UDF 中持久插入

我有一个相当复杂的 UDF(在一堆表中移动并创建一堆新表),其中可能会发生多次中止。在每次操作之前,我想记录操作发生的时间和查询本身。UDF 如下所示:

log function_start

log sql1
execute sql1

log sql2
execute sql2

...

log sqlN
execute sqlN

log function_end
Run Code Online (Sandbox Code Playgroud)

每条日志语句都意味着向下表中插入一条新记录:

CREATE TABLE backup_logs
(
  id serial NOT NULL,
  t timestamp with time zone default now(),
  sql text,
  CONSTRAINT backup_logs_pkey PRIMARY KEY (id)
)
Run Code Online (Sandbox Code Playgroud)

如果发生中止,我希望sql1, sql2, ... sqlN回滚,但inserto into backup_logs会继续存在。问题:我怎样才能实现这一目标?

postgresql insert transaction plpgsql postgresql-9.4

5
推荐指数
1
解决办法
1076
查看次数

将记录变量中的值插入表中

我正在开发一个带有两个参数的用户定义函数:

create or replace function gesio(
    events_table_in regclass,  
    events_table_out regclass)
returns void as $$ ... $$
Run Code Online (Sandbox Code Playgroud)

events_table_inevents_table_out具有完全相同的架构。

简单解释一下,我遍历 的记录events_table_in,操作记录并希望以events_table_out以下方式追加(插入)操作的记录:

OPEN recCurs FOR execute 
format('SELECT * FROM %s order by session_id, event_time', event_table_in);

LOOP
    FETCH recCurs into rec;
    if not found then
      exit;
    end if;

    -- 1. do something with rec

    -- 2. insert the rec into events_table_out

end loop;
Run Code Online (Sandbox Code Playgroud)

我怎样才能保存recevents_table_out

postgresql insert plpgsql functions record

3
推荐指数
2
解决办法
2万
查看次数

sql server中没有索引的表大小

使用以下查询我可以获得表索引的大小:

SELECT
    i.name              AS IndexName,
    SUM(page_count * 8) AS IndexSizeKB
FROM sys.dm_db_index_physical_stats(db_id(), object_id('schema.table'), NULL, NULL, 'DETAILED') AS s
JOIN sys.indexes AS i
ON s.[object_id] = i.[object_id] AND s.index_id = i.index_id
GROUP BY i.name
ORDER BY i.name
Run Code Online (Sandbox Code Playgroud)

如果我执行sp_spaceused 'schema.table'没有索引的大小是否对应于data列?

有什么方法可以获取sql server中没有索引的表的大小吗?(SELECT声明会很好,因为我想将此查询插入到更大的查询中)。

如果我执行获取数据库中所有表的大小,表的大小几乎与索引的大小相同(表明有问题)。

sql-server size

3
推荐指数
1
解决办法
2767
查看次数

在 postgres 服务器上恢复超级用户帐户

我对 postgres dbms 有一个完全好奇的情况。我已经安装了数据库,由于我的安装脚本配置错误,我将超级用户角色设置为普通用户。现在我有一个完全全新的 postgres 安装,只有模板数据库和一个几乎什么都不做的单个用户“postgres”。我怎样才能让 postgres 用户再次成为超级用户?

我尝试在 ubuntu 12.04 下重新安装服务器,aptitude reinstall postgresql-9.1但角色似乎不受影响。很可能是因为重新安装不会影响记录角色的文件。

postgresql role

2
推荐指数
1
解决办法
4715
查看次数

请求表上的 Sch-M 锁

我可以在读取未提交模式下访问数据库,并且需要在操作环境中对表进行维护。我需要获取一个表的排他锁,做一个工作,然后释放锁。

在此维护期间,即使读取查询也不应将未提交的数据取回。

这个问题和答案看起来很有希望。我愿意:

begin transaction;
SELECT TOP (1) 1 FROM a WITH (TABLOCK);
Run Code Online (Sandbox Code Playgroud)

但是随后,SIX在 table 上获得了锁a。但是,这不会从选择查询中锁定表。如何获取Sch-M表上的锁?我最多可以通过以下方式获得Sch-S锁定:

SELECT TOP (1) * FROM a WITH (TABLOCK);
Run Code Online (Sandbox Code Playgroud)

这仍然不会阻止表上的选择查询。

sql-server locking

2
推荐指数
1
解决办法
57
查看次数

为多个表连续编号行

我有许多表,都包含属性aid,bid,cidxid整数类型,其他属性可能不同。对于每个(给定)表T,我想根据aid,bid,cid升序和更新列对行进行排序xid,增量值从 0 开始。实现这一目标的最佳方法是什么?

我目前的解决方案包括:

  • 选择表 T
  • 在表的有序元组上打开游标
  • 将自动增量值分配给 xid
  • 将元组插入时态表 T_temp
  • 删除所有记录 T
  • 将所有记录插入T_tempT

由于这些表具有不同的模式,我编写了一半代码PL/pgSQL,一半代码使用 bash 脚本编写。

问题 1:任何评论如何让它在纯 PL/pgSQL 中编程?

问题 2:任何评论如何更优雅地实现?

postgresql scripting window-functions update

1
推荐指数
1
解决办法
528
查看次数

Postgres 9.1 中的 ACID 违规?

我正在使用 Postgres DB 为大量计算机/进程实现作业调度。简而言之,每个作业都有其 id,所有调度都通过三个选项卡实现:所有作业、当前正在运行的作业和已完成的作业。

调度的关键功能是 (1) 请求作业和 (2) 通知 DB 已完成的作业。请求作业从作业列表中获取任何 id,它不在运行表中,也不在已完成表中:

insert into piper.jobs_running
select x.fid from ( 
  SELECT fid FROM piper.jobs
  except 
  select fid from piper.jobs_running
  except 
  select fid from piper.jobs_completed
 ) as x limit 1
returning(fid)
Run Code Online (Sandbox Code Playgroud)

完成作业会将其从运行列表中删除,并将其插入到已完成列表中。因为它不是特定于并发的,所以我省略了 SQL 命令(完成一项工作需要几十分钟到几个小时。)

对我来说,这是一个令人讨厌的惊喜,上面运行完全相同的查询的两个进程(几乎同时请求作业)可能会获得相同的作业 ID (fid)。我要提出的唯一可能的解释是 Postgres 不依赖 ACID 一致性。注释?

附加信息:我将事务设置为可序列化(在postgresql.conf 中 set default_transaction_isolation = 'serializable')。现在,如果隔离未完全填充,DBMS 会使事务失败。是否可以强制 Postgres 自动重新启动它们?

postgresql concurrency postgresql-9.1 acid except

1
推荐指数
1
解决办法
703
查看次数