sql >> Database teknologi >  >> RDS >> Sqlserver

effektiv måde at implementere personsøgning på

Forsøger at give dig et kort svar på din tvivl, hvis du udfører skip(n).take(m) metoder på linq (med SQL 2005 / 2008 som databaseserver) vil din forespørgsel bruge Select ROW_NUMBER() Over ... sætning, med er på en eller anden måde direkte personsøgning i SQL-motoren.

For at give dig et eksempel, har jeg en db-tabel kaldet mtcity og jeg skrev følgende forespørgsel (fungerer også med linq til entiteter):

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

Den resulterende forespørgsel vil være:

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]

Hvilket er en dataadgang med vindue (temmelig cool, forresten, fordi vil returnere data siden begyndelsen og vil få adgang til tabellen, så længe betingelserne er opfyldt). Dette vil være meget lig:

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
 

Med den undtagelse, at denne anden forespørgsel vil blive udført hurtigere end linq-resultatet, fordi den udelukkende vil bruge indekset til at oprette dataadgangsvinduet; Det betyder, at hvis du har brug for noget filtrering, skal filtreringen være (eller skal være) i enhedslisten (hvor rækken er oprettet), og nogle indekser skal også oprettes for at opretholde den gode ydeevne.

Hvad er nu bedre?

Hvis du har et stort set solidt arbejdsflow i din logik, vil det være kompliceret at implementere den rigtige SQL-måde. I så fald vil LINQ være løsningen.

Hvis du kan sænke den del af logikken direkte til SQL (i en lagret procedure), vil det være endnu bedre, fordi du kan implementere den anden forespørgsel, jeg viste dig (ved hjælp af indekser) og tillade SQL at generere og gemme eksekveringsplanen for forespørgsel (forbedrer ydeevnen).



  1. Hvordan grupperer jeg efter uge i MySQL?

  2. Vælg sidste række i MySQL

  3. Hvordan ændres skemaet for flere PostgreSQL-tabeller i én operation?

  4. Lagret procedure for at få serverlagringsoplysninger på server