Java

Derby/SQL - 如何在左連接和檢索 varchar 列時提高性能

  • November 9, 2016

通過反複試驗,我發現如果我進行左連接,例如:

SELECT 
   firsttable.id,
   secondtable.id,
   secondtable.varcharColumn
FROM 
   firsttable
LEFT JOIN 
   secondtable
ON 
   firsttable.id=secondtable.id

對於較大的表,性能很糟糕。***如果我將 secondtable.varcharColumn 作為結果集中的列刪除或更改類型,則性能大約要好一個數量級。***該列是 varchar 255,所以它不應該有太大的區別。如果我將列的類型更改為 integerColumn 或 dateColumn,我也會看到性能上的數量級差異。即使是幾個字元的 varchar 似乎也會導致同樣的性能下降。

請注意,WHERE 子句不是這裡的問題。我省略了它,因為無論是否包含 WHERE 子句,問題都是相同的。**該問題與列中的數據類型有關,而不是與返回的數據量有關。**我也可以使用 LIMIT 1000 並遇到同樣的問題。

索引列將無濟於事,因為該列不用於連接。如果有的話,它也不是 where 子句的一部分。

任何有關如何提高性能的建議將不勝感激!!

缺少 WHERE 子句或 ORDER BY 子句可能意味著您的查詢沒有使用索引(並且肯定會選擇表中的所有行)。

所以,我建議:

  1. 添加“WHERE”子句
  2. 添加“ORDER BY”子句
  3. 確保在兩個表上有適當的索引,用於 WHERE 和 ORDER BY 子句中的 id 和列。
  4. 查看查詢執行計劃以確保使用了您的索引。

檢查您的查詢計劃並查看包含的列是否正在使用索引。

當您使用LEFT JOIN它時(從結果方面)從哪個表開始很重要;所以,也檢查一下。

創建索引secondtable.varcharColumn

這是閱讀更多關於性能的連結:http: //db.apache.org/derby/docs/10.8/tuning/index.html

引用自:https://dba.stackexchange.com/questions/29290