Dbms

先投影再選擇?

  • December 29, 2013

考慮一個簡單的查詢:

Select username,usertype from Table1 Where usertype='Manager'

很可能 DBMS 將首先執行選擇,然後進行投影,即首先從 Table1 中提取具有 usertype=‘Manager’ 的行

是否存在先執行項目,然後以任何方式選擇會更優化或更好的情況?

不適用於面向行的儲存,其中列值每行儲存在一起,這對於從投影開始並不理想。

假設 Table1 有 30 列,但您只需要來自 2(使用者名、使用者類型)的數據。如果使用者名和使用者類型列沒有被索引,DBMS 必須讀取包含所有行的完整表(因此讀取所有列)。在這種情況下,這樣做的唯一順序是選擇,然後是投影。

如果使用者名和使用者類型是複合索引的一部分,則 DBMS 將決定從該索引中獲取數據,而不是讀取整個表本身。索引的列很可能比表少,但它仍然不是您要查找的投影。索引仍然是為面向行的儲存而組織的,首先根據 usertype=‘Manager’ 進行選擇,然後是投影。

但是,還有一些其他 DBMS 使用面向列的儲存。面向列的 DBMS。在這些系統中,整個列一個接一個地儲存,這使得從投影開始非常容易。如果您只需要 30 列中的 2 列,則數據庫可以簡單地讀取那 2 列,然後進行選擇。這種系統在執行低選擇性查詢時表現更好,希望訪問表中的大多數行或所有行. 整體性能取決於工作負載的類型。

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