Sql-Server
使用 PK 和 FK 是否會對性能產生負面影響?
我注意到很少有公司不使用 PK 和 FK。我不明白不使用聚集索引的邏輯,我聽到有人說這可能會導致問題,因為 FK 將記錄耦合在一起並佔用更多記憶體。有什麼見解嗎?
您應該標記您所指的數據庫系統和版本,因為這可能會影響適當的答案。但是假設您指的是主要的現代關係數據庫系統之一,那麼您要詢問幾個不同的對象,所以這裡是每個對象的答案:
主鍵:
它們根本不會以負面的方式影響性能,實際上可以稍微提高某些數據庫系統的性能,因為它們保證了表中一組欄位的唯一性。在大多數情況下,不在表上定義主鍵是不好的關係設計。主鍵與聚集索引不是一回事,儘管一些數據庫系統預設會在主鍵欄位上創建****聚集索引,但假設主鍵欄位將用於謂詞(和子句)。
JOIN``WHERE``HAVING
外鍵:
與主鍵類似,它們也沒有可測量的負面性能影響,並且還可以通過指導數據庫系統在特定情況下生成更有效的執行計劃來潛在地提高性能。(儘管我發現這種情況很少發生,而且大多數情況下,無論哪種方式都沒有性能差異。)
聚集索引:
當通常在謂詞中查詢該索引的欄位時,表上的聚集索引絕對可以提高性能,並且在大多數情況下,建議在表上設置一個。****聚集索引是表本身數據的邏輯排序,因此不佔用任何額外空間。如果沒有聚集索引,則表在邏輯上儲存在堆(或類似的資料結構,取決於數據庫系統)中,從其中讀取數據可能效率低下*。表上的聚集索引可能會*導致
INSERT
操作花費稍長的時間,但通常相差幾毫秒INSERT
對於、 和查詢的主要性能改進SELECT
,操作通常是值得的。UPDATE``DELETE
使用聚集索引可能會導致性能淨損失的極端情況是,當您使用臨時表在將數據移動到其他地方之前臨時儲存數據,並且您不打算對該表執行任何查詢而不是
INSERT
操作或選擇整個表格。