查询具有大列的表

时间:2012-03-27 14:20:27

标签: sql postgresql

我有一张表中有一些包含大文本数据的列。 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;

2 个答案:

答案 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语句中)!