|
Blocaje
Last post 11-08-2008, 2:14 PM by step. 28 replies.
-
10-29-2008, 9:33 AM |
-
ignatandrei
-
-
-
Joined on 11-17-2006
-
Bucuresti
-
sysadmin
-
-
|
step:procedura stocata
SELECT dbo.Detalii.ProdusID, SUM(dbo.Detalii.Cantit) AS cantitE, dbo.BC.Predator
FROM dbo.BC INNER JOIN
dbo.Detalii ON dbo.BC.ID = dbo.Detalii.ID INNER JOIN
dbo.NirD ON dbo.Detalii.ReceptieID = dbo.NirD.ID
INNER JOIN dbo.NIR ON dbo.NirD.NirID = dbo.NIR.nirID
WHERE (dbo.BC.AnulatDe IS NULL)
GROUP BY dbo.Detalii.ProdusID, dbo.BC.Predator, dbo.NirD.NirID
HAVING (dbo.Detalii.ProdusID = @produsID) AND (dbo.BC.Predator = @Predator) AND (dbo.NirD.NirID = @id)
view ul
SELECT SUM(dbo.Detalii.Cantit) AS Cantit, dbo.Detalii.ProdusID, dbo.Detalii.SarjaID, dbo.BC.ID, 0 AS Modif
FROM dbo.Detalii INNER JOIN
dbo.BC ON dbo.BC.ID = dbo.Detalii.ID
GROUP BY dbo.Detalii.ProdusID, dbo.Detalii.SarjaID, dbo.BC.ID
Dupa cite vad , amindoua folosesc aceleasi 2 tabele :Detalii si BC - si probabil de aceea ai lock-ul ... E vreuna care nu trebuie sa fie executata "real-time" - de ex., am impresia ca procedura stocata este folosita pentru raportare dupa parametri ...
Ignat Andrei http://serviciipeweb.ro/iafblog
|
|
-
10-29-2008, 10:17 AM |
-
rremus
-
-
-
Joined on 11-16-2006
-
-
sysadmin
-
-
|
step:situatia 1:
era un view (select), o procedura stocata ( select )
si mai era o procedura stocata care facea insert si care avea begin tran ...
pe server primele doua nu era un tranzactie , in client -nu aveam tranzactie (cel putin in ultimele versiuni ale mele)
toate cele 3 procese erau pe server in blocaj
si cand a eliminat primele doua -s-a deblocat si al 3 proces
situatia
Potzi sa ne spui ce methodologie ai avut cind ai investigat blocajele respective? Cum ai vazut ca 3 procese sint blocate, cum ai eliminat primele 2 etc etc. Fara sa ne spui detaliile ne ramine doar sa ghicim ce ai facut. Un scenariu ar fi ca te-ai conectat cu SSMS, ai rulat sp_who, sp_who2 sau altceva asemanator, ai vazut ca 3 procese erau 'blocate'. Asta ar insemna ca in coloana BlkBy exista ceva. Sa zicem ca ai vazut ca SPID 51 (selectul), 52 (procedura) si 53 (insertul) erau 'blocate', deci aveau o valoare in BlkBy. Cine le bloca? Era o relatie circulara (51 si 52 blocate de 53, 53 blocate de 51 de ex care ar insemna un deadlock) ? Erau intr-o relatie lineara (51 blocat de 53 si 53 blocat de 52 de ex) si in acest caz, cine il bloca pe ultimul din serie? Erau blocate de un al 4-lea SPID (si in acest caz cine era acest al 4-lea spid si ce facea)? Pina nu stim astfel de detalii toate sfaturile care le vei primi vor fi banuieli si incercari. E drept, venind de la niste oameni cu experienta si care au sansa (mare) sa nimereasca exact problema, dar la fel de bine ne putem invirti in cerc o saptamina fara nici un progress. Eu in primul rind tzi-as recomanda sa urmezi metodologia descrisa in KB 271509 'How to monitor blocking in SQL Server'. Instaleaza procedura sp_blocker_pss80 din articol si urmeaza sfaturile de acolo despre cum sa o rulezi periodic si apoi vezi daca procedura indica vreun batch ca fiind mereu cauza blocarilor, si putem continua de acolo. Si nu in ultimul rind ia in considerare ca exista si altfel de blocaje decit cele cauzate de locks. In primul rind exista blocaje cauzate de filegrowth cind bazat ta de date sau log-ul sau umplut si sint periodic expandate. Uitate in perfmon counters pentru database ca sa vezi daca exista 'Log Growths' (select * from sys.dm_os_performance_counters where counter_name = 'Log Growths') sau daca exista database grow events (astea trebuie sa le cautzi in ERRORLOG din pacate). Alte cauza care pot genera blocaje pot fi limitari de resurse: memorie (caz in care in ERRORLOG ar aparea erori 701 sau 801/802), CPU (caz in care in work_queue_count in sys.dm_os_schedulers ar incepe sa creasca), retea (daca clientul nu proceseaza suficient de rapid resultatele). Script-ul de la KB 271509 poate identifica toate aceste cazuri din fericire. Cit despre dirty reads si NOLOCK, daca asta e ce doresti dezinstaleaza SQL acuma si treci la MS Access.
http://rusanu.com
|
|
-
10-29-2008, 11:30 AM |
-
10-29-2008, 12:53 PM |
-
ignatandrei
-
-
-
Joined on 11-17-2006
-
Bucuresti
-
sysadmin
-
-
|
step:
In ceea ce priveste dirty reads -pot sa il folosesc -mai ales pt situatiile statistice -pt ca nu sunt acordate permisiuni de update/delete .
Daca sunt situatii statistice ... si sunt de acum x zile ( unde x>0) poti sa te gindesti la o alta BD, in care sa replici datele la 12 noaptea ( de ex.) si sa citesti de acolo. Totusi, te-as sfatui, cum zice remus , sa dai mai multe detalii referitoare la step:
blocajele au fost descoperite din Activity Monitor .
Ignat Andrei http://serviciipeweb.ro/iafblog
|
|
-
-
-
10-29-2008, 1:55 PM |
-
ignatandrei
-
-
-
Joined on 11-17-2006
-
Bucuresti
-
sysadmin
-
-
|
rremus: ignatandrei: Daca sunt situatii statistice ... si sunt de acum x zile ( unde x>0) poti sa te gindesti la o alta BD, in care sa replici datele la 12 noaptea ( de ex.) si sa citesti de acolo.
Nu ca vreau sa fiu gica contra :) dar mai simplue sa faci un Snapshot database (create database ... as snapshot of ...)
scuze,Remus Pentru mine "replici datele " era un termen generic ... care putea insemna orice (snapshot, log shipping, database mirroring, backup and restore, solutie custom intr-o aplicatie ...) Stiu ca nu am folosit termenul corect, insa nu imi dau seama care ar fi ...
Ignat Andrei http://serviciipeweb.ro/iafblog
|
|
-
10-29-2008, 2:08 PM |
-
10-29-2008, 6:23 PM |
-
10-29-2008, 10:53 PM |
-
ignatandrei
-
-
-
Joined on 11-17-2006
-
Bucuresti
-
sysadmin
-
-
|
step:Si astept, si astept ...
Si aflu ca cei din compania respectiva au intrat in concediu fortat cateva zile (cu criza au scazut comenzile)
Mda... de ce nu faci tu exact ce face aplicatia intr-o aplicatie .NET , care lanseaza 100 de thread-uri...poate reusesti sa reproduci problema. Pe de alta parte- iata problema rezolvata
Ignat Andrei http://serviciipeweb.ro/iafblog
|
|
-
10-30-2008, 11:22 AM |
-
ignatandrei
-
-
-
Joined on 11-17-2006
-
Bucuresti
-
sysadmin
-
-
|
step:Si astept, si astept ...
Si aflu ca cei din compania respectiva au intrat in concediu fortat cateva zile (cu criza au scazut comenzile)
tocmai a aparut un articol despre blocaje... vezi daca merge http://www.sqlservercentral.com/articles/Blocking/64474/
Ignat Andrei http://serviciipeweb.ro/iafblog
|
|
-
11-04-2008, 11:21 AM |
-
alinescoo
-
-
-
Joined on 02-14-2007
-
-
db_owner
-
-
|
Intru si eu in discutie, poate cu ocazia asta ma mai lamuresc. Tot probleme cu blocaje pe un server SQL 2005. Dupa indelungi cautari si incercari am facut o procedura stocata care imi returneaza informatii despre cine blocheaza si pe cine blocheaza. Problema e ca nu reusesc sa adaptez procedura sa vad exact ce parametri sunt folositi. Dau un exemplu:
Query1:
create table ##TblTest (SomeColumn int)
go
begin transaction
insert into ##TblTest (SomeColumn) values (1)
waitfor delay '0:01:40' /* hold the transaction open for 40 seconds */
go
commit transaction
Query2:
SELECT * FROM ##tblTest WHERE somecolumn=1
La rularea procedurii imi apare ca primul query il blocheaza pe al doilea.Folosing sys.dm_exec_sql_text imi la al doilea proces imi afiseaza query-ul ca fiind:
(@1 tinyint)SELECT * FROM [##tblTest] WHERE [somecolumn]=@1
Deci, nu stiu ce valoare are @1. Am incercat si cu Inputbuffer dar tot nu afiseaza ce se intampla pentru cazurile 'real life' de ex, cand se salveaza o factura, se executa o procedura... totul e cu parametri @x
Atasez procedura poate aveti mai multa inspiratie:
Create PROCEDURE [dbo].[sp_GetBlockingStatus]
AS
BEGIN
SET NOCOUNT ON;
WITH Blocking(SPID, SPIDCareBlocheaza, Query, RowNo, LevelRow)
AS
(
SELECT s.SPID,
s.BlockingSPID,
s.Definition,
ROW_NUMBER() OVER(ORDER BY s.SPID),
0 AS LevelRow
FROM (SELECT s.spid, BlockingSPID = s.blocked, DatabaseName = DB_NAME(s.dbid),
s.program_name, s.loginame, ObjectName = OBJECT_NAME(objectid,s.dbid),
Definition = CAST(text AS VARCHAR(MAX))
FROM sys.sysprocesses s CROSS APPLY sys.dm_exec_sql_text (sql_handle)
WHERE s.spid > 50 ) s
JOIN
(SELECT s.spid, BlockingSPID = s.blocked, DatabaseName = DB_NAME(s.dbid),
s.program_name, s.loginame, ObjectName = OBJECT_NAME(objectid,s.dbid),
Definition = CAST(text AS VARCHAR(MAX))
FROM sys.sysprocesses s CROSS APPLY sys.dm_exec_sql_text (sql_handle)
WHERE s.spid > 50 ) s1 ON s.SPID = s1.BlockingSPID
WHERE s.BlockingSPID = 0
UNION ALL
SELECT r.SPID,
r.BlockingSPID,
r.Definition,
d.RowNo,
d.LevelRow + 1
FROM (SELECT s.spid, BlockingSPID = s.blocked, DatabaseName = DB_NAME(s.dbid),
s.program_name, s.loginame, ObjectName = OBJECT_NAME(objectid,s.dbid),
Definition = CAST(text AS VARCHAR(MAX))
FROM sys.sysprocesses s CROSS APPLY sys.dm_exec_sql_text (sql_handle)
WHERE s.spid > 50 ) r
JOIN Blocking d ON r.BlockingSPID = d.SPID
WHERE r.BlockingSPID > 0
)
SELECT SPID, SPIDCareBlocheaza, Query, RowNo, LevelRow FROM Blocking
ORDER BY RowNo, LevelRow
END
|
|
-
11-04-2008, 11:43 AM |
-
11-08-2008, 2:14 PM |
Page 2 of 2 (29 items)
2
|
|
|