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


Skulle behöva hjälp med att få denna procedur snabbare!

Postades av 2005-04-04 14:45:43 - Joakim Dörner, i forum sql-server/msde, Tråden har 7 Kommentarer och lästs av 1019 personer

Hej
Jag har skrivit denna procedur problemet nu är att den är för långsam. Har försökt få den bättre. Skulle vara tacksam för all hjälp.
use fir
go


create procedure dbo.P_MatrisVarde_SelPR
(
@Where varchar(800)
)
as
BEGIN

SET NOCOUNT ON

Begin

CREATE TABLE #tmpResult (idmatris int, aktuellperiod char(10), period char(10), idvariabel int, namn char(50), varde int)

--Lägger dit ett index
CREATE INDEX I_Index ON dbo.#tmpResult
(idmatris, aktuellperiod, period, idvariabel, namn, varde)

EXEC('INSERT INTO #tmpResult (idmatris, aktuellperiod, period, idvariabel, namn, varde)
SELECT MV.IdMatris, M.AktuellPeriod, MV.Period, MV.IdVariabel, V.Namn, MV.Varde
FROM MatrisVarde MV
JOIN Matris M
ON M.IdMatris = MV.IdMatris
JOIN Variabel V
ON MV.IdVariabel = V.IdVariabel '
+ @WHERE +
'ORDER BY MV.IdVariabel, MV.IdMatris DESC')

--Loopar igenom variabel för variabel för att kolla att den finns för alla idmatriser
DECLARE @idvariabel int,
@idmatris int,
@varde1 int,
@varde2 int,
@diff int,
@diffprocent int,
@grans int

SET @varde1 = -1
SET @varde2 = -1
SET @grans = (SELECT GransStorRevidering FROM Parametervarden
WHERE AktuellPeriod = (SELECT DISTINCT AktuellPeriod FROM #tmpResult))

CREATE TABLE #tmpFinalresult (idmatris int, aktuellperiod char(10), period char(10),idvariabel int, namn char(50), varde int, diff int, diffprocent int)

--Lägger dit ett index
CREATE INDEX I_Index ON dbo.#tmpFinalresult
(idmatris, aktuellperiod, period, idvariabel, namn, varde, diff, diffprocent)

DECLARE variabel_cursor CURSOR FOR
SELECT DISTINCT idvariabel FROM #tmpResult ORDER BY idvariabel DESC

OPEN variabel_cursor

FETCH NEXT FROM variabel_cursor
INTO @idvariabel

--Loopar variabler
WHILE @@FETCH_STATUS = 0

BEGIN
DECLARE idmatris_cursor CURSOR FOR
SELECT DISTINCT idmatris FROM #tmpResult ORDER BY idmatris ASC
OPEN idmatris_cursor
FETCH NEXT FROM idmatris_cursor
INTO @idmatris

--Loopar matriser
WHILE @@FETCH_STATUS = 0
BEGIN
IF exists(SELECT 1 FROM #tmpResult WHERE idmatris = @idmatris AND idvariabel=@idvariabel)
BEGIN
SET @varde1 = (SELECT varde FROM #tmpResult WHERE idmatris = @idmatris AND idvariabel = @idvariabel)
END
ELSE
BEGIN
--Sätter in en rad för idmatris idvariabel som inte finns
SET @varde1 = 0
END

IF @varde2 = -1
BEGIN
--Kod om det är den första post som inte har någon att jämföras med SET @diffprocent = 0
END
ELSE
BEGIN
SET @diff = 0
SET @diffprocent = 0
IF @varde1 <> 0 OR @varde2 <> 0
BEGIN
--Kod för att beräkna diff
SET @diff = (@varde1-@varde2)
IF @varde2 <> 0
BEGIN
SET @diffprocent = ((@diff*0.1)/(@varde2*0.1)*100.0)
END
ELSE
BEGIN
SET @diffprocent = 100
END
END
ELSE
BEGIN
SET @diff = 0
SET @diffprocent = 0
END
IF @diffprocent <> 0
BEGIN
INSERT INTO #tmpFinalresult (idmatris, aktuellperiod, period, idvariabel, namn, varde, diff, diffprocent)
SELECT idmatris, aktuellperiod, period, idvariabel, namn, varde, @diff, @diffprocent
FROM #tmpResult
WHERE idmatris = @idmatris AND idvariabel = @idvariabel
END
END
SET @varde2 = @varde1
FETCH NEXT FROM idmatris_cursor
INTO @idmatris

END
SET @varde2 = -1
CLOSE idmatris_cursor
DEALLOCATE idmatris_cursor
FETCH NEXT FROM variabel_cursor
INTO @idvariabel
END

CLOSE variabel_cursor
DEALLOCATE variabel_cursor

--Väljer det som skickas upp till applikationen
SELECT idmatris, aktuellperiod, period, idvariabel, namn, varde, diff, diffprocent FROM #tmpFinalresult WHERE diffprocent >= @grans ORDER BY IdVariabel, IdMatris DESC

DROP TABLE #tmpResult
DROP TABLE #tmpFinalresult
End

END


Svara

Sv: Skulle behöva hjälp med att få denna procedur snabbare!

Postades av 2005-04-04 17:38:46 - Mikael Wedham

OK, beskriv gärna vad du har (vilka tabeller och värden) och vad du vill ha tag på.

Jag fattar att den inte är snabb, men den behöver inte snabbas upp, utan skrivas om.

/micke


Svara

Sv: Skulle behöva hjälp med att få denna procedur snabbare!

Postades av 2005-04-04 18:14:29 - Göran Andersson

Oj, inte konstigt om det går långsamt. Jag håller med Mikael, koden behöver skrivas om rejält, så tala om vad du försöker göra.

Det är inte helt otänkbart att det skulle gå att få ut resultatet med en enda fråga, utan temporära tabeller och allting, vilket skulle gå oerhört mycket snabbare.

Det finns ju visserligen vissa saker i koden som går att förbättra, till exempel den här koden:

IF exists(SELECT 1 FROM #tmpResult WHERE idmatris = @idmatris AND idvariabel=@idvariabel)
BEGIN
	SET @varde1 = (SELECT varde FROM #tmpResult WHERE idmatris = @idmatris AND idvariabel = @idvariabel)           
END
ELSE
BEGIN
	--Sätter in en rad för idmatris idvariabel som inte finns
	SET @varde1 = 0
END

kan du göra om till:
SET @varde1 = 0
SELECT @varde1 = varde FROM #tmpResult WHERE idmatris = @idmatris AND idvariabel = @idvariabel


Svara

Sv: Skulle behöva hjälp med att få denna procedur snabbare!

Postades av 2005-04-05 08:58:34 - Ola Lindfeldt

Som redan har sagts tror jag också att en helt annan lösning är den med #temp tabeller vore bäst.

Några tips bara..

Testa att byta ut temptabelen till en Table-variabel:
declare @TmpList table (ID int IDENTITY, RadNr int)

Du skapar ett stort index över flera kolumner i din temp-tabell..
Behöver du index på allt? för mycket index segar ner inserts.
Du ska självklart ha index på det som du villkorar på!



EXEC ('variabel SQL')

är alltid en nackdel. Försök bygga bort det.



"Loopar igenom variabel för variabel "


Farligt.. dåligt.. försök tänka i mängder och joins i stället.... ?




SELECT DISTINCT AktuellPeriod


AktuellPeriod är förstås INDEXERAD?? :)







SELECT DISTINCT idmatris


idmatris indexerad?



AND idvariabel = @idvariabel

idvariabel indexerad?
(indexera kolumnerna var för sig... Create index..)


WHERE diffprocent >= @grans ORDER BY IdVariabel, IdMatris DESC

indexera diffprocent


Svara

Sv:Skulle behöva hjälp med att få denna procedur snabbare!

Postades av 2005-04-05 09:41:06 - Joakim Dörner

Ok
Skall försöka förklara
Tabellerna jag har är dessa


TABLE Matris 
	IdMatris numeric(15, 0) IDENTITY (1, 1) NOT NULL ,
	AktuellPeriod varchar (10) NOT NULL ,
	IdStatus varchar (10) NULL ,
	Kommentar varchar (255) NULL ,
	UppdatDatum datetime NULL ,
	UppdatAnvandare varchar (30) NULL ,
	StatusNr char (3) NULL ,
	

TABLE MatrisVarde 
	IdMatris T_IdMatris NOT NULL ,
	Period varchar (10) NOT NULL ,
	IdMedlemKonto T_IdMedlem NOT NULL ,
	IdMedlemSektor T_IdMedlem NOT NULL ,
	IdMedlemKontopost T_IdMedlem NOT NULL ,
	IdMedlemMotsektor T_IdMedlem NOT NULL ,
	IdMedlemKontoslag T_IdMedlem NOT NULL ,
	MatrisTyp char (1) NULL ,
	IdVariabel T_IdVariabel NULL ,
	Varde T_Varde NULL ,
	ValtFranKontoslag T_IdMedlem NULL ,
	UppdatDatum T_UppdatDatum NULL ,
	UppdatAnvandare T_UppdatAnvandare NULL ,
	

TABLE Variabel
	IdVariabel T_IdVariabel IDENTITY (1, 1) NOT NULL ,
	IdMedlemKonto T_IdMedlem NULL ,
	ExtIdKonto T_ExtId NULL ,
	IdMedlemSektor T_IdMedlem NULL ,
	ExtIdSektor T_ExtId NULL ,
	IdMedlemKontoslag T_IdMedlem NULL ,
	ExtIdKontoslag T_ExtId NULL ,
	IdMedlemKontopost T_IdMedlem NULL ,
	ExtIdKontopost T_ExtId NULL ,
	IdMedlemMotsektor T_IdMedlem NULL ,
	ExtIdMotsektor T_ExtId NULL ,
	Namn varchar (255) NULL ,
	KortNamn varchar (40) NULL ,
	GiltigFrom varchar (10) NULL ,
	GiltigTom varchar (10) NULL ,
	UppdatDatum T_UppdatDatum NULL ,
	UppdatAnvandare T_UppdatAnvandare NULL ,


De jag först gör är att plockar ut uppgifterna från tabellerna som anv har valt i formuläret och stoppar in i en temp tabell.

CREATE TABLE #tmpResult (idmatris int, aktuellperiod char(10), period char(10), idvariabel int, namn char(50), varde int) 

--Lägger dit ett index 
CREATE INDEX I_Index ON dbo.#tmpResult 
(idmatris, aktuellperiod, period, idvariabel, namn, varde) 

EXEC('INSERT INTO #tmpResult (idmatris, aktuellperiod, period, idvariabel, namn, varde) 
    SELECT MV.IdMatris, M.AktuellPeriod, MV.Period, MV.IdVariabel, V.Namn, MV.Varde 
    FROM MatrisVarde MV 
    JOIN Matris M 
    ON M.IdMatris = MV.IdMatris 
    JOIN Variabel V 
    ON MV.IdVariabel = V.IdVariabel ' 
    + @WHERE + 
    'ORDER BY MV.IdVariabel, MV.IdMatris DESC') 


Resultatet i den tabellen borde se ut som nedan.

IDmatris Variabel Värde
172 431 100
175 431 50
216 431 40

172 522 100
216 522 50

Sedan skall jag för varje variabell loppa igenom alla idmatriser och se om kombinationen finns, finns den spar man värdet för den raden annars sätter man värdet till 0. Sedan vid nästa lopp skall det värde man får fram jämföras med föregående värde som man har sparat undan.

tex
172 431 jämförs med 175 431
men
172 522 skall inte jämföras med 216 522 utan måste jämföras med 0

Diffen räknas ut i både värde och % resultatet stoppas in i en ny temp tabell
Sist väljs de värden ut som överstiger @grans som plockas fram tidigare.

Resultatet skall bli enligt nedan

IDmatris Variabel Värde Diff% Diffvärde
172 431 100 100% 50

172 522 100 100% 50

Hoppas beskrivningen räcker

/Joakim




Svara

Sv:Skulle behöva hjälp med att få denna procedur snabbare!

Postades av 2005-04-05 10:41:05 - Joakim Dörner

Hur bygger jag bort detta bäst

EXEC('INSERT INTO #tmpResult (idmatris, aktuellperiod, period, idvariabel, namn, varde)
		SELECT MV.IdMatris, M.AktuellPeriod, MV.Period, MV.IdVariabel, V.Namn, MV.Varde
		FROM MatrisVarde MV
		JOIN Matris M
		ON M.IdMatris = MV.IdMatris
		JOIN Variabel V
		ON MV.IdVariabel = V.IdVariabel '
		+ @WHERE +
		'ORDER BY MV.IdVariabel, MV.IdMatris DESC')

Vill ha så att where satsen byggs dynamiskt beroende på vad användaren väljer
Koden i vb.net ser ut så här

          'Skapar den dynamiska Where-satsen
                sqlWhere = "WHERE ( MV.Period = '" + Period + "'"
                If Konto <> "" Then
                    sqlWhere = sqlWhere & " AND MV.IdMedlemKonto = '" + CStr(Konto) + "'"
                End If

                If Sektor <> "" Then
                    sqlWhere = sqlWhere & " AND MV.IdMedlemSektor = '" + CStr(Sektor) + "'"
                End If

                If Kontoslag <> 0 Then
                    sqlWhere = sqlWhere & " AND MV.IdMedlemKontoslag = '" + CStr(Kontoslag) + "'"
                End If

                sqlWhere = sqlWhere & ") "



/Joakim


Svara

Sv: Skulle behöva hjälp med att få denna procedur snabbare!

Postades av 2005-04-05 20:34:21 - Göran Andersson

Du kan jämföra värdet i tabellen med sig självt om användaren inte valt något:

WHERE MV.Period = @Period
AND MV.IdMedlemKonto = ISNULL(@Konto, MV.IdMedlemKonto)
AND MV.IdMedlemSektor = ISNULL(@Sektor, MV.IdMedlemSektor)
AND MV.IdMedlemKontoslag = ISNULL(@Kontoslag, MV.IdMedlemKontoslag)


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 619
27 953
271 709
470
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