谁能解释一下 LIKE 运算符是如何在当前数据库系统(例如 MySQL 或 Postgres)中实现的?或者指出一些解释它的参考资料?
天真的方法是检查每条记录,在感兴趣的字段上执行正则表达式或部分字符串匹配,但我有一种感觉(希望)这些系统做一些更聪明的事情。
mysql postgresql performance full-text-search pattern-matching
我有这个 SQL:
CREATE TABLE test(id SERIAL PRIMARY KEY, data JSONB);
INSERT INTO test(data) VALUES
('{"parent":null,"children":[2,3]}'),
('{"parent":1, "children":[4,5]}'),
('{"parent":1, "children":[]}'),
('{"parent":2, "children":[]}'),
('{"parent":2, "children":[]}');
Run Code Online (Sandbox Code Playgroud)
那会给:
id | data
----+--------------------------------------
1 | {"parent": null, "children": [2, 3]}
2 | {"parent": 1, "children": [4, 5]}
3 | {"parent": 1, "children": []}
4 | {"parent": 2, "children": []}
5 | {"parent": 2, "children": []}
Run Code Online (Sandbox Code Playgroud)
当进行正常的一对多时,它会显示如下内容:
SELECT *
FROM test x1
LEFT JOIN test x2
ON x1.id = (x2.data->>'parent')::INT;
id | data | id | …Run Code Online (Sandbox Code Playgroud) 我有一个系统,我无法控制某些表的设计(通过 Slony-I 复制),所以我有一系列我们称之为“影子表”的东西,我从复制的表中提取一些信息,并将其存储在我需要的处理形式中,同时剥离我想忽略的记录。
现在,在设置新副本后,我运行更新并将值设置回自身(例如,UPDATE tablename SET field=field)以强制运行触发器,但有些表有数百万条记录,并且还在增长,可能需要 30 分钟. (然后还有真空)。
有没有更好的方法来触发它,或者有什么方法可以编写一个函数,使其可以处理传入的输入或NEW取决于调用上下文?我不愿意保留两个不同的功能,因为我已经看到太多次更新一个而不是另一个。
它使用的时候可能pgadmin还是plsql获得查询计划的搁置了内部执行SQL语句ü SER d efined ˚F油膏(UDF)使用EXPLAIN。那么我如何掌握 UDF 的特定调用的查询计划呢?我看到 UDF 抽象为F()pgadmin 中的单个操作。
我查看了文档,但找不到任何内容。
目前我正在提取语句并手动运行它们。但这不会减少大型查询。
例如,考虑下面的 UDF。这个 UDF,即使它能够打印出它的查询字符串,也不能使用复制粘贴,因为它有一个本地创建的临时表,当你粘贴和执行它时它不存在。
CREATE OR REPLACE FUNCTION get_paginated_search_results(
forum_id_ INTEGER,
query_ CHARACTER VARYING,
from_date_ TIMESTAMP WITHOUT TIME ZONE DEFAULT NULL,
to_date_ TIMESTAMP WITHOUT TIME ZONE DEFAULT NULL,
in_categories_ INTEGER[] DEFAULT '{}')
RETURNS SETOF post_result_entry AS $$
DECLARE
join_string CHARACTER VARYING := ' ';
from_where_date CHARACTER VARYING := ' ';
to_where_date CHARACTER VARYING := ' ';
query_string_ CHARACTER VARYING …Run Code Online (Sandbox Code Playgroud) 我在 PostgreSQL 中创建了一些新的 UDT。但是,现在我有两个问题:
不幸的是,我在 PostgreSQL 文档中找不到任何相关内容。
今天七周内的七个数据库向我介绍了每个操作员的索引。
您可以通过创建
text_pattern_ops运算符类索引来为匹配先前查询的模式索引字符串,只要值以小写形式索引即可。
CREATE INDEX moves_title_pattern ON movies (
(lower(title) text_pattern_ops);
Run Code Online (Sandbox Code Playgroud)
我们使用 是
text_pattern_ops因为标题是文本类型。如果需要指数VARCHAR处理,字符,或名称,使用相关的OPS: ,varchar_pattern_ops,bpchar_pattern_ops和name_pattern_ops。
我觉得这个例子真的很混乱。为什么这样做有用?
如果该列是文本类型,那么在用作搜索值之前,其他类型(varchar、char、name)不会被强制转换为文本吗?
该索引的行为与使用默认运算符的索引有何不同?
CREATE INDEX moves_title_pattern ON movies (lower(title));
Run Code Online (Sandbox Code Playgroud) 我有一个表,persons它包含两列,一个id和一个基于 JSONB 的data列(这个表只是为了演示目的而制作的,以使用 PostgreSQL 的 JSON 支持)。
现在,假设它包含两条记录:
1, { name: 'John', age: 30 }
2, { name: 'Jane', age: 20 }
Run Code Online (Sandbox Code Playgroud)
现在,假设我想得到每个 25 岁以上的人的名字。我尝试过的是:
select data->'name' as name from persons where data->'age' > 25
Run Code Online (Sandbox Code Playgroud)
不幸的是,这会导致错误。我可以通过使用->>代替来解决它->,但是比较不再按预期工作,因为不是比较数字,而是比较它们作为字符串的表示:
select data->'name' as name from persons where data->>'age' > '25'
Run Code Online (Sandbox Code Playgroud)
然后我发现我实际上可以通过使用->和强制转换来解决这个问题int:
select data->'name' as name from persons where cast(data->'age' as int) > 25
Run Code Online (Sandbox Code Playgroud)
这有效,但我必须知道实际类型并不是那么好(ageJSON 文档中的类型是number无论如何,那么为什么 PostgreSQL …
我在 PostgreSQL 9.3 数据库中有两个表: Tablelink_reply有一个which_group指向 table的外键link_group。
我想删除link_group不link_reply存在相关行的所有行。听起来很基本,但我一直在努力。
会不会像这样简单(不工作)?
DELETE FROM link_group WHERE link_reply = NULL;
Run Code Online (Sandbox Code Playgroud) 在 PostgreSQL 文档中,据说整数数据类型可以存储在两字节、四字节或八字节的空间中。我的数据库中表的一列包含一个一字节整数值,我希望它以一字节数据类型存储。
我在 psql 中运行了以下 SQL:
CREATE USER bspu LOGIN;
CREATE DATABASE bsp OWNER bspu;
GRANT ALL PRIVILEGES ON DATABASE bsp TO bspu;
\c bsp
CREATE TABLE users (
id SERIAL PRIMARY KEY,
client_id VARCHAR(20) NOT NULL,
api_key VARCHAR(100) NOT NULL,
api_secret VARCHAR(100) NOT NULL,
auth_token VARCHAR(128) NOT NULL
);
Run Code Online (Sandbox Code Playgroud)
当我以 身份登录bspu并尝试查询users表时,出现错误:
Run Code Online (Sandbox Code Playgroud)permission denied for relation users
我尝试运行:
ALTER DEFAULT PRIVILEGES GRANT ALL ON TABLES TO bspu;
Run Code Online (Sandbox Code Playgroud)
但它没有帮助。我究竟做错了什么?为什么数据库所有者没有权限查询自己的数据库?
编辑:我bspu现在升级为超级用户,所以我可以继续工作。任何进一步的指导表示赞赏。