我执行分页和,让我们说,行的排序products表,使用上多列索引category,score和id。
-- 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) 我对数据库设计和开发相当陌生。我的要求是基于时间和单词语言(特定日期的语言)进行简单的钻取/切片。但是,我的数据库是 mysql。但到目前为止,我还没有运行这些查询的运气,所以我手动计算这些数据并存储在表中。
为了更具体地说明我的应用程序,我需要在 iPhone 上显示图表/图形。因此,用户每天/每周/每月使用每种语言的单词。我不需要实时,但用户使用一个月的行数约为 5000。
我想了解 mysql 是否有可能拥有仓库模式并在没有性能问题的情况下执行此类查询。我的选择是什么。
我真的无法支付企业解决方案的费用,我准备在我的应用程序(我有)中为这种处理编写代码,但想迁移到正确的方式。
我想对我来说最理想的情况是不使用任何工具就可以在我当前的数据库中创建事实和维度,然后转移我的 api 来运行这些 olap 查询。从我收集的信息来看,这对于 mysql 是不可能的。Postgres 显示出一些希望,但仍在阅读。
根据 PGSQL 9.3 文档:
因为这并不总是需要,而且有很多关于如何索引的选择,外键约束的声明不会自动在引用列上创建索引。
然而,在我创建了这样一个约束之后,当我运行时,\d <table>我看到索引确实被创建了:
Indexes:
"table_primary_key" PRIMARY KEY, btree (id)
"fki_table_product_foreign_key" btree (product)
什么可以解释为什么会创建这个?我是否仍然需要在我的产品列上创建另一个索引来提高对它的查询性能?
在 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?我并不特别关心我是否将其定义为 aTABLE或SETOF …
我正在从 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”类型是否已定义且正确。
什么可能导致此警告?
我在 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) 我们有一个网络应用程序,可以检测数据库是否不存在并创建它。用户喜欢它,但我的想法是这样的用户拥有太多的权限。
我最好建议更改应用程序的数据库创建屏幕以提供 2 组凭据 - 一组将用于最初创建数据库而不是永久存储(例如“postgres”角色),另一组将被网络使用app 并存储在配置文件中(例如“webapp”)。此外,'webapp' 将需要能够 1) 添加新的和 2) 修改现有的表、过程和函数(Web 应用程序根据需要自动更新架构)
所以我的一些问题是:
这个答案向我提出了如何在这样的函数之间VALUES和SELECT中进行选择的问题。在 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
在 SQL 中,如果我想要查询的所有内容(在 where 条件中)是字段不为空时,是否所有关于索引的常见考虑都适用?
我可以应用索引的特殊配置来涵盖这种特定情况吗?
例如:
select id
from Accesses
where token is not null;
Run Code Online (Sandbox Code Playgroud)
token如果我必须搜索特定的令牌值,是否值得尽可能多地添加索引?
我的数据库是 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)