SORU
14 ŞUBAT 2009, CUMARTESİ


uygulamak için disk belleği verimli şekilde

Skip() SERİ kullanımı ve disk belleği Take() yöntem veya bir SQL sorgu ile kendi belleği uygulamak gerekir?

Hangisi en verimli olur? Neden diğer üzerinden bir tercih yapayım?

SQL Server 2008, ASP.NET ve SERİ MVC kullanıyorum.

CEVAP
18 Mart 2009, ÇARŞAMBA


Vermek istiyor ki sana kısa bir cevap vermek sizin şüphe, eğer yürütme skip(n).take(m) yöntemleri üzerinde seri (SQL 2005 / 2008 veritabanı sunucusu) sorgunuza kullanıyor olacak Select ROW_NUMBER() Over ... deyimi ile bir şekilde doğrudan disk belleği SQL motoru.

Size bir örnek vererek, db bir tablo mtcity aradım ve aşağıdaki sorgu (lınq varlıkları ile çalışmak) yazdı:

using (DataClasses1DataContext c = new DataClasses1DataContext())
{
    var query = (from MtCity2 c1 in c.MtCity2s
                select c1).Skip(3).Take(3);
    //Doing something with the query.
}

Sonuçta elde edilen sorgu olacaktır:

SELECT [t1].[CodCity], 
    [t1].[CodCountry], 
    [t1].[CodRegion], 
    [t1].[Name],  
    [t1].[Code]
FROM (
    SELECT ROW_NUMBER() OVER (
        ORDER BY [t0].[CodCity], 
        [t0].[CodCountry], 
        [t0].[CodRegion], 
        [t0].[Name],
        [t0].[Code]) AS [ROW_NUMBER], 
        [t0].[CodCity], 
        [t0].[CodCountry], 
        [t0].[CodRegion], 
        [t0].[Name],
        [t0].[Code]
    FROM [dbo].[MtCity] AS [t0]
    ) AS [t1]
WHERE [t1].[ROW_NUMBER] BETWEEN @p0   1 AND @p0   @p1
ORDER BY [t1].[ROW_NUMBER]

Pencereli bir veri erişim (çok havalı, btw çünkü çok baştan beri veri transferi sağlar ve tablo şartlar yerine getirildiği sürece erişir). Bu çok benzer olacaktır:

With CityEntities As 
(
    Select ROW_NUMBER() Over (Order By CodCity) As Row,
        CodCity //here is only accessed by the Index as CodCity is the primary
    From dbo.mtcity
)
Select [t0].[CodCity], 
        [t0].[CodCountry], 
        [t0].[CodRegion], 
        [t0].[Name],
        [t0].[Code]
From CityEntities c
Inner Join dbo.MtCity t0 on c.CodCity = t0.CodCity
Where c.Row Between @p0   1 AND @p0   @p1
Order By c.Row Asc

Dışında, bu ikinci sorgu işlenir daha hızlı kontrol etmeniz neden çünkü onu kullanacak sadece dizin oluşturmak için veri erişim penceresi; bunun anlamı, eğer gereken bazı filtreleme, filtreleme olmalı (ya da olmalıdır) Varlık listesi (satır oluşturulur) ve bazı dizinler oluşturulacağını da tutmak iyi performans.

Şimdi, ne daha iyi?

Eğer senin mantığında çok sağlam bir iş akışı varsa, SQL doğru şekilde uygulanması karmaşık olacaktır. Bu durumda SERİ bir çözüm olacaktır.

Eğer alt kısmı mantığı doğrudan SQL (saklı yordam), öyle olması daha iyi çünkü sen-ebilmek uygulamak ikinci sorgu gösterdim (kullanarak dizinler) ve izin vermek için SQL oluşturmak ve mağaza Yürütme Planı sorgu (performans geliştirme).

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • CMTelly

    CMTelly

    2 Mayıs 2007
  • humanHardDrive

    humanHardDri

    16 Mart 2011
  • Paulo Bautista

    Paulo Bautis

    21 Aralık 2008