我有一张表中有一些包含大文本数据的列。 10行(表只有31条记录)的查询时间超过20秒。如果我删除大尺寸的字段,则会快速执行查询。 1行(按id)的查询总是快速执行。
如何更快地查询多行的查询?
查询看起来像这样
SELECT DISTINCT (a.id), a.field_1, a.field_2, a.field_3
, a.field_4, a.field_5, a.filed_6, ...
FROM table_a a, table_b b
WHERE a.field_8 = 'o'
ORDER BY a.field_2 DESC
LIMIT 10;
答案 0 :(得分:1)
@a_horse已经暗示可能的语法错误。尝试:
SELECT DISTINCT ON (a.id) a.id, a.field_1, a.field_2, a.field_3, ... FROM table_a a -- JOIN table_b b ON ??? WHERE a.field_8 = 'o' ORDER BY a.id, a.field_2 DESC LIMIT 10;
请注意大胆的重点并阅读DISTINCT clause in the manual。
此外,field_8
上的索引可能有所帮助
(field_8, id, field_2)
上的multicolumn index可能会提供更多帮助,如果您可以将其缩小到那个(如果这是您想要的排序顺序,我怀疑)。
如果您希望首先按a.field_2 DESC
排序结果:
在PostgreSQL 9.1 中,如果id
是主键:
SELECT a.id, a.field_1, a.field_2, a.field_3, ...
FROM table_a a
-- JOIN table_b b ON ???
WHERE a.field_8 = 'o'
GROUP BY a.id -- primary key takes care of all columns in table a
ORDER BY a.field_2 DESC
LIMIT 10;
答案 1 :(得分:0)
为什么选择table_b?你不加入这张桌子! 像这样做一个真正的联接
SELECT DISTINCT
(a.id), a.field_1, a.field_2, a.field_3, a.field_4, a.field_5, a.filed_6
FROM table_a a
INNER JOIN table_b b
ON b.field_on_table_b = a.field_on_table_a
WHERE a.field_8 = 'o'
ORDER BY a.field_2 DESC LIMIT 10
然后确保使用键定义field_8(在where语句中)!