关于LIKE查询数据库中特定表的响应时间,我看到了相当大的变化.有时我会在200-400毫秒内得到结果(非常可接受),但有时候返回结果可能需要30秒.
我知道LIKE查询是非常耗费资源的,但我只是不明白为什么响应时间会有这么大的差异.我已经在该owner1字段上构建了一个btree索引,但我认为这对LIKE查询没有帮助.有人有主意吗?
示例SQL:
SELECT gid, owner1 FORM parcels
WHERE owner1 ILIKE '%someones name%' LIMIT 10
Run Code Online (Sandbox Code Playgroud)
我也尝试过:
SELECT gid, owner1 FROM parcels
WHERE lower(owner1) LIKE lower('%someones name%') LIMIT 10
Run Code Online (Sandbox Code Playgroud)
和:
SELECT gid, owner1 FROM parcels
WHERE lower(owner1) LIKE lower('someones name%') LIMIT 10
Run Code Online (Sandbox Code Playgroud)
有类似的结果.
表行数:约95,000.
postgresql indexing query-optimization pattern-matching sql-like
在Microsoft SQL Server中,可以指定"重音不敏感"排序规则(对于数据库,表或列),这意味着可以进行类似的查询
SELECT * FROM users WHERE name LIKE 'João'
Run Code Online (Sandbox Code Playgroud)
找到一个带有Joao名字的行.
我知道可以使用unaccent_string contrib函数从PostgreSQL中删除字符串中的重音符号,但我想知道PostgreSQL是否支持这些"重音不敏感"排序规则,以便SELECT上述方法可行.
为了获得最佳的优化结果,您应该使用对其有效的最严格的波动率类别标记您的函数.
但是,我似乎有一个例子,并非如此,我想了解发生了什么.(背景:我正在运行postgres 9.2)
我经常需要将表示为整数秒的时间转换为日期.我写了一个函数来做到这一点:
CREATE OR REPLACE FUNCTION
to_datestamp(time_int double precision) RETURNS date AS $$
SELECT date_trunc('day', to_timestamp($1))::date;
$$ LANGUAGE SQL;
Run Code Online (Sandbox Code Playgroud)
让我们将性能与其他相同的函数进行比较,将波动率设置为IMMUTABLE和STABLE:
CREATE OR REPLACE FUNCTION
to_datestamp_immutable(time_int double precision) RETURNS date AS $$
SELECT date_trunc('day', to_timestamp($1))::date;
$$ LANGUAGE SQL IMMUTABLE;
Run Code Online (Sandbox Code Playgroud)
CREATE OR REPLACE FUNCTION
to_datestamp_stable(time_int double precision) RETURNS date AS $$
SELECT date_trunc('day', to_timestamp($1))::date;
$$ LANGUAGE SQL STABLE;
Run Code Online (Sandbox Code Playgroud)
为了测试这个,我将创建一个10 ^ 6个随机整数的表,对应于2010-01-01和2015-01-01之间的时间
CREATE TEMPORARY TABLE random_times AS
SELECT 1262304000 + round(random() * 157766400) AS time_int
FROM generate_series(1, 1000000) …Run Code Online (Sandbox Code Playgroud) 这篇博文展示了如何immutable_concat在 Pg 中创建函数的示例:
CREATE OR REPLACE FUNCTION immutable_concat(VARIADIC "any")
RETURNS text AS 'text_concat'
LANGUAGE internal IMMUTABLE
Run Code Online (Sandbox Code Playgroud)
我想做同样的事情concat_ws并且相应的text_concat_ws确实存在,但是,以下只会使过程崩溃:
CREATE OR REPLACE FUNCTION immutable_concat_ws(VARIADIC "any")
RETURNS text AS 'text_concat_ws'
LANGUAGE internal IMMUTABLE
Run Code Online (Sandbox Code Playgroud)
更新: 的 siguatureimmutable_concat_ws应该是(glue, *parts),一个胶水(text 或 varchar)和一个或多个部分(text、varchar 或 null)。
我在这里缺少什么?
编号 | 名称 | IP地址
---+----------+-------------------------
1 | 测试名称 | {192.168.1.60,192.168.1.65}
我想ipAddress用 进行搜索LIKE。我试过:
{'$mac_ip_addresses.ip_address$': { [OP.contains]: [searchItem]}},
Run Code Online (Sandbox Code Playgroud)
这也:
{'$mac_ip_addresses.ip_address$': { [OP.Like] : { [OP.any]: [searchItem]}}},
Run Code Online (Sandbox Code Playgroud)
的数据类型ipAddress是text[]. 我想用 进行ipAddress搜索LIKE。
searchItem包含需要在ipAddress字段中搜索的 IP,因此我想在数组中搜索LIKE.
arrays postgresql database-design string-matching sequelize.js
postgresql ×5
indexing ×2
arrays ×1
concat ×1
concat-ws ×1
function ×1
localization ×1
performance ×1
sequelize.js ×1
sql ×1
sql-like ×1