Avatar billede melted Nybegynder
19. juli 2004 - 22:07 Der er 18 kommentarer

Kan denne stored procedure optimeres yderligere?

Jeg har en stored procedure, som bliver kaldt ret meget. Den skal kun finde de unikke "items" der er i tabellen og sortere dem alfabetiskt. Tabellen indeholder lidt over 13.000 records hvoraf der er omkring 20-30 unikke "items". Jeg kunne godt tænke mig at høre om denne stored procedure kunne optimeres yderligere så den spytter resultatet ud hurtigere. Der er index på feltet "item".

CREATE Procedure spGetItems

As
    SELECT item FROM [dbo].tabel WHERE aktiv = 1 AND acceptvote = 1 GROUP BY item ORDER BY item ASC
   
return
GO


Derudover kunne jeg egentlig også godt tænke mig at vide hvor meget en stored procedure i det hele taget kan hjælpe hvis det er en så simpel forespørgelse som f.eks. "SELECT noget FROM enTabel"? Er der noget performance at hente?
Avatar billede arne_v Ekspert
19. juli 2004 - 22:17 #1
Har du prøvet:

SELECT DISTINCT item FROM [dbo].tabel WHERE aktiv = 1 AND acceptvote = 1 ORDER BY item ASC

?
Avatar billede arne_v Ekspert
19. juli 2004 - 22:17 #2
Altså med DISTINCT uden GROUP BY
Avatar billede melted Nybegynder
19. juli 2004 - 22:24 #3
Ja, men det virkede som om det var langsommere. Har desuden også læst at man skal holde sig fra at bruge DISTINCT.
Avatar billede arne_v Ekspert
19. juli 2004 - 22:34 #4
Er der index på aktiv og acceptvote ?
Avatar billede melted Nybegynder
19. juli 2004 - 22:38 #5
De er af typen "bit"... kan man sætte index på dem? Hvis ja - hvordan så?
Avatar billede arne_v Ekspert
19. juli 2004 - 22:42 #6
Nej det kan man ikke.
Avatar billede arne_v Ekspert
19. juli 2004 - 22:50 #7
Hvor lange er dine records ?

Med kun 13000 records er der jo en pæn chance for at alle data hentes
fra cache og så bliver det dæleme svært at påvise nogen nævneværdig forskel
i hastighed næsten uanset hvad man gør.
Avatar billede melted Nybegynder
19. juli 2004 - 22:53 #8
Hvor lange? Selve feltet, som er det eneste der bliver hentet i select-sætningen, er på max 50 tegn.
Avatar billede arne_v Ekspert
19. juli 2004 - 23:02 #9
Jeg tænkte på hele recorden altså med alle felter.
Avatar billede melted Nybegynder
19. juli 2004 - 23:09 #10
Der er 26 kolonner hvoraf der er blandet ntext, int og nvarchar-typer.
Avatar billede janus_007 Nybegynder
20. juli 2004 - 09:29 #11
Fjern evt. din order by og se om det går hurtigere.

Og hvad taler vi om i execution time?

Udover det så vær sikker på at din select bruger indexet, bare fordi du har oprettet det er jo ikke ensbetydende med anvendelsen ;O)
Avatar billede melted Nybegynder
20. juli 2004 - 09:40 #12
Jeg kan ikke fjerne order by, da det skal sorteres.
Til tider kan execution time komme helt op på 3 sekunder, når der er mange på samme tid.
Hvordan kan jeg sikre mig at select'en bruger indexet?
20. juli 2004 - 14:59 #13
Hvis du laver et view ud af din select statement, og lader din spGetItems kalde viewet, og (her kommer det smarte) sørger for at lave et index på dit view. Så kører det hurtigt.
Avatar billede trer Nybegynder
28. juli 2004 - 12:15 #14
Prøv at lave ét indeks der dækker kolonnerne ITEM, AKTIV og ACCEPTVOTE (i nævnte rækkefølge) - det burde give en performance boost.

Et indekseret view som hspoulsen foreslår virker også, men har et par bivirkninger. Læs i BOL om din app kan leve op til de begrænsinger der er - og vær opmærksom på, at opdaterering i tabellen bliver langsommere når der ligger et indekseret view ovenpå.
28. juli 2004 - 14:30 #15
Trer,
Skal felterne ikke være i modsat rækkefølge? AcceptVote, Aktiv og derefter Item.
Hvordan kan det være at opdateringen bliver langsommere, end når dit index tilføjes?
Det har jeg ikke kunnet se.
Men det er rigtigt at der er nogle begrænsninger.
28. juli 2004 - 15:05 #16
-- =============================================
-- Create schemabinding view
-- =============================================
IF EXISTS (SELECT TABLE_NAME
      FROM  INFORMATION_SCHEMA.VIEWS
      WHERE  TABLE_NAME = N'testhsp')
    DROP VIEW testhsp
GO

CREATE VIEW testhsp WITH SCHEMABINDING
AS
  SELECT item,  count_big(*) 'Antal'
  FROM [dbo].tabel
  WHERE aktiv = 1 AND acceptvote = 1
  GROUP BY item
  --ORDER BY item ASC
GO
 
-- =============================================
-- Create index basic template
-- =============================================
CREATE UNIQUE CLUSTERED INDEX testhsp1
ON db.dbo.testhsp
    (item)
GO
CREATE Procedure spGetItems

As
    SELECT item
    FROM [dbo].testhsp
    ORDER BY item ASC
GO
Avatar billede trer Nybegynder
28. juli 2004 - 23:04 #17
hspoulsen> Et indekseret view er i virkeligheden en kopi af data - altså en ekstra tabel. Det betyder, at når du opdatererer base-tabellen, så skal den finde og opdatere de tilsvarende data i viewet.  Det er en tung process.

Et alm. indeks på tabellen fungerer lidt anderledes - der bliver der først opdateret når 20% data har ændret sig - og opdateringen sker ved nogle statistiske beregninger hvor den ved store tabeller (over 8 mb) kun tager et repræsentativt udsnit af data med.

Mht rækkefølgen i det sammensatte indeks - du kunne godt have noget der; Afhængigt af data kan det godt være at en omvendt rækkefølge vil give bedre performance - så det må en test afgøre. En "nem" løsning ville være at lave begge indeks og lade query optimizeren selv vælge hvad den anvender, det rigtige ville være at teste.

Fordelen ved det sammensatte indeks er i øvrigt, at SQL Server så kan nøjes med at læse indeks og man så undgår læsning af selve tabel-data - dvs. færre i/o og bedre performance.

En anden ting - check evt. med DBCC SHOWCONTIG om tabellen er fragmenteret (scandensity skal være høj og antal extentsswap lig med antal extents i tabellen). Er den fragmenteret, så defragmenter den med DBBC REINDEX
29. juli 2004 - 08:21 #18
Troels> Tak for det. Det betyder at hvis data stort set er read-only, i forhold til antal kald til spGetItems, så er mit forslag ok. Hvis ikke, så skal man istedet kigge på sammensatte indeks. Det er godt at vide.
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