【发布时间】:2010-03-21 07:46:16
【问题描述】:
有一张桌子:
doc_id(integer)-value(integer)
大约 100.000 doc_id 和 27.000.000 行。
此表上的多数查询 - 搜索与当前文档相似的文档:
select 10 documents with maximum of
(count common to current document value)/(count ov values in document).
现在我们使用 PostgreSQL。表重量(带索引)~1,5 GB。平均查询时间约 0.5 秒 - 这是最高的。而且,在我看来,这一次将随着数据库的增长而呈指数级增长。
我应该将所有这些都转移到 NoSQL 库吗?如果可以,应该怎么做?
查询:
EXPLAIN ANALYZE
SELECT D.doc_id as doc_id,
(count(D.doc_crc32) *1.0 / testing.get_count_by_doc_id(D.doc_id))::real as avg_doc
FROM testing.text_attachment D
WHERE D.doc_id !=29758 -- 29758 - is random id
AND D.doc_crc32 IN (select testing.get_crc32_rows_by_doc_id(29758)) -- get_crc32... is IMMUTABLE
GROUP BY D.doc_id
ORDER BY avg_doc DESC
LIMIT 10
Limit (cost=95.23..95.26 rows=10 width=8) (actual time=1849.601..1849.641 rows=10 loops=1)
-> Sort (cost=95.23..95.28 rows=20 width=8) (actual time=1849.597..1849.609 rows=10 loops=1)
Sort Key: (((((count(d.doc_crc32))::numeric * 1.0) / (testing.get_count_by_doc_id(d.doc_id))::numeric))::real)
Sort Method: top-N heapsort Memory: 25kB
-> HashAggregate (cost=89.30..94.80 rows=20 width=8) (actual time=1211.835..1847.578 rows=876 loops=1)
-> Nested Loop (cost=0.27..89.20 rows=20 width=8) (actual time=7.826..928.234 rows=167771 loops=1)
-> HashAggregate (cost=0.27..0.28 rows=1 width=4) (actual time=7.789..11.141 rows=1863 loops=1)
-> Result (cost=0.00..0.26 rows=1 width=0) (actual time=0.130..4.502 rows=1869 loops=1)
-> Index Scan using crc32_idx on text_attachment d (cost=0.00..88.67 rows=20 width=8) (actual time=0.022..0.236 rows=90 loops=1863)
Index Cond: (d.doc_crc32 = (testing.get_crc32_rows_by_doc_id(29758)))
Filter: (d.doc_id <> 29758)
Total runtime: 1849.753 ms
(12 rows)
【问题讨论】:
-
请编辑描述以解释您所描述的实际问题。理想情况下,目标是什么;在不同系统之间进行选择的标准。
-
关于您的查询,EXPLAIN 有什么要说的?如果没有查询计划,没有人知道您是否可以加快速度。如果 postgresql.conf 中没有正确的索引和设置,数据库必须很慢。如下所述,1.5GB 不用担心,必须非常快。除非你做错事。
-
get_count_by_doc_id这个函数是干什么的?
-
它使用当前 doc_id 计算行数: CREATE OR REPLACE FUNCTION testing.get_count_by_doc_id(integer) RETURNS bigint AS 'SELECT count(doc_id) FROM testing.text_attachment WHERE doc_id = $1' LANGUAGE 'sql' IMMUTABLE;
标签: sql postgresql nosql key-value-store