2012-03-27 35 views
0

我有一張表格,其中有大量文本數據的列。 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; 
+1

'DISTINCT'是** **沒有的功能。您正在使用的語法不會在ID列上顯示,而是顯示在所有列上! – 2012-03-27 14:22:21

+0

@a_horse_with_no_name,是的,你是對的!現在它更快,但不是我們想要的那麼快。也許還有別的東西? – 2012-03-27 14:57:21

+0

沒有查詢計劃的性能分析主要是猜測,請在糾正DISTINCT ON後在查詢上張貼EXPLAIN ANALYZE的輸出 – dbenhur 2012-03-27 17:00:02

回答

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; 
+0

是的,我已經用'DISTINCT'研究了這個問題。當我使用'GROUP BY a.id'時,postgres想要的是,我使用了表中的所有列。 – 2012-03-27 15:45:30

+0

正如我所提到的,這適用於版本9.1(或更高版本),其中主鍵涵蓋整個表格。你忽略了提到你的PostgreSQL版本,這很難提供幫助。對於早期版本,重複GROUP BY子句中'SELECT'列表的所有非聚合列或在子查詢中使用'DISTINCT ON(id)',並在外部查詢中應用'ORDER BY/LIMIT'。 – 2012-03-27 19:35:04

0

你爲什麼選擇表-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(在這裏聲明)與關鍵字定義!