Avatar billede madssch Nybegynder
17. januar 2007 - 20:14 Der er 4 kommentarer og
1 løsning

Optimering af Stored Procedure

Hej Eksperter,

Jeg har ikke meget forstand på SP's, men har alligevel fået fedtet mig frem til en. Kort fortalt genererer den en ny tabel (tblPageRecursiveList) på baggrund af en eksisterende (viewPage).

Som navnet siger, laver SP'en rekursive kald på viewPage, og gemmer så resultatet i tblPageRecursiveList.

SP'en:

SET ANSI_NULLS ON
SET QUOTED_IDENTIFIER ON
GO


ALTER PROC [dbo].[stpPageRecursion] (

    @RootID int,
    @RootID_Org int

)

AS


IF @RootID = @RootID_Org

    BEGIN

        IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE table_name = 'tblPageRecursionList')

            BEGIN

                DROP TABLE tblPageRecursionList

            END

        CREATE TABLE tblPageRecursionList (PageID int, PageRefID int, PageLevel int, PageTitle nvarchar(100), PageVisible int)

    END
   


BEGIN


    SET NOCOUNT ON

    DECLARE @PageID int, @PageTitle varchar(100), @PageRefID int, @PageLevel int, @PageVisible int

    SET @PageTitle = (SELECT PageTitle FROM dbo.viewPage WHERE PageID = @RootID)
    SET @PageRefID = (SELECT PageRefID FROM dbo.viewPage WHERE PageID = @RootID)
    SET @PageID = (SELECT PageID FROM dbo.viewPage WHERE PageID = @RootID)
    SET @PageVisible = (SELECT PageVisible FROM dbo.viewPage WHERE PageID = @RootID)
    SET @PageLevel = @@NESTLEVEL
   
    INSERT INTO tblPageRecursionList (PageID, PageRefID, PageLevel, PageTitle, PageVisible)
    VALUES (@PageID, @PageRefID, @PageLevel, @PageTitle, @PageVisible)
   
    SELECT PageID FROM viewPage WHERE PageID = @RootID ORDER BY PagePriority

    SET @PageID = (SELECT MIN(PageID) FROM dbo.viewPage WHERE PageRefID = @RootID)


    WHILE @PageID IS NOT NULL

    BEGIN

        EXEC dbo.stpPageRecursion @PageID, @RootID_Org

        SET @PageID = (SELECT MIN(PageID) FROM dbo.viewPage WHERE PageRefID = @RootID AND PageID > @PageID)

    END

END


Mine 2 problemstillinger er:

1. Optimering
2. Sortering af rekursivt kald

1. Jeg er grøn i SP's, og det kan derfor være, at den kan optimeres. I så fald hører jeg gerne tips om det. Kan det f.eks. passe, at jeg skal lave en ny SELECT statement for hver værdi jeg skal trække fra samme tabelrække?

2. Fra viewPage trækker jeg p.t. felterne PageID, PageRefID, PageTitle og PageVisible. Det er også det, jeg skal bruge. viewPage indeholder yderligere en værdi - PagePriority, som bestemmer rækkefølgen på elementer på samme niveau. Hvordan får jeg det integreret i SP'en?

Jeg håber, at nogen kan hjælpe, da det er lidt af en haster!  :)

Generelle kommentarer er også velkomne!

På forhånd tak!
Avatar billede Slettet bruger
18. januar 2007 - 05:58 #1
Det der umiddelbart spriger mest i øjenene på mig er nedenstående sektion

SET @PageTitle = (SELECT PageTitle FROM dbo.viewPage WHERE PageID = @RootID)
SET @PageRefID = (SELECT PageRefID FROM dbo.viewPage WHERE PageID = @RootID)
SET @PageID = (SELECT PageID FROM dbo.viewPage WHERE PageID = @RootID)
SET @PageVisible = (SELECT PageVisible FROM dbo.viewPage WHERE PageID = @RootID)

Her kan du spare noget der ligner 3 lookup ved følgende:

SELECT @PageTitle = PageTitle, @PageRefID = PageRefID, @PageID = PageID, @PageVisible = PageVisible
FROM dbo.viewPage
WHERE PageID = @RootID

Det er bare ikke ret meget det du nok skal forsøge dig med er om du ikke kan finde en måde at eliminerer rekursionen og specielt din måde at lave tabellen på.

Hvad sker der hvis flere eksekverer din procedure samtidigt, er der så stadigvæk orden i din tblPageRecursionList tabel eller bliver den i virkeligheden ikke fyldt med data fra begge kald samtidigt?
Avatar billede madssch Nybegynder
18. januar 2007 - 09:09 #2
Ok, den ændring har jeg lavet.

Du har fat i noget af det rigtige: eksekverer 2 personer funktionen samtidig, bliver der sikker rod i det. Derfor har jeg også rodet lidt med, at omdanne tblPageRecursionList til en temp-tabel. Her har jeg bare et problem med at udtrække dataene fra min ASP side.

Jeg kan ikke se, hvordan jeg skal kunne eliminere rekursionen, når min tabelopbygning ser sådan ud:

PageID - PageRefID - PageTitle - ...

Hvordan vil du ellers opbygge den?
Avatar billede Slettet bruger
18. januar 2007 - 09:13 #3
Så vidt jeg lige kan se har du tail-recursion og det kan du skrive om til et loop.
Avatar billede madssch Nybegynder
18. januar 2007 - 09:15 #4
Og i så fald ville jeg også kunne sætte prioritet på det loop..?

Er det få linjer du kunne brygge sammen? Som sagt rækker mine egne evner ikke langt hér...  :)
Avatar billede madssch Nybegynder
23. februar 2007 - 11:09 #5
Spg. lukket.

Jeg har fået omskrevet hele STP'en, så den nu virker med temp-tabeller m.v. Jeg kan desværre ikke offentliggøre koden, da den har kostet mig nogle DKK.

Tak for hjælpen alligevel.
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