Optimization

為什麼向量化可以減少虛函式的使用?

  • December 26, 2018

矢量化查詢對於獲得高性能的分析系統非常有幫助。

我知道向量化可以對值塊(SIMD 指令)執行所有操作,而不是一次解釋查詢表達式元組。

但是我怎麼能理解,向量化可以減少虛函式的成本呢?


當我讀到慕尼黑工業大學的一篇論文時,我想到了這個問題:

數據塊:混合 OLTP 和 OLAP 在使用矢量化和編譯的壓縮儲存上

查詢評估效率的飛躍通常是通過使用向量化執行來實現的,其中所有操作都在值塊上執行,而不是一次解釋查詢表達式元組。其效果是減少了解釋成本,因為實現逐塊操作的虛擬函式在每個函式呼叫處理數千個元組,並且這些函式實現內部的塊循環受益於許多循環驅動的編譯器優化,包括自動生成 SIMD 指令。

這種公式也可以在其他 DBMS 論文中找到,因為矢量化是一種流行的方式。

這個問題與一般 DBMS 相關,TUM 的論文與 相關HyPer,這是一個不太“有名”的 DBMS。我很高興收到任何類型的例子和解釋。如果我的表述有誤,請隨時編輯。

瀏覽論文,聽起來答案很簡單:

  • 對於“基於行的”(非矢量化)操作,用於處理查詢結果的(虛擬)函式必須每行呼叫一次。
  • 對於“基於批處理的”(矢量化)操作,(虛擬)函式每批處理呼叫一次,然後可以在虛擬函式實現中執行優化循環(通過減少呼叫這些函式的次數來減少虛擬函式成本)

您提到的報價中大部分都涵蓋了

…實現逐塊操作的虛擬函式在每個函式呼叫中處理數千個元組…

呼叫一次函式來處理數千行,比呼叫函式數千次(每行一次)要便宜得多。

在任何程序中,呼叫函式都有成本,尤其是虛函式(在查找表中查找實際函式實現的地址,錯過某些編譯時優化,因為實際實現函式直到執行時才知道,等等 - 請參閱在 C++ 中,虛函式為什麼以及如何變慢?有關虛函式成本的更多討論)。

查看 SQL Server 的基於批處理的查詢處理的實現(我意識到這篇論文是關於 HyPer,但一般原則是成立的),您可以找到其他資源,討論在 CPU 方面的每行與每批成本節省。考慮這篇文章:

列儲存索引性能:BatchMode 執行

它比較基於行的處理:

  1. 查詢以 ROW 模式執行。謂詞應用於 3580 行,一次一行,得到 1200 行
  2. …實際的 CPU 成本是 15 毫秒…

要基於批處理:

  1. 查詢(特別是 SCAN 運算符)在 BatchMode 中執行。執行了兩批,每批包含 900 行。謂詞一次應用於 900 行
  2. …實際執行時間 < 1 ms(可以測量的最短時間)…

批量處理查詢結果因此降低了 SQL Server 中的 CPU 成本,原因有很多,但虛擬函式呼叫成本可能是其中之一(儘管它可能不如對壓縮數據進行操作、每批應用謂詞、計算聚合每批次等)。

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