Questions tagged «postgresql»

PostgreSQL的所有版本。如果该上下文很重要,请添加其他特定于版本的标记,例如postgresql-11。


1
何时在\ l中列出特权,何时不列出?
\ l何时列出访问特权,什么时候不列出?\ l列出的访问权限可以在授予并撤消后更改: $ createuser -EP my_readonly $ psql development development=# \l List of databases Name | Owner | Encoding | Collate | Ctype | Access privileges -----------------------------+----------+----------+-------------+-------------+----------------------- development | vagrant | UTF8 | en_GB.UTF-8 | en_GB.UTF-8 | ... development=# grant usage on schema public to my_readonly; development=# grant connect …

3
PostgreSQL可以在索引中使用空值吗?
我读过这本书说 数据库假定Indexed_Col IS NOT NULL覆盖的范围太大而无用,因此数据库不会从这种情况驱动到索引。 我认识到这本书已有十多年的历史了,但是它已经被证明是非常有用的-使用从书页中收集到的指令,我将查询速度提高了十倍。 此外,在运行EXPLAIN ANALYZE上一SELECT查询,我发现没有我的指标正在使用,所有的权利,即使他们应该是。 因此,我的问题是: 假设有一个表包含一个列,该列的列定义包括“ NOT NULL”,并且存在一个覆盖该列的索引,那么该索引是否可以用于该表的查询中,该列是查询的一部分? 喜欢: CREATE TABLE my_table( a varchar NOT NULL ); CREATE INDEX ix_my_table ON my_table(a); SELECT a from my_table;


2
获取运行缓慢的查询的统计信息
我的数据库应用程序运行许多不同的查询。我已将其设置log_min_duration_statement为1000。但是记录的查询并不总是很慢,大多数情况下它们仅花费几毫秒。 是否可以获取所有查询的统计信息,并且查询花费的时间多于1000毫秒?

2
如何确定添加索引的成本/收益?
根据Craig Ringer的说法: 虽然在引用侧外键列上(或包括)创建索引通常是一个好主意,但这不是必需的。每个索引添加减慢DML操作略有下降,所以你在每交纳履约成本INSERT,UPDATE或DELETE。如果很少使用该索引,则可能不值得使用。 您如何确定添加索引的好处是否超过其成本? 您是否在添加索引之前/之后分析了单元测试,并检查整体性能提升?或者,还有更好的方法?

2
由于行估计非常不准确,导致全文搜索速度缓慢
对该数据库进行全文查询(存储RT(请求跟踪程序)票证)似乎需要很长时间才能执行。附件表(包含全文数据)约为15GB。 数据库模式如下,大约有200万行: rt4 =#\ d +附件 表“ public.attachments” 专栏 类型 修饰符| 储存| 描述 ----------------- + ----------------------------- +- -------------------------------------------------- ------ + ---------- + ------------- id | 整数| 不是null默认nextval('attachments_id_seq':: regclass)| 普通 transactionid | 整数| 不为空| 普通 父| 整数| 不为null默认值0 | 普通 messageid | 角色变化(160)| | 扩展| 主题| 字符变化(255)| | 扩展| 文件名| 字符变化(255)| …

2
使用PL / pgSQL函数返回记录-加快查询速度
我有一个用Perl编写的非分叉游戏守护进程,该守护进程使用acync查询将玩家统计信息写入PostgreSQL 9.3数据库。但是,当我需要从数据库中读取某些内容时(例如,如果某个播放器被禁止或该播放器具有VIP状态),那么我将使用同步查询。 这使游戏停止片刻,直到从数据库中读取了该值。 我无法重写游戏守护进程以使用异步查询来读取值(我尝试过,但是需要太多更改),所以我的问题是:合并几个不相关的查询(当一个新玩家使用时,我需要进行查询)是否有意义连接)到1过程,我如何同时向我的Perl程序返回几个值? 我当前的所有查询都以玩家ID作为参数并返回1值: -- Has the player been banned? select true from pref_ban where id=? -- What is the reputation of this player? select count(nullif(nice, false)) - count(nullif(nice, true)) as rep from pref_rep where id=? -- Is he or she a special VIP player? select vip > now() …

1
如何“提示”递归CTE的基数?
我使用以下递归CTE作为最小示例,但总的来说,优化程序必须对递归CTE使用默认的“猜测”基数: with recursive w(n) as ( select 1 union all select n+1 from w where n<5 ) select * from w; /* n --- 1 2 3 4 5 */ explain analyze with recursive w(n) as ( select 1 union all select n+1 from w where n<5 ) select * …

2
如何正确监视PostgreSQL数据库连接数?
我试图使用Nagios脚本来监视Postgres数据库上的数据库连接数,但我遇到了这个问题:这些计数被视为当前打开的连接,每5分钟测量一次。 SELECT sum(numbackends) FROM pg_stat_database; 不过,这似乎会错过大量的短期连接,因此统计数据与实际情况相去甚远。 我尝试手动运行该脚本,并且发现即使在两个连接之间相差几秒钟的情况下,也发生了很大的变化。 我如何以可靠的方式获取此信息?像max(connectios)发生在一个时间间隔内。

1
550万行/文档的MongoDB性能与PostgreSQL的对比
有人可以帮我比较这些查询,并解释为什么PostgreSQL查询在不到2000毫秒的时间内执行,而MongoDB聚合查询需要近9000毫秒,有时甚至高达130K毫秒? PostgreSQL 9.3.2 on x86_64-apple-darwin, compiled by i686-apple-darwin11-llvm-gcc-4.2 (GCC) 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2336.9.00), 64-bit PostgreSQL查询 SELECT locomotive_id, SUM(date_trunc('second', datetime) - date_trunc('second', prevDatetime)) AS utilization_time FROM bpkdmp WHERE datetime >= '2013-7-26 00:00:00.0000' AND datetime <= '2013-7-26 23:59:59.9999' GROUP BY locomotive_id order by locomotive_id MongoDB查询 db.bpkdmp.aggregate([ …

1
带有IN()参数的PostgreSQL PREPARE查询
我正在尝试从PHP准备查询,例如: pg_prepare($con, "prep", "select * from test where tid in ($1)"); 然后执行以下命令: $strpar = "3,4,6,8,10"; pg_execute($con, "prep", array($strpars)); 问题是我无法传递由于prepare需要固定数量的参数而构建的一系列值。有什么方法可以使参数动态化?



4
如何使用PostgreSQL在每一行上保持唯一的计数器?
我需要在document_revisions表中保留一个唯一的(每行)修订号,该修订号的作用域是一个文档,因此它不是整个表唯一的,而仅是相关文档的唯一。 我最初想到的是: current_rev = SELECT MAX(rev) FROM document_revisions WHERE document_id = 123; INSERT INTO document_revisions(rev) VALUES(current_rev + 1); 但是有比赛条件! 我正在尝试使用来解决它pg_advisory_lock,但是文档有点稀缺,并且我不太了解它,我也不想错误地锁定某些东西。 以下内容是否可以接受,或者我做错了,还是有更好的解决方案? SELECT pg_advisory_lock(123); current_rev = SELECT MAX(rev) FROM document_revisions WHERE document_id = 123; INSERT INTO document_revisions(rev) VALUES(current_rev + 1); SELECT pg_advisory_unlock(123); 我是否应该为给定操作(key2)锁定文档行(key1)?因此,这将是正确的解决方案: SELECT pg_advisory_lock(id, 1) FROM documents WHERE id = …

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.