标签: postgresql

PostgreSQL 9.3 分页:计算页数

我执行分页和,让我们说,行的排序products表,使用上多列索引categoryscoreid

-- index
create index category_score_id on products(category, score, id)
  where active = true;

-- selecting first page
select * from products where
  category = 1
  and active = true
order by score desc, id desc
limit 30;

-- selecting following pages
select * from products where
  category = 1
  and active = true
  and (score, id) < (893, 102458)  -- values from previous page
order by score desc, id desc
limit …
Run Code Online (Sandbox Code Playgroud)

postgresql index postgresql-9.3

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

MySQL 和 PostgresSQL 中的数据仓库是否可行?

我对数据库设计和开发相当陌生。我的要求是基于时间和单词语言(特定日期的语言)进行简单的钻取/切片。但是,我的数据库是 mysql。但到目前为止,我还没有运行这些查询的运气,所以我手动计算这些数据并存储在表中。

为了更具体地说明我的应用程序,我需要在 iPhone 上显示图表/图形。因此,用户每天/每周/每月使用每种语言的单词。我不需要实时,但用户使用一个月的行数约为 5000。

我想了解 mysql 是否有可能拥有仓库模式并在没有性能问题的情况下执行此类查询。我的选择是什么。

我真的无法支付企业解决方案的费用,我准备在我的应用程序(我有)中为这种处理编写代码,但想迁移到正确的方式。

我想对我来说最理想的情况是不使用任何工具就可以在我当前的数据库中创建事实和维度,然后转移我的 api 来运行这些 olap 查询。从我收集的信息来看,这对于 mysql 是不可能的。Postgres 显示出一些希望,但仍在阅读。

mysql postgresql data-warehouse olap

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

Postgresql - 外键约束会自动创建索引吗?

根据 PGSQL 9.3 文档:

因为这并不总是需要,而且有很多关于如何索引的选择,外键约束的声明不会自动在引用列上创建索引。

然而,在我创建了这样一个约束之后,当我运行时,\d <table>我看到索引确实被创建了:

Indexes: "table_primary_key" PRIMARY KEY, btree (id) "fki_table_product_foreign_key" btree (product)

什么可以解释为什么会创建这个?我是否仍然需要在我的产品列上创建另一个索引来提高对它的查询性能?

postgresql index foreign-key pgadmin

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

RETURN TABLE 在 Postgres 函数中转换为 RETURN SETOF int

在 pgAdminIII 中,我创建了一个函数,该函数使用 RETURN TABLE 在名为 identifier 的单列中返回多行:

CREATE OR REPLACE FUNCTION test(
    IN parm1 date,
    IN parm2 interval)
  RETURNS TABLE(identifier INT) 
AS
$BODY$
BEGIN
    RETURN QUERY
    SELECT 1;

END;
$BODY$
  LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)

创建函数后,pgAdminIII 显示该函数具有以下定义:

CREATE OR REPLACE FUNCTION test(IN parm1 date, IN parm2 interval)
  RETURNS SETOF integer AS
$BODY$
BEGIN
    RETURN QUERY
    SELECT 1;

END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100
Run Code Online (Sandbox Code Playgroud)

执行函数时,它遵循RETURNS TABLE. 但是,在编辑该函数时,它将拾取RETURNS SETOF. 这提供了与我指定的函数不同的功能(例如,返回的列的名称不再存在)。

那么,如何强制 pgAdminIII 保留返回的列名identifier?我并不特别关心我是否将其定义为 aTABLESETOF …

postgresql pgadmin parameter functions

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

pg_restore 警告列 X 的类型未知

我正在从 PostgreSQL 9.1 转储并在 PostgreSQL 9.4 上恢复并收到此警告

pg_restore: WARNING:  column "foobar" has type "unknown"
DETAIL:  Proceeding with relation creation anyway.
Run Code Online (Sandbox Code Playgroud)

但是在恢复之后,我可以验证列“foobar”类型是否已定义且正确。

什么可能导致此警告?

postgresql datatypes dump restore

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

在两个表中的触发器函数中选择

我在 x86_64-unknown-linux-gnu 上的 PostgreSQL 9.4.3 中的表和触发器,由 gcc (Debian 4.9.2-10) 4.9.2,64 位编译:

CREATE TABLE measurements (
        measurement_id SERIAL PRIMARY KEY NOT NULL,
        measurement_size_in_bytes INTEGER NOT NULL
    );    

CREATE TABLE file_headers (
        header_id SERIAL PRIMARY KEY NOT NULL, 
        measurement_id INTEGER NOT NULL, 
        file_header_index_start INTEGER,
        file_header_index_end INTEGER
    );

CREATE TRIGGER measurement_ids AFTER INSERT 
        ON measurements FOR EACH ROW 
        EXECUTE PROCEDURE ins_function('SELECT measurement_id FROM measurements 
        ORDER BY measurement_id desc limit 1;', 1, 666 ); 
Run Code Online (Sandbox Code Playgroud)

在那里我假设 SELECT 的数据类型自 SERIAL 以来是 INTEGER 但它显然是错误的,因为我从这个启动触发器的命令中收到错误消息:

INSERT INTO measurements …
Run Code Online (Sandbox Code Playgroud)

postgresql trigger datatypes plpgsql serialization

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

PG 用户对 Web 应用程序的正确设置是什么

我们有一个网络应用程序,可以检测数据库是否不存在并创建它。用户喜欢它,但我的想法是这样的用户拥有太多的权限。

我最好建议更改应用程序的数据库创建屏幕以提供 2 组凭据 - 一组将用于最初创建数据库而不是永久存储(例如“postgres”角色),另一组将被网络使用app 并存储在配置文件中(例如“webapp”)。此外,'webapp' 将需要能够 1) 添加新的和 2) 修改现有的表、过程和函数(Web 应用程序根据需要自动更新架构)

所以我的一些问题是:

  • 使用 PostgreSQL 9.x 时,上述场景中有哪些最佳实践?
  • 创建的数据库应该归“webapp”角色所有还是归“postgres”所有,我只是授予“webapp”必要的权限。如果是后者,新添加的对象是否归“webapp”所有,我应该避免这种情况吗?
  • 社区用户目前使用的方法有哪些?

postgresql security best-practices users postgresql-9.4

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

如何在 VALUES 和 SELECT 之间选择 INSERT?

这个答案向我提出了如何在这样的函数之间VALUESSELECT中进行选择的问题。在 x86_64-unknown-linux-gnu 上使用PostgreSQL 9.4.3,由 gcc (Debian 4.9.2-10) 4.9.2, 64-bit 编译

CREATE OR REPLACE FUNCTION insaft_function()
   RETURNS TRIGGER AS
$func$
BEGIN     
   INSERT INTO file_headers (measurement_id, file_header_index_start
                                           , file_header_index_end)
   VALUES (NEW.measurement_id, TG_ARGV[0]::int, TG_ARGV[1]::int);

   RETURN NULL;  -- result ignored since this is an AFTER trigger
END
$func$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)

VALUES处理多行,但SELECT你可以做更多的事情。这里唯一的要求是对INSERT表格执行上述操作。您可以假设INSERT在系统的持续质量保证中每个周期完成100k 次这样的操作。

我注意到这些差异与我的数据不同,这里选择了三个中值:

VALUES
real      user      sys
-------------------------------
0m0.353s  0m0.256s  0m0.028s
0m0.327s  0m0.252s  0m0.036s
0m0.358s …
Run Code Online (Sandbox Code Playgroud)

postgresql trigger performance select postgresql-performance

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

如果我只关心查询的字段不为空,我是否想要一个索引

在 SQL 中,如果我想要查询的所有内容(在 where 条件中)是字段不为空时,是否所有关于索引的常见考虑都适用?

我可以应用索引的特殊配置来涵盖这种特定情况吗?

例如:

select id
from Accesses
where token is not null;
Run Code Online (Sandbox Code Playgroud)

token如果我必须搜索特定的令牌值,是否值得尽可能多地添加索引?

我的数据库是 Postgres。

postgresql performance

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

使用 Postgres 按顺序关系分组

这与关于连续范围的这个问题非常相似,以及这个关于按顺序数字分组的问题,但不同之处在于序列不是数字。给定以下关系作为密钥对

a -- b -- c      e -- f -- g
     |   /
     |  /
      d
Run Code Online (Sandbox Code Playgroud)

这是带有示例数据的表(也在SQLFiddle 上):

CREATE TABLE relationships (
   name varchar(1),
   related varchar(1)
);

INSERT INTO relationships (name, related) VALUES 
('a', 'a'),
('a', 'b'),
('b', 'b'),
('b', 'a'),
('b', 'c'),
('b', 'd'),
('c', 'c'),
('c', 'b'),
('c', 'd'),
('d', 'd'),
('d', 'c'),
('d', 'b'),

('e', 'e'),
('e', 'f'),
('f', 'f'),
('f', 'e'),
('f', 'g'),
('g', 'g');
Run Code Online (Sandbox Code Playgroud)

产生如下输出的最有效方法是什么:

| group …
Run Code Online (Sandbox Code Playgroud)

postgresql postgresql-9.3

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