május 2015 havi bejegyzések

Tábla paraméteres lekérdezés optimalizálás másképp

Mivel rendszeresen belefutok, hát időszerűnek találom leírni. Van olyan, hogy egy tárolt eljárás  tökéletesen jól van megírva, nincs mit javítani rajta, ám mégis teljesítmény problémákat okoz. A példánk legyen egy nagyon egyszerű eljárás:

create procedure usp_users_get_list
	@user_list user_list readonly
as
begin
	set nocount on;

	select
		u.name
	from users u
	join @user_list l
		on u.id = l.id
end

Felhasználók neveit adja vissza egy kapott id lista alapján. Nagyon egyszerű, nincs mit lefaragni róla, ám a szerver küzd vele, mert egy másodperc alatt meglehetősen sokszor hívják.

Több irányba lehet indulni, én azzal kezdtem, hogy megnézzem a trace-eket. Egy dolog érdekelt (mivel a DMV-kből minden más megvolt), a textdata. Pár percnyi trace megvizsgálása után kiderült, hogy a @user_list táblaváltozó az esetek 99%-ában 1 sort tartalmaz. Ezt kerestem, ebben bíztam 🙂

Inner már a megoldás adja magát, kell egy olyan SP, aminek 1 @user_id bemenő paramétere van, így megspórolunk egy join-t, na meg jó sok processzor időt. A teljesség kedvéért írjuk meg az eljárást:

create procedure usp_user_get
	@user_id int
as
begin
	set nocount on;

	select
		name
	from users
	where id = @user_id
end

Már csak az alkalmazást kell felkészíteni, hogy tudja, mikor melyik eljárást kell hívja.
Nálam a leglátványosabb javulás az volt, amikor a CPU használat 80%-ról 4%-ra esett vissza csak azzal, hogy amikor lehetett már az új eljárást hívta az alkalmazás.

A tanulság pedig az, hogy az SQL-ben nem is olyan könnyű általános kódokat írni.

Reklámok