2016-03-30 26 views
0

Orta ölçekli bir tabloyu (60 GB, 500 milyon satır) dolduruyorum. Tablonun birincil anahtarı yoksa (toplu ek kullanarak ~ 1 saat), işlem oldukça hızlı tamamlanır, ancak birincil anahtarla bu tabloyu oluşturursam 10 kat daha uzun sürer. Bunun, teklik kısıtını doğrulamak ve her bir eklentideki dizini güncellemek zaman alması gerektiğine inanıyorum.Birincil anahtarla performans sorunu

Önceden doldurulmuş tablodaki endeksleme, artan dizine göre daha hızlı olması gerektiğinden, birincil anahtarı daha sonra eklemek iyi bir geçici çözüm olacağını düşündüm. Ancak sqlite, tablo oluşturulduktan sonra birincil anahtar ekleme seçeneğine sahip görünmüyor (neden emin değil misiniz?).

Sanırım birincil anahtar kullanamıyorum ve tablo doldurulduktan sonra benzersiz bir dizin ekleyemiyorum. Bunun bir dezavantajı var mı? Ya da herhangi bir daha iyi bir çözüm önerildi mi?

cevap

1

, bir benzersiz dizin birincil anahtar olarak tam olarak aynı etkiye sahiptir. (SQLite'de, bazı birincil anahtarlar geriye doğru uyumluluk için NULL'lere izin verir.)

Tek fark, birincil anahtar kısıtlamanın, tablo tanımının kendisinde gösterilmemesidir; bu, belgeleme amacıyla kötü bir şey olabilir.

Ayrıca bkz. Is CREATE UNIQUE INDEX or INTEGER PRIMARY KEY more performant in SQLite.

+0

Ancak, bağlantılı cevabınıza göre, birincil anahtar INTEGER sütunundaysa performans avantajına sahip olabilir mi? – max

+0

Evet, ancak tablonuz farklı bir tür kullanmış. –

+1

INTEGER PRIMARY KEY, eklemeleri yavaşlatmayacaktır. –

0

Toplu ek işlemini bir işlemin içine yerleştirin ve yavaşlatan çok az şeyden kaçınacaksınız.

Bu, sqlite3'te işleri hızlandırmak için harika bir yazmayı buldum. görünümünün tamamen teknik açıdan

Improve INSERT-per-second performance of SQLite?

İlgili konular