小编use*_*188的帖子

优化行排除查询

我正在设计一个大多数只读数据库,其中包含300,000个文档,大约有50,000个不同的标记,每个文档平均有15个标记.目前,我唯一关心的查询是从给定的一组标签中选择没有标签的所有文档.我只对document_id列感兴趣(结果中没有其他列).

我的架构基本上是:

CREATE TABLE documents (
    document_id  SERIAL  PRIMARY KEY,
    title        TEXT
);

CREATE TABLE tags (
    tag_id  SERIAL  PRIMARY KEY,
    name    TEXT    UNIQUE
);

CREATE TABLE documents_tags (
    document_id    INTEGER  REFERENCES documents,
    tag_id         INTEGER  REFERENCES tags,

    PRIMARY KEY (document_id, tag_id)
);
Run Code Online (Sandbox Code Playgroud)

我可以通过预先计算给定标记的文档集来用Python编写此查询,从而将问题简化为一些快速设置操作:

In [17]: %timeit all_docs - (tags_to_docs[12345] | tags_to_docs[7654])
100 loops, best of 3: 13.7 ms per loop
Run Code Online (Sandbox Code Playgroud)

然而,将设置操作转换为Postgres并不是那么快:

stuff=# SELECT document_id AS id FROM documents WHERE document_id NOT IN (
stuff(#     SELECT documents_tags.document_id …
Run Code Online (Sandbox Code Playgroud)

sql postgresql indexing performance postgresql-performance

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