閱讀這篇文章https://bertwagner.com/posts/visualizing-merge-join-internals-and-understanding-their-implications/
有這樣一句話:
“如果優化器向上游合并連接添加了排序,那么可能值得研究是否可以對資料進行預排序,以便 SQL Server 不需要自行排序。通常這可以像重新定義一個將索引列添加到鍵列 - 如果您將其添加為索引中的最后一個鍵列,則回歸影響通常很小,但您可以允許 SQL Server 使用合并連接,而無需任何額外的排序。”
我不明白。作者提議將額外的列(由 sql server 本身排序的列)添加到已經存在的索引作為最后一個?據我了解,索引從 1 列到最后排序。
EG 表的列“number”(int),“letter”(varchar)將具有索引(“number”,“letter”),如
- 1個
- 1 天
- 3個
- 3D
那么索引中“字母”列的存在如何為服務器省去排序的麻煩呢?
uj5u.com熱心網友回復:
合并連接只能合并到已經根據連接謂詞(向前或向后)排序的資料流。
如果連接謂詞包含兩個列 ( number& letter),但只有一個索引number,則引擎將無法將索參考作“預排序”資料流的源。如果引擎決定在這種情況下進行合并,您會注意到計劃將在合并運算子的下游包含一個額外的運算子“排序”。如果排序很昂貴,這可能效率不高。
作者指出,如果您看到這樣的案例,那么您可以通過向其添加列letter來探索更改現有索引的可能性。在這個新場景中,引擎將能夠直接將此索參考作預排序的資料流,而無需下游額外的“排序”運算子。
但是,更改索引可能很棘手。也許提高這個查詢的性能會惡化另一個更重要的查詢。確保您了解其中的含義。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/432588.html
