SORU
5 NİSAN 2011, Salı


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:

  1. doğrudanveritabanı
  2. SERİ sorguNerede""Sözdizimi . Birleşim koşulları
  3. SERİ sorguKatılın- Sözdizimi

Bu her bir işlev 1000 çağrıları ile sonuçlar şunlardır:

1.Yineleme:

  1. 4,2841519 sn.
  2. 115,7796925 sn.
  3. 2,024749 sn.

2.Yineleme:

  1. 3,1954857 sn.
  2. 84,97047 sn.
  3. 1,5783397 sn.

3.Yineleme:

  1. 2,7922143 sn.
  2. 97,8713267 sn.
  3. 1,8432163 sn.

Ortalama:

  1. Veritabanı: 3,4239506333 sn.
  2. Nerede: 99,5404964 sn.
  3. 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

  1. | 2 katılın. Nerede

1.Yineleme:

  1. 0,0713669 sn.
  2. 12,7395299 sn.

2.Yineleme:

  1. 0,0492458 sn.
  2. 12,3885925 sn.

3.Yineleme:

  1. 0,0501982 sn.
  2. 13,3474216 sn.

Ortalama:

  1. Katılın: 0,0569367 sn.
  2. 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
5 NİSAN 2011, Salı


  1. İ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

  2. 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ı. Bu Where durumu her satır kombinasyonu (n3 * n4 n2 * n1*) değerlendirilir anlamına gelir

  3. Join 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

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • GUN-TIME with Brandon

    GUN-TIME wit

    3 ŞUBAT 2009
  • Kamikazeepanda

    Kamikazeepan

    5 ŞUBAT 2006
  • SoundHound

    SoundHound

    8 Mart 2006