[MSSQL] Bardzo różny czas wykonania procedury

0

Cześć, nie wiem o co chodzi, ale czasem procedura(moja własna) wykonuje mi się 3 sekundy, czasem minutę, czasem pół minuty. Generalnie najczęściej chyba to są 3 sekundy, ale czasem można czekać i się nie doczekać :|

Czym to może być spowodowane? Nic się nie zapętla, bo prędzej, czy później procedura się i tak wykonuje. Czy problem może leżeć w widoku?
Miał ktoś coś takiego kiedyś?

SZBD: MSSQL 2005 Express.

0

Wpływ na czas wykonywania procedury może mieć wiele czynników, m.in. ilość użytkowników korzystających z bazy w danym momencie, zadania jakie wykonują czy ogólne obciążenie serwera, na którym znajduje się baza.

0
Marcin napisał(a)

Wpływ na czas wykonywania procedury może mieć wiele czynników, m.in. ilość użytkowników korzystających z bazy w danym momencie, zadania jakie wykonują czy ogólne obciążenie serwera, na którym znajduje się baza.

Tylko ja jestem na serwerze.
Nadmienię jeszcze, że dane w bazie są oczywiście takie same.

0

A co robi ta procedura? Najlepiej jakbyś wkleił kod.

0

może się przyda:

SET NOCOUNT ON;
GO

CREATE TABLE random_data
(
GUIDcol uniqueidentifier
);
GO

-- pętla WHILE - niewydajnie (17 sek.)
DECLARE @i int;
SET @i =0;
WHILE(@i < 50000)
BEGIN
   INSERT INTO random_data(GUIDcol) SELECT NEWID();
   SET @i = @i +1;
END

TRUNCATE TABLE random_data;
GO

-- pętla WHILE - wydajnie (1 sek., 17 razy szybciej)
DECLARE @j int;
SET @j =0;
BEGIN TRAN;
WHILE(@j < 50000)
BEGIN
   INSERT INTO random_data(GUIDcol) SELECT NEWID();
   SET @j = @j +1;
END
COMMIT TRAN;

TRUNCATE TABLE random_data;
GO

-- execution loop - niewydajnie (24 sek.)
INSERT INTO random_data(GUIDcol) SELECT NEWID();
GO 50000

TRUNCATE TABLE random_data;
GO

-- execution loop - wydajnie (4 sek., 6 razy szybciej)
BEGIN TRAN;
GO
INSERT INTO random_data(GUIDcol) SELECT NEWID();
GO 50000
COMMIT TRAN;

-- DROP TABLE random_data;
0
Marcin napisał(a)

A co robi ta procedura? Najlepiej jakbyś wkleił kod.

To nie jest takie proste :P
Bo procedura wywołuje inne procedury i funkcje itd.
Generalnie opisywałem to w temacie o kursorach i optymalizacji.

Z moich testów(ale niekoniecznie są poprawne) wynika, że najdłużej trwa wywołanie....widoku :|
Ale widok nie jest taki skomplikowany bardzo. To jest 5 joinów i zagnieżdżony case(case w casie).
I generalnie trwa to moment, ale czasami.... No masakra.

Więc nie podejrzewam, żeby błąd był w kodzie.

0

Może to przez locki? Spróbuj wszystkie selecty przekształcić w ten sposób:

select * 
from dbo.tabela1 t1 with (nolock)
left join dbo.tabela2 t2 with (nolock) on t1.pole = t2.pole

czyli w skrócie dodaj wszędzie "dbo.", dodaj aliasy oraz wyrażenie "with (nolock)".

0

dbo miałem, natomiast ten with zdaje się nie pomagać.
Tzn. zauważam teraz, że alter procedure czasami od razu idzie, a czasami trwa ponad minutę :|

Ponadto, jak chciałem zmodyfikować widok, to też czekałem sporo czasu, żeby się pokazał kod. Czy to może być coś z serwerem nie tak? Powtarzam, że jestem jedynym podłączonym.

0

Może to być wina serwera ale na odległość mogę tylko gdybać.

1 użytkowników online, w tym zalogowanych: 0, gości: 1