Ayrı şemalar kullanmak SQL Server 2008 performansını nasıl etkiler?


11

SQL Server 2008 veritabanımızda farklı amaçlara sahip nesneler için ayrı şemalar kullanmak istiyorum. Şu anda, bir tablonun veya saklı yordamın amacını belirtmek için oldukça zihin uyuşturan bir adlandırma kuralı kullanıyoruz ve önekler, benzersiz adın başlangıcını bile görmeden önce beş veya altı x karakteri taramamız gerektiği anlamına geliyor. Ben sadece UI (menüler, kişi tarafından rolleri, vb) sürücü için kullanılan tablolar ve boyut tabloları vs olgu tabloları, vb için ayrı şemalar kullanmak istiyorum.

Benim sorum, her şey için iyi eski dbo karşı birden fazla şema (şema?) Kullanarak performans etkileri olacak mı?

Yanıtlar:


4

Kodlama stilinize bağlı olarak, küçük de olsa sorgu optimize edicinin performansı üzerinde bir etkisi olabilir. Şema içermeyen bir tabloya başvurursanız, en iyi duruma getirici, önce kullanıcının varsayılan şemasındaki (varsa) tabloları, ardından dbo. Ve sonra diğer her şeyi kullanarak tabloyu tanımlamaya çalışmalıdır. Tablolara schema.table olarak açıkça atıfta bulunuyorsunuz, ki bu muhtemelen iyi bir uygulamadır.


1

Performansta fark yok. Ancak, şu anda şemalar kullanıyorsunuz (bilmeseniz bile).

Şema referansların kullanımı, vb tablolar, saklanan prosedürler, UDF, gibi nesneler değildir şema kalifiye etmez bir performans etkisi vardır. Referanslar her zaman şema tarafından nitelendirilmelidir. Bu niteliksiz referansların çözülmesi gerekir ve bu şu şekilde olur:

  • İlk olarak, aynı adı taşıyan bir nesneyi arayın ve kimlik bilgileri altında oturumun oluşturulduğu kullanıcının varsayılan şemasının altına yazın (örn. jsmith). Eğer bulunursa, o örnek kullanılır.
  • Aksi takdirde, şema altında aynı ada ve türe sahip bir nesne arayın dbo.

Bunun birkaç etkisi vardır:

  • Çoğu zaman, referans şema niteliyse gerekli olan tek arama yerine referansı çözmek için iki arama gerekir.
  • Sorgu / saklı yordam / kullanıcı tanımlı işlev bağlandığında elde edilen yürütme planı önbelleğe alınamaz ve yeniden kullanılamaz.

Bir şey bozulduğunda yalnızca - acı verici bir şekilde - bulacağınız son etki, farklı kullanıcıların belirli bir sorgudan veya saklı yordamdan farklı sonuçlar alabilmesidir. Böyle bir şey select * from foo join barbenim için db sahibi olarak iyi çalışabilir; jsmithistemeden veya istemeyerek , aynı veritabanında fookendi şeması ( jsmith.foo) altında bir tablo oluşturan kullanıcı için bozuk olabilir .

Bu nedenle de createve dropifadeler yaratılan veya bırakılan nesnenin adını şema nitelemelidir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.