ETMENİZ neden bu kadar hızlı NEREYE bağlanması daha katılacak mı?
Son zamanlarda VS 2010 geliştirdim ve etrafında veri Kümesi bu SERİ ile oynuyorum. ASP.NET bir WebApplication bu HttpCache bu Yetkilendirme için güçlü yazılmış veri kümesi var.
Aslında, eğer bir kullanıcı bir şeyler yapmak için yetkili olup olmadığını kontrol etmek için en hızlı yolu nedir bilmek istedim. Here benim datamodel ve eğer birileri ilgileniyorsa diğer bazı bilgiler.
3 yolu kontrol ettim:
- doğrudanveritabanı
- SERİ sorguNerede""Sözdizimi . Birleşim koşulları
- SERİ sorguKatılın- Sözdizimi
Bu her bir işlev 1000 çağrıları ile sonuçlar şunlardır:
1.Yineleme:
- 4,2841519 sn.
- 115,7796925 sn.
- 2,024749 sn.
2.Yineleme:
- 3,1954857 sn.
- 84,97047 sn.
- 1,5783397 sn.
3.Yineleme:
- 2,7922143 sn.
- 97,8713267 sn.
- 1,8432163 sn.
Ortalama:
- Veritabanı: 3,4239506333 sn.
- Nerede: 99,5404964 sn.
- Katılın: 1,815435 sn.
Neden sürüm Katılmak çok daha hızlı SERİ bir acemi olarak en okunaklı gibi görünüyor olsa da kullanışsız olduğu yerde sözdizimi. daha Ya da bir şey kaçırdı benim sorgularda var?
Burada ETMENİZ sorguları, veritabanı atla:
Nerede:
Public Function hasAccessDS_Where(ByVal accessRule As String) As Boolean
Dim userID As Guid = DirectCast(Membership.GetUser.ProviderUserKey, Guid)
Dim query = From accRule In Authorization.dsAuth.aspnet_AccessRule, _
roleAccRule In Authorization.dsAuth.aspnet_RoleAccessRule, _
role In Authorization.dsAuth.aspnet_Roles, _
userRole In Authorization.dsAuth.aspnet_UsersInRoles _
Where accRule.idAccessRule = roleAccRule.fiAccessRule _
And roleAccRule.fiRole = role.RoleId _
And userRole.RoleId = role.RoleId _
And userRole.UserId = userID And accRule.RuleName.Contains(accessRule)
Select accRule.idAccessRule
Return query.Any
End Function
Katılın:
Public Function hasAccessDS_Join(ByVal accessRule As String) As Boolean
Dim userID As Guid = DirectCast(Membership.GetUser.ProviderUserKey, Guid)
Dim query = From accRule In Authorization.dsAuth.aspnet_AccessRule _
Join roleAccRule In Authorization.dsAuth.aspnet_RoleAccessRule _
On accRule.idAccessRule Equals roleAccRule.fiAccessRule _
Join role In Authorization.dsAuth.aspnet_Roles _
On role.RoleId Equals roleAccRule.fiRole _
Join userRole In Authorization.dsAuth.aspnet_UsersInRoles _
On userRole.RoleId Equals role.RoleId _
Where userRole.UserId = userID And accRule.RuleName.Contains(accessRule)
Select accRule.idAccessRule
Return query.Any
End Function
Şimdiden teşekkür ederim.
Edit: daha anlamlı değerleri performans elde etmek için her iki sorgu üzerinde bazı iyileştirmeler sonra, KATILMAK avantajı daha önce bir çok kez daha büyük olsa bile
Katılın:
Public Overloads Shared Function hasAccessDS_Join(ByVal userID As Guid, ByVal idAccessRule As Int32) As Boolean
Dim query = From accRule In Authorization.dsAuth.aspnet_AccessRule _
Join roleAccRule In Authorization.dsAuth.aspnet_RoleAccessRule _
On accRule.idAccessRule Equals roleAccRule.fiAccessRule _
Join role In Authorization.dsAuth.aspnet_Roles _
On role.RoleId Equals roleAccRule.fiRole _
Join userRole In Authorization.dsAuth.aspnet_UsersInRoles _
On userRole.RoleId Equals role.RoleId _
Where accRule.idAccessRule = idAccessRule And userRole.UserId = userID
Select role.RoleId
Return query.Any
End Function
Nerede:
Public Overloads Shared Function hasAccessDS_Where(ByVal userID As Guid, ByVal idAccessRule As Int32) As Boolean
Dim query = From accRule In Authorization.dsAuth.aspnet_AccessRule, _
roleAccRule In Authorization.dsAuth.aspnet_RoleAccessRule, _
role In Authorization.dsAuth.aspnet_Roles, _
userRole In Authorization.dsAuth.aspnet_UsersInRoles _
Where accRule.idAccessRule = roleAccRule.fiAccessRule _
And roleAccRule.fiRole = role.RoleId _
And userRole.RoleId = role.RoleId _
And accRule.idAccessRule = idAccessRule And userRole.UserId = userID
Select role.RoleId
Return query.Any
End Function
1000 aramalar için (daha hızlı bir bilgisayara) sonucu
- | 2 katılın. Nerede
1.Yineleme:
- 0,0713669 sn.
- 12,7395299 sn.
2.Yineleme:
- 0,0492458 sn.
- 12,3885925 sn.
3.Yineleme:
- 0,0501982 sn.
- 13,3474216 sn.
Ortalama:
- Katılın: 0,0569367 sn.
- Nerede: 12,8251813 sn.
Katılmak 225 kat daha hızlı
Sonuç:ilişkiler ve kullanmak mümkün KATILIN belirtmek için(kesinlikle LINQ to DataSet) kaçının.
CEVAP
İlk yaklaşım (SQL DB sorgu) DB birleştirme gerçekleştirmek için nasıl bilir çünkü oldukça etkilidir. Ama gerçekten doğrudan bellek (veri Kümesi bu Seri) çalıştıkları beri anlamda diğer yaklaşımlar ile karşılaştırma yapmak imkansız
Birden fazla tablo ve
Where
bir durum ile sorgu aslında bir performans sergiliyorkartezyen çarpımıtüm tablolar,sonrafiltre koşulu karşılayan satırları. BuWhere
durumu her satır kombinasyonu (n3 * n4 n2 * n1*) değerlendirilir anlamına gelirJoin
operatör alır sıralardan ilk tablolar, sonra alır tek satır ile eşleşen bir anahtar, ikinci tabloda, tek satır ile eşleşen bir anahtar üçüncü tablo. Bu gibi birçok işlemleri gerçekleştirmek için ihtiyacı yok, çünkü çok daha etkilidir
Neden bu kadar hızlı C, ve neden değil...
Neden sıralanmamış bir dizi daha hızlı...
Neden `1000000000000000 aralığı(100000...
Neden Python kodunu daha hızlı bir işl...
Neden [] liste daha hızlı()?...