有谁知道在PostgreSQL(9.1)中查询数据库服务器设置是否可行(以及如何,如果是)?
我需要查看max_connections
(最大打开数据库连接数)设置.
关于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
我最近在使用Pyramid和SQLAlchemy进行了大量的研究,而不是在Django中保留当前的应用程序.这本身就是一场辩论,但我不是在讨论这个问题.
我想知道的是,为什么SQLAlchemy普遍被认为比Django ORM更好?几乎每一个(如果不是每一个)我在SQLAlchemy这两个好处之间找到的比较.我认为性能是一个很大的性能,因为SQLAlchemy的结构可以让它更顺利地转换为SQL.
但是,我也听说过,使用更难的任务,Django ORM几乎不可能使用.我想说明这可能是一个多大的问题.我一直在阅读切换到SQLAlchemy的原因之一是当Django ORM不再适合您的需求时.
因此,简而言之,有人可以提供SQLAlchemy可以执行的查询(不一定是实际的SQL语法),但Django ORM不可能在没有添加额外的原始SQL的情况下做到吗?
更新:
自从我第一次问到这个问题以来,我一直注意到这个问题得到了很多关注,所以我想多花两美分.
最后我们最终使用了SQLAlchemy,我必须说我对这个决定感到满意.
我正在重新审视这个问题以提供SQLAlchemy的一个额外功能,到目前为止,我还没有能够在Django ORM中复制.如果有人可以提供一个如何做到这一点的例子,我会很乐意吃掉我的话.
假设您想使用一些postgresql函数,例如similarity(),它提供模糊比较(请参阅:快速查找与PostgreSQL类似的字符串 - tl; dr输入两个字符串获得百分比相似性).
我已经用Django ORM做了一些关于如何做到这一点的搜索,除了使用原始的sql之外什么也没发现,因为他们的文档中似乎很明显:https://docs.djangoproject.com/en/dev/topics/db/sql /.
即
Model.objects.raw('SELECT * FROM app_model ORDER BY \
similarity(name, %s) DESC;', [input_name])
Run Code Online (Sandbox Code Playgroud)
但是,SQLalchemy有func(),如下所述:http://docs.sqlalchemy.org/en/latest/core/sqlelement.html#sqlalchemy.sql.expression.func
from sqlalchemy import desc, func
session.query(Model).order_by(func.similarity(Model.name, input_name))
Run Code Online (Sandbox Code Playgroud)
这允许您为任何已定义的sql/postgresql/etc函数生成sql,而不需要原始sql.
我正在实现一个具有数据类型为的列的表,tsvector
我试图了解哪个索引更适合使用?
GIN还是GiST?
通过这里查看postgres文档,我似乎得到了:
GiST更新和构建索引的速度更快,而且比杜松子酒更准确.
GIN更新和构建索引的速度较慢,但更准确.
好的,那么为什么有人想要杜松子酒的gist索引字段呢?如果要点可能会给你错误的结果?必须有一些优势(外部表现).
当我想要使用GIN和GiST时,有人可以用外行的方式解释吗?
我有一个包含3个字段的postgres表:
我有一个涉及所有这些问题的查询.我想添加一个多列索引来加速它,但我不能因为它们的性质而不能将3个字段放在同一个索引下.
这种情况下的策略是什么?添加3个索引gist,gin和btree以及postgres将在查询期间使用它们吗?
这似乎是一个非常基本的问题,但如何更改pg_trgm扩展名的默认限制?目前是0.3.我已经做好了:
select set_limit(0.5)
select show_limit() => 0.5
Run Code Online (Sandbox Code Playgroud)
关闭连接,重新连接:
select show_limit() => 0.3
Run Code Online (Sandbox Code Playgroud)
谢谢你的帮助.
我可以采取任何其他步骤来加快查询执行速度吗?
\n我有一个超过 100m 行的表,我需要搜索匹配的字符串。为此,我检查了两个选项:
\n@@
(to_tsquery 或 plainto_tsquery)进行比较我发现我可以使用索引来提高性能。\n对于我的 GiST 索引,我尝试siglen
从小数字增加到 2024,但由于某种原因 Postgres 使用512
而不是更高。
CREATE INDEX trgm_idx_512_gg ON table USING GIST (name gist_trgm_ops(siglen=512));\n
Run Code Online (Sandbox Code Playgroud)\n询问:
\nSELECT name, similarity(name, '\xd0\xbd\xd0\xbe\xd1\x83\xd1\x82\xd0\xb1\xd1\x83\xd0\xba MSI GF63 Thin 10SC 086XKR 9S7 16R512 086') as sm\nFROM table\nWHERE name % '\xd0\xbd\xd0\xbe\xd1\x83\xd1\x82\xd0\xb1\xd1\x83\xd0\xba MSI GF63 Thin 10SC 086XKR 9S7 16R512 086' \n
Run Code Online (Sandbox Code Playgroud)\nEXPLAIN
输出:
Bitmap Heap Scan on …
Run Code Online (Sandbox Code Playgroud) 例如,使用SQL我可以做:
SELECT (a+b) as c FROM table WHERE c < 5 AND (c*c+t) > 100;
Run Code Online (Sandbox Code Playgroud)
使用Postgres有什么办法吗?
我有两栏说Main
和Sub
。(它们可以在同一张桌子上,也可以不在同一张桌子上)。
Main
是长度为20 Sub
的varchar,长度为8的varchar。始终
Sub
是的子集,并且是的后8个字符。Main
Main
我可以成功设计一个查询来匹配使用模式 substr("Main",13,8)
查询:
select * from "MainTable"
where substr("MainColumn",13,8) LIKE (
select "SubColumn" From "SubTable" Where "SubId"=1043);
Run Code Online (Sandbox Code Playgroud)
但我想在查询中使用Like,%,_等,以便可以轻松地匹配模式(不是全部8个字符)。
问题是我该怎么做?!
我知道下面的查询是完全错误的,但是我想实现这样的目标,
Select * from "MainTable"
Where "MainColumn" Like '%' Select "SubColumn" From "SubTable" Where "SubId"=2'
Run Code Online (Sandbox Code Playgroud) postgres trigram 文档指出:
pg_trgm 模块提供 GiST 和 GIN 索引运算符类,允许您在文本列上创建索引,以实现非常快速的相似性搜索。这些索引类型支持上述相似性运算符,并且还支持 LIKE、ILIKE、~ 和 ~* 查询的基于三元组的索引搜索。
并显示以下示例:
SELECT t, word_similarity('word', t) AS sml
FROM test_trgm
WHERE 'word' <% t
ORDER BY sml DESC, t;
Run Code Online (Sandbox Code Playgroud)
惊人的!
但是,当运行以下查询时:
SELECT *
FROM place
WHERE word_similarity(place.name, '__SOME_STRING__') > 0.5
Run Code Online (Sandbox Code Playgroud)
创建的索引未被使用。
然而,当使用ILIKE
or%>
运算符时,看起来确实正在使用索引。为什么函数上不使用索引word_similarity
?
我有一张带有句子标题的图像表。给定一个新句子,我想根据新句子与存储的旧句子的接近程度,找到与之最匹配的图像。
我知道我可以将@@
运算符与a一起使用,to_tsquery
但tsquery
可以接受特定单词作为查询。
一个问题是我不知道如何将给定的句子转换为有意义的查询。该句子可能带有标点符号和数字。
但是,我也觉得我需要某种余弦相似性,但我不知道如何从PostgresQL中获得它。我正在使用最新的GA版本,如果可以解决我的问题,很高兴使用开发版本。
用户可以键入名称,系统应与文本匹配,即使用户输入或数据库字段包含重音(UTF-8)字符也是如此.这是使用该pg_trgm
模块.
代码类似于以下内容:
SELECT
t.label
FROM
the_table t
WHERE
label % 'fil'
ORDER BY
similarity( t.label, 'fil' ) DESC
Run Code Online (Sandbox Code Playgroud)
当用户键入时fil
,查询匹配filbert
但不匹配filé powder
.(因为重音字符?)
我试图实现一个unaccent函数并将查询重写为:
SELECT
t.label
FROM
the_table t
WHERE
unaccent( label ) % unaccent( 'fil' )
ORDER BY
similarity( unaccent( t.label ), unaccent( 'fil' ) ) DESC
Run Code Online (Sandbox Code Playgroud)
这只返回filbert
.
建议:
CREATE EXTENSION pg_trgm;
CREATE EXTENSION unaccent;
CREATE OR REPLACE FUNCTION unaccent_text(text)
RETURNS text AS
$BODY$
SELECT unaccent($1); …
Run Code Online (Sandbox Code Playgroud) postgresql ×11
indexing ×4
sql ×2
django-orm ×1
pg-trgm ×1
plpgsql ×1
postgis ×1
python ×1
settings ×1
similarity ×1
sql-like ×1
sqlalchemy ×1
tf-idf ×1
trigram ×1
utf-8 ×1