标签: postgresql

多列索引和性能

我有一个带有多列索引的表,我怀疑索引的正确排序以获得最大查询性能。

场景:

  • PostgreSQL 8.4,大约有一百万行的表

  • c1列中的值可以有大约100 个不同的值。我们可以假设这些值是均匀分布的,因此每个可能的值大约有 10000 行。

  • c2可以有1000 个不同的值。对于每个可能的值,我们有 1000 行。

搜索数据时,条件始终包含这两列的值,因此该表具有组合 c1 和 c2 的多列索引。如果您的查询仅使用一列进行过滤,我已经阅读了正确排序多列索引中的列的重要性。在我们的场景中,情况并非如此。

我的问题是这个:

鉴于其中一个过滤器选择的数据集要小得多,如果第一个索引是最具选择性的索引(允许更小的数据集),我是否可以提高性能?在我看到参考文章中的图形之前,我从未考虑过这个问题:

在此处输入图片说明

图片取自有关多列索引的参考文章。

查询使用两列中的值进行过滤。我没有仅使用一列进行过滤的查询。他们都是:WHERE c1=@ParameterA AND c2=@ParameterB。还有这样的条件:WHERE c1 = "abc" AND c2 LIKE "ab%"

postgresql index index-tuning

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

Postgres 函数中的 SQL 注入与准备好的查询

在 Postgres 中,准备好的查询和用户定义的函数是否等同于一种防止 SQL 注入机制
一种方法比另一种方法有什么特别的优势吗?

postgresql sql-injection prepared-statement plpgsql functions

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

需要外键索引

我正在为索引、主键和外键苦苦挣扎……并且需要拥有所有这些。

如果我有两个表,它们都有一个整数作为主键。
第一个表通过 FK 引用第二个表的主键。

  • 在两个表上,我在 ID 列上都有一个主键索引
  • 我在table1.ref_field引用第二个表 ( table2.id)的 PK上创建了 FK 约束
  • 我在上面添加了一个索引 table1.ref_field

这是组织这些索引、主键和外键的最佳方式吗?

postgresql index foreign-key database-design primary-key

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

如何仅在 psql (postgresql) 中关闭标头

我正在使用 PostgreSQL 9.1.X

我正在尝试构建psql脚本来打印没有页眉但包括页脚的结果。

http://www.postgresql.org/docs/9.1/static/app-psql.html

从上面的文件

\pset tuples_only
Run Code Online (Sandbox Code Playgroud)

将关闭页眉和页脚。和

\pset footer off
Run Code Online (Sandbox Code Playgroud)

只会关闭页脚。

有没有办法psql关闭页眉并保持页脚打开?

我知道有很多方法可以使用 shell/perl/任何你喜欢的文本工具来解决这个问题,但是我想知道为什么页脚有一个配置而页眉没有一个配置?

id <--this line I don't want
---- <-- this line I don't want either
 1  <-- this line, yes
(1 row) <-- yes, I want it!
Run Code Online (Sandbox Code Playgroud)

postgresql psql

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

对于绝对性能,SUM 更快还是 COUNT?

这与计算符合特定条件的记录数有关,例如invoice amount > $100

我倾向于更喜欢

COUNT(CASE WHEN invoice_amount > 100 THEN 1 END)
Run Code Online (Sandbox Code Playgroud)

然而,这同样有效

SUM(CASE WHEN invoice_amount > 100 THEN 1 ELSE 0 END)
Run Code Online (Sandbox Code Playgroud)

我认为 COUNT 更可取有两个原因:

  1. 传达意图,即 COUNT
  2. COUNT 可能i += 1某处涉及一个简单的操作,而 SUM 不能指望它的表达式是一个简单的整数值。

有没有人有关于特定 RDBMS 差异的具体事实?

mysql postgresql sqlite oracle sql-server

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

Postgres 函数将查询结果分配给多个变量

我需要在 Postgres 函数中为 2 个变量赋值,如下所示。

a := select col1 from tbl where ...
b := select col2 from tbl where ...
Run Code Online (Sandbox Code Playgroud)

如何在一行命令中为 2 个变量分配 2 个值?

喜欢

a,b := select col1,col2 from tbl where ...
Run Code Online (Sandbox Code Playgroud)

postgresql plpgsql functions

36
推荐指数
1
解决办法
7万
查看次数

postgres 查询是否有最大长度限制?

我们正在构建的应用程序可能会执行相当大的插入查询。我的 postgres 查询只能有一定数量的字符是否有限制?

postgresql

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

是否可以限制 Postgres 服务器上的超时?

我在我的应用程序(客户端)中将连接和命令超时设置为 10 分钟。

比我的应用程序运行一个简单的查询: SELECT pg_sleep(65)

在某些服务器上它工作正常,但其他服务器在 60 秒后关闭连接。

这可能是某种限制超时并忽略我的客户端设置的 PostgreSQL 服务器配置吗?

postgresql timeout

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

选择 SQL 文本列时如何换行?

我正在从带有长文本列的表格中进行选择。我想将长行包装到最大行长。

从:

SELECT * FROM test;
test_id |                                  text
--------+-----------------------------------------------------------------------
      1 | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris lorem
Run Code Online (Sandbox Code Playgroud)

到:

test_id |              text
--------+-----------------------------
      1 | Lorem ipsum dolor sit amet,+
        | consectetur adipiscing elit+
        | . Mauris lorem
Run Code Online (Sandbox Code Playgroud)

postgresql psql

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

忽略重复插入的最佳方法?

背景

此问题与使用 PostgreSQL 9.2 或更高版本忽略重复插入有关。我问的原因是因为这段代码:

  -- Ignores duplicates.
  INSERT INTO
    db_table (tbl_column_1, tbl_column_2)
  VALUES (
    SELECT
      unnseted_column,
      param_association
    FROM
      unnest( param_array_ids ) AS unnested_column
  );
Run Code Online (Sandbox Code Playgroud)

代码不受检查现有值的影响。(在这种特殊情况下,用户并不关心插入重复项的错误——插入应该“正常工作”。)在这种情况下添加代码来显式测试重复项会带来复杂性。

问题

在 PostgreSQL 中,我找到了几种忽略重复插入的方法。

忽略重复 #1

创建一个捕获唯一约束违规的事务,不采取任何行动:

  BEGIN
    INSERT INTO db_table (tbl_column) VALUES (v_tbl_column);
  EXCEPTION WHEN unique_violation THEN
    -- Ignore duplicate inserts.
  END;
Run Code Online (Sandbox Code Playgroud)

忽略重复 #2

创建规则以忽略给定表上的重复项:

CREATE OR REPLACE RULE db_table_ignore_duplicate_inserts AS
    ON INSERT TO db_table
   WHERE (EXISTS ( SELECT 1
           FROM db_table
          WHERE db_table.tbl_column = NEW.tbl_column)) DO INSTEAD NOTHING;
Run Code Online (Sandbox Code Playgroud)

问题

我的问题主要是学术性的:

  • 什么方法最有效?
  • 什么方法最容易维护,为什么? …

postgresql constraint insert duplication unique-constraint

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