ORM N+1 Sorgusu (ARCH5079)
Anahtar go.performance.orm-n-plus-one · Önem warning · Kategori performance
Bir sorgu sonucu üzerinde döngü kurup her satır için ilişkili veriyi ayrı sorguyla çekmek (N+1) veritabanını gereksiz tur sayısıyla boğar. İlişkiyi Preload ile önceden yükleyin.
Hatalı
Bölüm başlığı “Hatalı”func loadOrders(db *gorm.DB) []Order { var orders []Order db.Find(&orders) for i := range orders { db.Where("order_id = ?", orders[i].ID).Find(&orders[i].Items) } return orders}func loadOrders(db *gorm.DB) []Order { var orders []Order db.Preload("Items").Find(&orders) return orders}Düzeltme
Bölüm başlığı “Düzeltme”İlişkili veriyi döngüde tek tek çekmek yerine Preload ile eager load edin.