Avatar billede armit Nybegynder
06. december 2007 - 01:57 Der er 4 kommentarer

Optimering af SQL

Hej jeg har en database med store mængder data i en tabel ved navn Data, jeg starter fra bunden for at få den optimeret og håber i kan komme med nogle gode/seriøse optimeringer.

I tabellen satser jeg på følgende opslag først derefter går jeg videre til de andre, derfor nævner jeg kun de felter der er relevante.

Data
    DataId Int
    Exported Bit
    Deleted Bit

SQL Statement jeg kikker på nu er.
SELECT * FROM [Data] WHERE [DataId]=58 AND [Entered]=1 AND [Deleted]=0

Jeg har indsat til test 10000 poster først med værdien Entered=false, dernæst 10000 poster med værdien Entered=true.

Nu prøver jeg så min sql og den er sløv, derefter ændre jeg så sql til at finde dem der er Entered=0, så fiser den derudaf.

Det virker som om denne går hurtigere fordi disse befinder sig i toppen/oprettet først, ret mig hvis jeg ikke har ret.

Godt tænkte jeg, vi opretter bare et index med disse 3, men ak bit kan ikke indsættes i index, igen ret mig hvis jeg har uret.

Så spørgsmålet lyder hvordan optimere jeg denne problematik, der vil i tabellen være cirka fifty/fifty.

Info: Opslag sker i web aplikation.

Jeg forventer lidt at svaret kan bringe dem på samme speed og ikke omvendt ;-).
Avatar billede hrc Mester
06. december 2007 - 08:14 #1
Med fare for at påpege det åbenbare. Henter du virkelig "select *" eller er det bare for at spare plads her?

Er der text, image eller lignende tunge felter i tabellen?

Du kan overveje at samle de to bits i et heltalsfelt i stedet. Det at de samles og at der desuden kan laves indeks på felterne må speede tingene meget op. Ulempen er bitoperationen før selecten:

Felterne:
  Exported: bit (Entered = Exported ikke?)
  Deleted: bit

erstattes af
  State int

Hvis Deleted flaget er bit 0 og Exported bit 1 osv, kan du samle op til 31 flag i State feltet.

  SELECT * FROM [Data] WHERE [DataId]=58 AND [State]=2 <-- ..0000010b

Du kan prøve at kigge lidt på de værktøjer der nævnes i nedenstående opslag:

  http://www.eksperten.dk/spm/805050
Avatar billede armit Nybegynder
06. december 2007 - 09:41 #2
Hej hrc

Kikker lige på det, nej grunden for at jeg bruger * er egentlig bare, at begge SQL med resultat på 10000 burde tage den samme tid, uden hensyntagen til antal felter i resultat.
Avatar billede lorentsnv Nybegynder
06. december 2007 - 12:29 #3
Jeg kan ikke huske om det kan lade sig gøre eller ej, at indexere et bit felt, ment det giver oftest ikke ret meget mening. Du skal huske, at når du laver en vanlig index (ikke et clustred index), så skal den førs læse i index tabellen, og finde ud af hvilke fysiske records den skal hente, og så skal den over i den fysiske tabel og hente de records. Hvis du laver index på et enkelt bit felt, vil det være hurtigere at lave table scan på hele den fysiske tabel. Hvis du derimod laver index på en kombination af felter, hvor nogle af disse er bit felter, kan det godt forholde sig anderledes. Men husk at indexet kun fungerer, hvis du har de første felter i indexet med som filter i den forespørgsel. Effekten af indexet afhænger således af hvor mange af felterne i indexet, talt fra starten af 'rækkefølgen', som du har med i din Where.

Du kan have en clustered index pr tabel, og data bliver fysisk lagret i den rækkefølge din clustered index angiver. Fordelen er, at den ikke skal læse både i index tabel, og fysisk tabel.

Et alternativ du kan vurdere, hvis du ofte forespørger kun nogle få felter, er at includere alle dine felter i dit index. Således behøver serveren ikke at gå over i den fysiske tabel, når den har søgt igennem indexet, da alle felter du spørger efter, er indehold i index tabellen.
Avatar billede kichian Nybegynder
15. december 2007 - 22:08 #4
I stedet for bit-felter, bør du bruge et tinyint-felt. Fylder det samme i tabellen og kan indekseres.
Jeg kunne forestille mig, at et alm. indeks på eksported feltet vil gøre en eksportoperation kører meget hurtige i takt med at der kommer flere data i tabellen.
Ellers kan det ikke anbefales at lægge indeks på netop disse felter.
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester