我有一个带有多列索引的表,我怀疑索引的正确排序以获得最大查询性能。
场景:
PostgreSQL 8.4,大约有一百万行的表
c1列中的值可以有大约100 个不同的值。我们可以假设这些值是均匀分布的,因此每个可能的值大约有 10000 行。
列c2可以有1000 个不同的值。对于每个可能的值,我们有 1000 行。
搜索数据时,条件始终包含这两列的值,因此该表具有组合 c1 和 c2 的多列索引。如果您的查询仅使用一列进行过滤,我已经阅读了正确排序多列索引中的列的重要性。在我们的场景中,情况并非如此。
我的问题是这个:
鉴于其中一个过滤器选择的数据集要小得多,如果第一个索引是最具选择性的索引(允许更小的数据集),我是否可以提高性能?在我看到参考文章中的图形之前,我从未考虑过这个问题:

图片取自有关多列索引的参考文章。
查询使用两列中的值进行过滤。我没有仅使用一列进行过滤的查询。他们都是:WHERE c1=@ParameterA AND c2=@ParameterB。还有这样的条件:WHERE c1 = "abc" AND c2 LIKE "ab%"
在 Postgres 中,准备好的查询和用户定义的函数是否等同于一种防止 SQL 注入的机制?
一种方法比另一种方法有什么特别的优势吗?
postgresql sql-injection prepared-statement plpgsql functions
我正在为索引、主键和外键苦苦挣扎……并且需要拥有所有这些。
如果我有两个表,它们都有一个整数作为主键。
第一个表通过 FK 引用第二个表的主键。
table1.ref_field引用第二个表 ( table2.id)的 PK上创建了 FK 约束table1.ref_field这是组织这些索引、主键和外键的最佳方式吗?
我正在使用 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) 这与计算符合特定条件的记录数有关,例如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 更可取有两个原因:
COUNTCOUNT 可能在i += 1某处涉及一个简单的操作,而 SUM 不能指望它的表达式是一个简单的整数值。有没有人有关于特定 RDBMS 差异的具体事实?
我需要在 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) 我们正在构建的应用程序可能会执行相当大的插入查询。我的 postgres 查询只能有一定数量的字符是否有限制?
我在我的应用程序(客户端)中将连接和命令超时设置为 10 分钟。
比我的应用程序运行一个简单的查询: SELECT pg_sleep(65)
在某些服务器上它工作正常,但其他服务器在 60 秒后关闭连接。
这可能是某种限制超时并忽略我的客户端设置的 PostgreSQL 服务器配置吗?
我正在从带有长文本列的表格中进行选择。我想将长行包装到最大行长。
从:
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 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 中,我找到了几种忽略重复插入的方法。
创建一个捕获唯一约束违规的事务,不采取任何行动:
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)
创建规则以忽略给定表上的重复项:
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 ×10
functions ×2
index ×2
plpgsql ×2
psql ×2
constraint ×1
duplication ×1
foreign-key ×1
index-tuning ×1
insert ×1
mysql ×1
oracle ×1
primary-key ×1
sql-server ×1
sqlite ×1
timeout ×1