20. juli 2005 - 06:10Der er
22 kommentarer og 2 løsninger
Bedste performance ved joins
Jeg skal have lavet et udtræk, hvor 10 tabeller skal joines. Hvad vil I foreslå for at opnå den bedste performance? At splitte forespørgslen op i flere views, der bruger hinanden? Eller at lave en stored procedure med join af alle tabeller samtidig? Eller..? Hvad har I bedst erfaring med?
Der er tale om små tabeller med nogle få tusinde poster i hver pt. Databasen er SQL Server 2000.
Med kunstig intelligens skaber HP’s nye OmniBook X 14 en unik og skræddersyet brugeroplevelse målrettet dem, der ønsker høj ydeevne og intelligente funktioner
Jeg har blot min personlige mening, men jeg tror i en så lille applikation at du lige så godt kan bruge views, bare for at kunne beholde den store fleksibilitet.
SQL server laver jo lige som med sprocs også en execution plan til views, der kan genbruges af din applikation.
med så få poster er det formentligt ligegyldigt hvordan du laver de forespørgsler
generelt er jeg lidt bekymret over performance for "multi level" queries så jeg er ikke så glad for 1 query--N view--M table når vi snakker performance
Det eneste du kan gøre for at forbedre performance er, at oprette de rigtige indekseringer, dog ignorerer MS SQL indekseringer for tabeller med kun 1000-1500 rækker og nedefter, da det ikke kan betale sig performance-mæssigt.
Views forbedre ikke umiddelbart performance - det er jo blot SELECT-statements. Dog kan MS SQL arbejde med indekserede views, men så kan man lige så godt indeksere tabellerne og undgå views.
Og med den udtalelse mener jeg, at man kan opnå en mindst lige så god performance uden views som med og derfor bør undgå dem i det hele taget, med mindre man anvender dem af sikkerhedsmæssige eller andre årsager.
Indexerede views kan dog vise sig meget nyttige, hvis man står med et eksisterende system der skal opdateres, og ikke har muligheden for at omstrukturere tabeller mv. MS SQL kan nemlig gøre brug af indexerede views på eget initiativ - de medtages i query plannerens overvejelser...
Okay, men det vil vel gå lidt hurtigere at lave et view, der kompileres på forhånd og allerede er parset for syntaksfejl, når det skal bruges - fremfor at have hele forespørgslen i applikationskoden?
Der står lidt om views i det første link jeg postede, f.eks.:
"These views are used primarily to restrict users to a certain subset of data in one or more base tables for security reasons, and to enable developers to customize how users can logically view data stored in base tables."
Views er altså generelt ikke tænkt til brug ved optimeringer. Og:
"Nonindexed views are materialized at runtime. Any computations such as joins or aggregations are done during query execution for each query referencing the view."
set quoted_identifier on go set arithabort on go select * from t1 go create view v1 with schemabinding as select f1,f2 from dbo.t1 go select * from v1 go create unique clustered index ixv1f1 on v1(f1) go select * from v1 go drop view v1 go
Det er det ofte. Et clustered index angiver den rækkefølge data ligger placeret på harddisken. Det betyder, at hvis du joiner på primærnøglen vil data være meget hurtige for databasen at læse - den skal ikke hente data forskellige steder fra på disken.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.