Lars Aagaard wrote:
> Jeg har netop konverteret min side fra Access til MS-SQL.
Sidst jeg skulle lave et program til begge systemer, fandt jeg ud af, at der
var gigantisk forskel på, hvad der kørte hurtigt på de to systemer. F.eks.
er dette noget af det hurtigste man kan lave på MS Access:
select * from tabel
hvorimod det er noget af det dummeste man kan gøre på MS SQL server. Her bør
man til gengæld angive feltnavne osv.
Da jeg skulle lave et system, der kunne køre på begge databaser, samt
Oracle, og skulle have optimal performance på alle tre, lavede jeg et
programmodul, som opbyggede SQL statements ud fra et API. Resultatet var
gigantiske SQL statements til MS SQL server, ofte over 10kbyte bare for
selve SQL kommandoen, men performance var extrem god. På MS Access var de
samme SQL statements væsentligt mindre, men også hurtige. Oracle og MS SQL
server skulle have tingene meget forskelligt - den ene brugte joins og den
anden gjorde ikke osv.
Generelt skal du:
1) Have de rigtige indexes.
2) Sørg for, at MS SQL serveren rent faktisk bruger de tiltænkte indexes.
Alt for ofte har jeg set, at folk hælder masser af indexes i en database,
men at databasen så enten vælger det forkerte index, eller prøver at flette
to indexes, hvilket selvflg. begge giver ekstrem dårlig performance.
3) Tilpasse dine SQL statements til, hvad database systemet bedst kan lide.
Et typisk problem er, hvis folk har to tabeller, postnumre og personer, og
vil have en adresseliste over alle personer i Roskilde sorteret efter navn:
select personer.navn,personer.adresse,personer.postnr,postnumre.postdistrikt
from personer inner join postnumre on personer.postnr=postnumre.postnr
where postnumre.postdistrikt='Roskilde'
order by navn
Denne SQL er jo helt hen i vejret, eftersom at både where-delen og
order-delen har brug for indexes, men går på data i hver sin tabel. Man kan
ikke få en god performance på denne SQL statement uanset hvor mange indexes
man hælder i sin database. Resultatet i ovenstående tilfælde er en af
følgende:
1) Udvælg på postnr i stedet for postdistrikt. Da postnr findes i personer
tabellen, kan man så lave et indeks på tabellen personer med felterne
postnr og navn.
2) Lav et felt i personer tabellen, der hedder postdistrikt. Og ja, det er
redundant data, og ikke særligt normaliseret, men kunden bliver ofte
gladere for et system med lave svartider end et system der er normaliseret
og uanvendeligt.
P.S.: jeg ved godt, at visse database systemer kan lave indexes på tværs af
tabeller, men det synes jeg ligger uden for emnet.
Lars.
--
Dybdahl Engineering
http://dybdahl.dk/