2012-06-25 50 views
1

我在面試中被問及如何花費大量時間來執行時可以用來優化查詢Select * from TableA的方法。 (TableA)可以是任何具有大量數據的表。面試官沒有給我任何選擇,例如選擇幾欄或使用「WHERE」條款,而是他希望我爲主題查詢提供解決方案。優化查詢「從表格A中選擇*」

+2

你有沒有想過面試官說什麼? –

+3

索引,過濾器和鍵哦,我的! – Limey

+0

在某些時候,我想可能是他嘲笑我,我無法得出任何解決方案,這就是爲什麼我在這裏。 –

回答

10

真的很難知道面試官在找什麼。

他們有可能在相對缺乏經驗和預期的一樣的答案:

  • !「列表中的所有列,而不是*,因爲這是更快的方式」;或者,
  • 「添加一個ORDER BY,因爲這會始終加快速度!」

的各種事情有經驗的人可能會尋找有:

  • 檢查查詢計劃,是否有采取額外的資源,計算列或其他類似的東西?
  • 重新審視需求 - 用戶是否真的需要整個表以任意順序?
  • 表上是否有聚集索引;如果沒有,是堆滿轉發指針的堆?
  • 基礎表(和/或用於滿足查詢的索引)是否存在過多的碎片?
  • 是查詢被阻止?
  • 查詢在等什麼?
  • 是等待外部資源(例如蹩腳的I/O子系統,內存授予,tempdb自動增長)的查詢?
  • 是查詢並行和痛苦的數據包等待,因爲統計過時了嗎?

有很多的潛在的東西,可能使該查詢慢,可能使該查詢一個不錯的選擇。

+0

謝謝Aaron,您提供了關於該問題的更深入的見解。問題似乎是不恰當的,因爲存在潛在的機制,正如您所強調的那樣,這可能會使查詢運行緩慢。 –

0

實際上,一些數據庫將優化命令,重建數據庫表以減少碎片 - 這種方式實際上可以提高此類查詢的性能。

PostgreSQL和SQLite的有命令

VACUUM; 

MySQL和Oracle有一個命令

OPTIMIZE TABLE table; 

它是昂貴的,因爲它會圍繞着大量的數據移動。但是這樣做會使頁面更加平衡,並且這種方式通常會縮小整個數據庫的大小(但有些數據庫可能決定在此時添加索引,因此它也可能會增長)。

由於數據存儲在頁面中,通過重建數據庫來減少頁面數量,即使對於SELECT * FROM table;語句,也可以提高性能。