De multe ori ne punem intrebarea "De ce merge greu o aplicatie?". Mai mereu cautam vinovatul in codul scris fie la nivel de kernel, fie la nivel de interfata. De cele mai putine ori insa incercam sa dam vina pe baza de date. Se intampla totusi ca si baza de date sa aduca intarzieri importante in rularea unei aplicatii, mai ales daca vorbim de un volum ceva mai mare de date. Voi prezenta cateva din trucurile pe care le putem folosi atunci cand lucram cu o baza de date:

La nivel de proiectare a bazei de date se pot urma urmatoarele trucuri:

  • Creaza indexi pe coloanele cel mai frecvent folosite in clauze WHERE, ORDER BY si GROUP BY.
  • Sterge indexii care nu sunt folositi, deoarece incetinesc raspunsul serverului
  • Incearca sa creezi indexi pe coloanele de tip integer si evita sa creezi indexi pe coloanele de tip string.
  • Limiteaza pe cat posibil numarul indexilor daca aplicatia face update-uri frecvent.
  • Nu crea indexi pe coloane utilizate foarte rar.
  • Daca joinezi tabele, creaza indexi pe coloanele de legatura.
  • Normalizeaza tabelele la a 3-a forma normala.
  • Denormalizeaza-ti tabelele de la a 4-a sau a 5-a forma normala la 3-a forma normala. Este util atunci cand faci foarte multe join-uri
  • Sparge tabelele foarte mari in 2 tabele: tabel cu date curente (active) si arhiva. Este util atunci cand luctrezi pe un set mai mic de date, nu pe toate datele din tabel
  • Incearca sa reduci numarul de coloane din tabel.
  • Incearca sa eviti clauza HAVING pe cat posibil.
  • Incearca sa eviti clauza DISTINCT pe cat posibil.
  • Incearca sa folosesti clauza UNION ALL in locul clauzei UNION, atunci cand e posibil.
  • In urma rularii unui SELECT, incearca sa intorci un set de date cat mai mic, acest lucru reducand traficul de retea, deci implicit mareste performanta:
    - foloseste clauza WHERE.
    - specifica doar coloanele de care este absoluta nevoie.
    - foloseste cuvantul cheie TOP, acolo unde este posibil.

Ce am spus pana acum se aplica la majoritatea bazelor de date. Am insa si cateva sfaturi ce vizeaza fix SQL Server, mai precis linbajul T-SQL:

  • Incearca sa eviti cursoarele atunci cand este posibil, deoarece pot aduce unele scaderi de performanta in comparatie cu selecturile simple.
  • Nu uita sa inchizi cursoarele. Acest lucru elibereaza blocarile de pe inregistrarile unde cursorul este pozitionat.
  • Nu uita sa dealoci cursoaerle atunci cand structurile de date cuprinse in cursor nu sunt necesare. Astfel se sterge referinta la cursor si datele se elibereaza.
  • Incearca sa reduci numarul de inregistrari de procesat intr-un cursor.
  • Incearca sa reduci numarul de coloane procesate de un cursor, specificand in select doar coloanele absolut necesare.
  • Foloseste cursoare READ ONLY atunci cand este posibil, in locul celor update-abilele, deoarece se reduce concurenta pe date si nu conduce la blocari nenecesare.
  • Foloseste variabile de tip tabel in locul tabelelor temporare
  • Include SET NOCOUNT ON statement in procedurile stocate pentru a opri mesajele indicand numarul de randuri afectate
  • Nu folosi prefixul "sp_" in numele procedurii stocate pe care vrei sa o creezi intr-o baza de date, alta decat master.
  • Daca ai o procedura stocata foarte mare, incearca sa o spargi in cateva sub-proceduri pe care sa le apelezi dintr-o procedura root.
  • Incearca sa eviti folosirea tabelelor temporare in interiorul unei proceduri stocate.
  • Incearca sa eviti folosirea DDL (Data Definition Language) in interiorul procedurii stocate.

Voi reveni si cu alte sugestii de indata ce mi le amintesc.