Fetstil Fetstil Kursiv Understrykning linje färgläggning tabellverk Punktlista Nummerlista Vänster Centrerat högerställt Utfyllt Länk Bild htmlmode
  • Forum & Blog
    • Forum - översikt
      • .Net
        • asp.net generellt
        • c#
        • vb.net
        • f#
        • silverlight
        • microsoft surface
        • visual studio .net
      • databaser
        • sql-server
        • databaser
        • access
        • mysql
      • mjukvara klient
        • datorer och komponenter
        • nätverk, lan/wan
        • operativsystem
        • programvaror
        • säkerhet, inställningar
        • windows server
        • allmänt
        • crystal reports
        • exchange/outlook
        • microsoft office
      • mjukvara server
        • active directory
        • biztalk
        • exchange
        • linux
        • sharepoint
        • webbservers
        • sql server
      • appar (win/mobil)
      • programspråk
        • c++
        • delphi
        • java
        • quick basic
        • visual basic
      • scripting
        • asp 3.0
        • flash actionscript
        • html css
        • javascript
        • php
        • regular expresssion
        • xml
      • spel och grafik
        • DirectX
        • Spel och grafik
      • ledning
        • Arkitektur
        • Systemutveckling
        • krav och test
        • projektledning
        • ledningsfrågor
      • vb-sektioner
        • activeX
        • windows api
        • elektronik
        • internet
        • komponenter
        • nätverk
        • operativsystem
      • övriga forum
        • arbete karriär
        • erbjuda uppdrag och tjänster
        • juridiska frågor
        • köp och sälj
        • matematik och fysik
        • intern information
        • skrivklåda
        • webb-operatörer
    • Posta inlägg i forumet
    • Chatta med andra
  • Konto
    • Medlemssida
    • Byta lösenord
    • Bli bonsumedlem
    • iMail
  • Material
    • Tips & tricks
    • Artiklar
    • Programarkiv
  • JOBB
  • Student
    • Studentlicenser
  • KONTAKT
    • Om pellesoft
    • Grundare
    • Kontakta oss
    • Annonsering
    • Partners
    • Felanmälan
  • Logga in

Hem / Forum översikt / inlägg

Posta nytt inlägg


Någon som har en effektivare lösning än den här?

Postades av 2002-10-02 13:46:16 - Pontus Wång, i forum sql-server/msde, Tråden har 7 Kommentarer och lästs av 1570 personer

Kan någon effektivisera detta ytterliggare (och gärna komma förbi hindret på 32 djup i rekursiviteten). Jag har mekat med det ett tag nu och nu har det tagit slut på fantasin!

Har följande tabell:

CREATE TABLE [thr_threads] (
[pst_id] [int] NOT NULL ,
[pst_id_answer] [int] NOT NULL ,
[thr_isreferenced] [bit] NOT NULL,
[thr_date] [datetime] NOT NULL
) ON [PRIMARY]
GO

Och följande SP's:


CREATE PROC GetThreads
@pst_id int
AS
CREATE TABLE #Threads
(
[pst_id] int,
[pst_id_answer] int,
[thr_isreferenced] bit,
[thr_date] datetime,
[thr_depth] int
)
EXEC GetThread @pst_id
SELECT DISTINCT * FROM #Threads

GO

CREATE PROC GetThread
@pst_id int
AS
SET NOCOUNT ON

DECLARE @pst_id_next int, @count int

DECLARE Thread CURSOR LOCAL FOR
SELECT [pst_id_answer]
FROM [thr_threads]
WHERE pst_id = @pst_id

OPEN Thread

FETCH NEXT FROM Thread
INTO @pst_id_next

WHILE @@FETCH_STATUS = 0
BEGIN
INSERT INTO #Threads ([pst_id], [pst_id_answer], [thr_isreferenced], [thr_date], [thr_depth])
SELECT *, (@@NESTLEVEL - 1) AS thr_depth FROM thr_threads WHERE pst_id = @pst_id
IF (SELECT ISNULL(COUNT(*),0) FROM thr_threads WHERE pst_id IN (SELECT pst_id_answer FROM thr_threads WHERE pst_id = @pst_id)) > 0
BEGIN
EXEC GetThread @pst_id_next
END
FETCH NEXT FROM Thread
INTO @pst_id_next
END
CLOSE Thread
DEALLOCATE Thread

GO


Svara

Sv: Någon som har en effektivare lösning än den hä

Postades av 2002-10-02 14:52:44 - Andreas Hillqvist

Lite data vore inte fel. Så man ser hur strukturen är tänkt.


Svara

Sv: Någon som har en effektivare lösning än den hä

Postades av 2002-10-02 15:24:39 - Pontus Wång

lite data:
INSERT INTO [thr_threads]([pst_id], [pst_id_answer], [thr_isreferenced], [thr_date])
VALUES (11233, 11241, 0, '2002-09-24 14:19:08.893')
INSERT INTO [thr_threads]([pst_id], [pst_id_answer], [thr_isreferenced], [thr_date])
VALUES (11233, 11254, 0, '2002-09-24 14:19:08.903')
INSERT INTO [thr_threads]([pst_id], [pst_id_answer], [thr_isreferenced], [thr_date])
VALUES (11233, 11299, 0, '2002-09-24 14:19:05.020')
INSERT INTO [thr_threads]([pst_id], [pst_id_answer], [thr_isreferenced], [thr_date])
VALUES (11233, 11419, 0, '2002-09-24 14:19:04.950')
INSERT INTO [thr_threads]([pst_id], [pst_id_answer], [thr_isreferenced], [thr_date])
VALUES (11233, 11498, 0, '2002-09-24 14:19:08.683')
INSERT INTO [thr_threads]([pst_id], [pst_id_answer], [thr_isreferenced], [thr_date])
VALUES (11233, 12081, 0, '2002-09-24 14:19:05.030')
INSERT INTO [thr_threads]([pst_id], [pst_id_answer], [thr_isreferenced], [thr_date])
VALUES (11233, 12090, 0, '2002-09-24 14:19:05.010')
INSERT INTO [thr_threads]([pst_id], [pst_id_answer], [thr_isreferenced], [thr_date])
VALUES (11233, 12102, 0, '2002-09-24 14:19:05.570')
INSERT INTO [thr_threads]([pst_id], [pst_id_answer], [thr_isreferenced], [thr_date])
VALUES (11241, 11255, 0, '2002-09-24 14:19:06.010')
INSERT INTO [thr_threads]([pst_id], [pst_id_answer], [thr_isreferenced], [thr_date])
VALUES (11299, 11304, 0, '2002-09-24 14:19:04.950')
INSERT INTO [thr_threads]([pst_id], [pst_id_answer], [thr_isreferenced], [thr_date])
VALUES (11299, 11348, 0, '2002-09-24 14:19:05.000')
INSERT INTO [thr_threads]([pst_id], [pst_id_answer], [thr_isreferenced], [thr_date])
VALUES (11304, 11337, 0, '2002-09-24 14:19:04.890')
INSERT INTO [thr_threads]([pst_id], [pst_id_answer], [thr_isreferenced], [thr_date])
VALUES (11337, 11347, 0, '2002-09-24 14:19:04.880')
INSERT INTO [thr_threads]([pst_id], [pst_id_answer], [thr_isreferenced], [thr_date])
VALUES (11337, 11349, 0, '2002-09-24 14:19:04.890')
INSERT INTO [thr_threads]([pst_id], [pst_id_answer], [thr_isreferenced], [thr_date])
VALUES (11348, 11365, 0, '2002-09-24 14:19:04.870')
INSERT INTO [thr_threads]([pst_id], [pst_id_answer],[thr_isreferenced], [thr_date])
VALUES (11498, 11519, 0, '2002-09-24 14:19:08.683')


Svara

Sv: Någon som har en effektivare lösning än den hä

Postades av 2002-10-02 17:46:14 - Andreas Hillqvist

Pice of cake.

För att komma förbi hindret med begränsningen av rekursivitet är det ju bara att låta bli att vara rekursiv.

Jag angriper datan nivå vis. Vilket innebär mindre Insert-satser. Vilket borde ge en bättre prestanada. Du skulle ju kuna använda index för att slippa många av de Table Scan som utförs.

Skippat cursor. Eftersom det inte längre behövs. Dessutom är det ju långsamt har jag hört. Inte hunit jämföra själv.

Behöver du verkligen DISTINCT på Select-satsen mot #Threads? Den drar ju mycket prestanda när den sorterar urvalet:

CREATE PROC GetThreads_The_AH_Way
(
@pst_id int
)
AS

CREATE TABLE #Threads
(
pst_id int,
pst_id_answer int,
thr_isreferenced bit,
thr_date datetime,
thr_depth int
)

DECLARE @thr_depth int

SET @thr_depth = 0

INSERT INTO #Threads (pst_id, pst_id_answer, thr_isreferenced, thr_date, thr_depth)
SELECT pst_id, pst_id_answer, thr_isreferenced, thr_date, @thr_depth
FROM thr_threads
WHERE pst_id = @pst_id

WHILE EXISTS (SELECT Null FROM #Threads WHERE thr_depth = @thr_depth)
BEGIN
INSERT INTO #Threads (pst_id, pst_id_answer, thr_isreferenced, thr_date, thr_depth)
SELECT pst_id, pst_id_answer, thr_isreferenced, thr_date, @thr_depth + 1
FROM thr_threads
WHERE pst_id IN (SELECT pst_id_answer FROM #Threads WHERE thr_depth = @thr_depth)

SET @thr_depth = @thr_depth + 1
END


SELECT * FROM #Threads

DROP TABLE #Threads


Svara

Sv: Någon som har en effektivare lösning än den hä

Postades av 2002-10-02 18:31:55 - Pontus Wång

Ahhh, mycket smart Andreas!

Det här var mitt första försök att skriva en rekursiv fråga i sql så jag får skylla på det.

Ja, jag behövde använda distinct, det beror på att när jag rekurserade så fick jag dubbla träffar av någon anledning som jag inte har rett ut än till 100%...


Svara

Sv: Någon som har en effektivare lösning än den hä

Postades av 2002-10-02 18:45:12 - Andreas Hillqvist

Jag är själv nöjd med proceduren.

Skulle vara roligt om man kan förbättra den yttrligare. Eller göra en bättre lösning på ett annat sätt.

Se det som en utmaning Christoffer Hedgate och alla andra experter. ;o)


Svara

Sv: Någon som har en effektivare lösning än den hä

Postades av 2002-10-02 21:18:58 - Pontus Wång

Kanske inte snabbare (har inte testat) men en annorlunda lösning:

CREATE FUNCTION funcGetThread (@pst_id int)
RETURNS @CurrentThread TABLE ([pst_id] int,
[pst_id_answer] int,
[thr_isreferenced] bit,
[thr_date] datetime, [thr_depth] int)
AS
BEGIN
DECLARE @thr_depth int

SET @thr_depth = 1

INSERT INTO @CurrentThread (pst_id, pst_id_answer, thr_isreferenced, thr_date, thr_depth)
SELECT pst_id, pst_id_answer, thr_isreferenced, thr_date, @thr_depth
FROM thr_threads
WHERE pst_id = @pst_id

WHILE EXISTS (SELECT Null FROM @CurrentThread WHERE thr_depth = @thr_depth)
BEGIN
INSERT INTO @CurrentThread (pst_id, pst_id_answer, thr_isreferenced, thr_date, thr_depth)
SELECT pst_id, pst_id_answer, thr_isreferenced, thr_date, @thr_depth + 1
FROM thr_threads
WHERE pst_id IN (SELECT pst_id_answer FROM @CurrentThread WHERE thr_depth = @thr_depth)

SET @thr_depth = @thr_depth + 1
END

INSERT INTO @CurrentThread (pst_id, pst_id_answer, thr_isreferenced, thr_date, thr_depth)
SELECT [pst_id] AS pst_id, [pst_id] AS pst_id_answer, 0 AS thr_isreferenced, [pst_date] AS thr_date, 0 AS thr_depth
FROM [pst_posts] WHERE pst_id = @pst_id

RETURN
END


Svara

Sv: Någon som har en effektivare lösning än den hä

Postades av 2002-10-02 22:14:45 - Andreas Hillqvist

Ser att du gjort det till en funktion som retunerar en Tabell variabel.


Svara

Nyligen

  • 14:24 CBD regelbundet?
  • 14:23 CBD regelbundet?
  • 14:22 Har du märkt några verkliga fördel
  • 09:09 Vill du köpa medicinska tester?
  • 12:47 Vem beviljar assistansen – kommune
  • 14:17 Någon med erfarenhet av hemstädnin
  • 14:14 Bör man använda sig av en båtförme
  • 14:12 Finns det någon intressant hundblo

Sidor

  • Hem
  • Bli bonusmedlem
  • Läs artiklar
  • Chatta med andra
  • Sök och erbjud jobb
  • Kontakta oss
  • Studentlicenser
  • Skriv en artikel

Statistik

Antal besökare:
Antal medlemmar:
Antal inlägg:
Online:
På chatten:
4 569 615
27 953
271 709
327
0

Kontakta oss

Frågor runt konsultation, rådgivning, uppdrag, rekrytering, annonsering och övriga ärenden. Ring: 0730-88 22 24 | pelle@pellesoft.se

© 1986-2013 PelleSoft AB. Last Build 4.1.7169.18070 (2019-08-18 10:02:21) 4.0.30319.42000
  • Om
  • Kontakta
  • Regler
  • Cookies