小编Fak*_*ame的帖子

postgres 中的快速汉明距离查询

我有一个包含图像感知哈希的大型数据库(1600 万行)。

我希望能够在合理的时间范围内通过汉明距离搜索行。

目前,就我正确理解这个问题而言,我认为这里最好的选择是实现BK-Tree的自定义 SP-GiST 实现,但这似乎需要做很多工作,而且我对实际操作仍然很模糊正确实施自定义索引的详细信息。计算汉明距离很容易处理,不过我确实知道 C。

基本上,这里合适的方法是什么?我需要能够在哈希的特定编辑距离内查询匹配项。据我了解,等长字符串的 Levenshtein 距离在功能上是汉明距离,所以至少有一些现有的支持我想要的东西,虽然没有明确的方法从中创建索引(请记住,我正在查询的值变化。我无法预先计算与固定值的距离,因为那只会对那个值有用)。

散列当前存储为包含散列的二进制 ASCII 编码的 64 字符字符串(例如“10010101...”),但我可以很容易地将它们转换为 int64。真正的问题是我需要能够相对快速地进行查询。

看起来这可能是可能实现沿着什么,我想用线的东西pg_trgm,但我对如何卦匹配mechamism作品有点不清楚(特别是,什么是相似性量度它返回实际上代表什么?它看起来有点像编辑距离)。

插入性能并不重要(计算每一行的哈希值在计算上非常昂贵),所以我主要关心搜索。

postgresql index postgresql-9.3

19
推荐指数
2
解决办法
6745
查看次数

PostgreSQL 中的事务是通过`psycopg2` per-cursor 还是 per-connection 进行的?

我正在使用psycopg2数据库 API对 PostgreSQL 9.3 进行一些工作。

我将 DB API 设置为最低隔离级别(“自动提交”模式),并直接通过 SQL 管理我自己的事务。例子:

cur = self.conn.cursor()
cur.execute("BEGIN;")
cur.execute("SELECT dbId, downloadPath, fileName, tags FROM {tableName} WHERE dlState=%s".format(tableName=self.tableName), (2, ))
ret = cur.fetchall()
cur.execute("COMMIT;")
Run Code Online (Sandbox Code Playgroud)

基本上,事务是由cur.execute("BEGIN;")仅限于该游标启动的,还是针对整个连接(self.conn.cursor())?

我正在做的一些更复杂的事情涉及多个单独的数据库操作,我在逻辑上将它们分解为函数。由于这一切都在一个将连接作为成员的类中,因此在每个函数中创建游标要方便得多。但是,我不确定事务中创建游标是如何工作的。

基本上,如果事务是按连接进行的,我可以在事务中即时创建大量游标。如果它们是每个光标,那意味着我必须到处传递光标。是哪个?

文档没有涉及这一点,尽管您可以调用这一事实connection.commit()使我相当确信事务控制是针对每个连接的。

postgresql

11
推荐指数
1
解决办法
9228
查看次数

GROUP BY 一列,同时在 PostgreSQL 中按另一列排序

我怎么能在GROUP BY一个列中排序,而按另一列排序。

我正在尝试执行以下操作:

SELECT dbId,retreivalTime 
    FROM FileItems 
    WHERE sourceSite='something' 
    GROUP BY seriesName 
    ORDER BY retreivalTime DESC 
    LIMIT 100 
    OFFSET 0;
Run Code Online (Sandbox Code Playgroud)

我要选择的最后一个从FileItems / N /项,按降序排列,与过滤行DISTINCT的值seriesName。上面的查询出错了ERROR: column "fileitems.dbid" must appear in the GROUP BY clause or be used in an aggregate function。我需要该dbid值以便然后获取此查询的输出,并将JOIN其放在源表上以获取我所在的其余列。

请注意,这基本上是以下问题的格式塔,为了清楚起见,删除了许多无关的细节。


原始问题

我有一个要从 sqlite3 迁移到 PostgreSQL 的系统,因为我已经在很大程度上超出了 sqlite:

    SELECT
            d.dbId,
            d.dlState,
            d.sourceSite,
        [snip a bunch of rows]
            d.note

    FROM FileItems AS d
        JOIN
            ( …
Run Code Online (Sandbox Code Playgroud)

postgresql performance postgresql-9.3 greatest-n-per-group query-performance

9
推荐指数
2
解决办法
3万
查看次数

提高 sqlite3 中的`GROUP BY` 查询性能

我有一个使用 sqlite3 作为数据库的小网络应用程序(数据库相当小)。

现在,我正在使用以下查询生成一些要显示的内容:

SELECT dbId,
        dlState,
        retreivalTime,
        seriesName,
        <snip irrelevant columns>
        FROM DataItems
        GROUP BY seriesName
        ORDER BY retreivalTime DESC
        LIMIT ?
        OFFSET ?;
Run Code Online (Sandbox Code Playgroud)

其中limit通常为 ~200,并且offset为 0(它们驱动分页机制)。

无论如何,现在,这个查询完全扼杀了我的表现。在具有约 67K 行的表上执行大约需要 800 毫秒。

我在seriesName和上都有索引retreivalTime

sqlite> SELECT name FROM sqlite_master WHERE type='index' ORDER BY name;
<snip irrelevant indexes>
DataItems_seriesName_index
DataItems_time_index           // This is the index on retreivalTime. Yeah, it's poorly named
Run Code Online (Sandbox Code Playgroud)

但是,EXPLAIN QUERY PLAN似乎表明它们没有被使用:

sqlite> EXPLAIN QUERY PLAN SELECT dbId, 
                                  dlState, …
Run Code Online (Sandbox Code Playgroud)

sqlite performance optimization query-performance

7
推荐指数
2
解决办法
8600
查看次数

如何将值传递给不是列的 ON CONFLICT 子句?

基本上,我试图在 postgresql 中的单个命令中进行多次插入,其中我ON CONFLICT有一个 per-insert 参数。

这是查询(格式为psycopg2):

INSERT INTO
    web_pages
    (url, starturl, netloc, distance, is_text, 
     priority, type, addtime, state)
VALUES
    (%(url)s, %(starturl)s, %(netloc)s, %(distance)s, %(is_text)s, 
      %(priority)s, %(type)s, %(addtime)s, %(state)s)
ON CONFLICT (url) DO
    UPDATE
        SET
            state           = EXCLUDED.state,
            starturl        = EXCLUDED.starturl,
            netloc          = EXCLUDED.netloc,
            is_text         = EXCLUDED.is_text,
            distance        = LEAST(EXCLUDED.distance, web_pages.distance),
            priority        = GREATEST(EXCLUDED.priority, web_pages.priority),
            addtime         = LEAST(EXCLUDED.addtime, web_pages.addtime)
        WHERE
        (
                web_pages.ignoreuntiltime < %(ignoreuntiltime)s
            AND
                web_pages.url = EXCLUDED.url
            AND
                (web_pages.state = 'complete' OR web_pages.state = 'error') …
Run Code Online (Sandbox Code Playgroud)

postgresql upsert postgresql-9.6

6
推荐指数
1
解决办法
5697
查看次数

Postgresql 无法使用我的覆盖索引并退回到更慢的位图扫描

我试图弄清楚为什么我的表在索引扫描速度非常快时使用位图堆扫描。

桌子:

webarchive=# \d web_pages
                                               Table "public.web_pages"
      Column       |            Type             |                              Modifiers
-------------------+-----------------------------+---------------------------------------------------------------------
 id                | bigint                      | not null default nextval('web_pages_id_seq'::regclass)
 state             | dlstate_enum                | not null
 errno             | integer                     |
 url               | text                        | not null
 starturl          | text                        | not null
 netloc            | text                        | not null
 file              | bigint                      |
 priority          | integer                     | not null
 distance          | integer                     | not null
 is_text           | boolean                     |
 limit_netloc      | boolean                     |
 title             | citext                      |
 mimetype          | text …
Run Code Online (Sandbox Code Playgroud)

postgresql performance postgresql-9.6 postgresql-performance

6
推荐指数
1
解决办法
283
查看次数

如何正确实现复合最大 n 过滤

是的,每组最多的问题。

给定一个releases包含以下列的表:

 id         | primary key                 | 
 volume     | double precision            |
 chapter    | double precision            |
 series     | integer-foreign-key         |
 include    | boolean                     | not null
Run Code Online (Sandbox Code Playgroud)

我想选择音量的复合最大值,然后是一组系列的章节。

现在,如果我查询 per-distinct-series,我可以按如下方式轻松完成此操作:

SELECT 
       releases.chapter AS releases_chapter,
       releases.include AS releases_include,
       releases.series AS releases_series
FROM releases
WHERE releases.series = 741
  AND releases.include = TRUE
ORDER BY releases.volume DESC NULLS LAST, releases.chapter DESC NULLS LAST LIMIT 1;
Run Code Online (Sandbox Code Playgroud)

但是,如果我有大量series(我确实有),这很快就会遇到效率问题,我要发出 100 多个查询来生成单个页面。

喜欢滚整个事情到一个查询,在那里我可以简单地说WHERE releases.series IN (1,2,3....),但我还没有想出如何说服Postgres的,让我这样做。

天真的方法是:

SELECT releases.volume …
Run Code Online (Sandbox Code Playgroud)

postgresql performance greatest-n-per-group postgresql-performance

5
推荐指数
1
解决办法
84
查看次数

删除在 Psycopg2 中什么都不返回?

我在 PostgreSQL 数据库中有一个相当简单的删除查询,我通过psycopg2.

以以下最小示例为例:

def testDelete():
    db = DbInterface()
    cur = db.conn.cursor()
    cur.execute("DELETE FROM munamelist WHERE name='something'")
    print("Results = ", cur.fetchall())
Run Code Online (Sandbox Code Playgroud)

基本上,PostgreSQL 的文档DELETE说明:

成功完成后,DELETE 命令返回一个命令标签的形式

DELETE count

计数是删除的行数。请注意,当删除被 BEFORE DELETE 触发器抑制时,该数字可能小于与条件匹配的行数。如果 count 为 0,则查询未删除任何行(这不被视为错误)。

但是,psycopg2当您尝试获取查询结果时会引发错误:

Traceback (most recent call last):
  File "autoOrganize.py", line 370, in <module>
    parseCommandLine()
  File "autoOrganize.py", line 363, in parseCommandLine
    testDelete()
  File "autoOrganize.py", line 247, in testDelete
    print("Results = ", cur.fetchall())
psycopg2.ProgrammingError: no results to fetch
Run Code Online (Sandbox Code Playgroud)

该项目是否存在并不重要,您无法获取查询结果。不psycopg2为 SQL …

postgresql postgresql-9.3

3
推荐指数
1
解决办法
8858
查看次数

`ON CONFLICT DO UPDATE` 导致死锁?

我有一个项目,我试图在其中使用 PostgreSQLON CONFLICT DO UPDATE子句,但我遇到了大量死锁问题。

我的架构如下:

webarchive=# \d web_pages
                                               Table "public.web_pages"
      Column       |            Type             |                              Modifiers
-------------------+-----------------------------+---------------------------------------------------------------------
 id                | integer                     | not null default nextval('web_pages_id_seq'::regclass)
 state             | dlstate_enum                | not null
 errno             | integer                     |
 url               | text                        | not null
 starturl          | text                        | not null
 netloc            | text                        | not null
 file              | integer                     |
 priority          | integer                     | not null
 distance          | integer                     | not null
 is_text           | boolean                     |
 limit_netloc      | boolean                     |
 title …
Run Code Online (Sandbox Code Playgroud)

deadlock locking postgresql-9.5

1
推荐指数
1
解决办法
5472
查看次数