Iki iliskili tablo arasinda kayitlarin varligi sorgulanirken sql de "not exists" ifadesi kullaniliriz. Bu nekadar pratik ve yazimi kolay gözüksede performans acisindan büyük sorun cikarmaktadir.
Ve bu performans problemi üst tablolardaki join sayisi arttikca daha da büyümektedir. Bu sorunu cözmek icin "not exists" ifadesi yerine yazacagimiz sorguda JOIN kullanabiliriz.
Örnek olarak;
SELECT dk.VKopf_Nr
FROM Dossier_Kopf dk INNER JOIN
Dossier_Verfahren dv ON DV.Ref_Kopf = DK.VKopf_Nr
WHERE dk.Ref_Instanz='BM' and dk.VKopf_Sprache = 'D'
and DV.Ref_PSchritt IN (6,67)
and not exists (
select ref_dkopf from dbo.Verfahren_Rechtsfolge
where ref_dkopf = dk.VKopf_Nr
)
Yukardaki sorgununu tamamlanma süresi: 00:01:34
Bu sorguyu birde JOIN kullarak yazalim.
SELECT dk.VKopf_Nr
FROM Dossier_Kopf dk INNER JOIN
Dossier_Verfahren dv ON DV.Ref_Kopf = DK.VKopf_Nr
LEFT OUTER JOIN dbo.Verfahren_Rechtsfolge VR
ON DV.Ref_Kopf = VR.ref_dkopf
WHERE dk.Ref_Instanz='BM' and dk.VKopf_Sprache = 'D'
and DV.Ref_PSchritt IN (6,67)
and VR.ref_dkopf is null
Join kullanarak yazilan sorgununu tamamlanma süresi: 00:00:01
Elde ettigimiz sonuc her iki sorgudada aynidir fakat görüldügü gibi sorgularin calisma zamanlari arasinda cok büyük fark olusur.
Sonuc olarak JOIN ifadesi kullanarak yazilan sorgular bize cok büyük bir performans artisi saglamaktadir.
t-sql etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
t-sql etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
18 Mart 2008 Salı
22 Ocak 2008 Salı
SQL Server - T-Sql ile Dosya boyutunu bulma
CREATE FUNCTION udf_GetFileSize (@filename varchar(1000))
returns bigint
as
BEGIN
DECLARE @FS int
DECLARE @OLEResult int
DECLARE @FileID int
DECLARE @Size bigint
DECLARE @Flag bigint
Set @size =0
Set @Flag =0
EXECUTE @OLEResult = sp_OACreate 'Scripting.FileSystemObject', @FS OUT
EXECUTE @OLEResult = sp_OAMethod @FS, 'GetFile', @FileID OUT,@filename
IF @OLEResult <> 0
begin
set @Flag =-1
end
else
begin
EXECUTE @OLEResult = sp_OAGetProperty @FileId,'Size', @Size OUT
IF @OLEResult <> 0
begin
set @Flag =-2
end
end
EXECUTE @OLEResult = sp_OADestroy @FileID
EXECUTE @OLEResult = sp_OADestroy @FS
if @flag <> -1 and @flag <> -2
begin
set @flag = @size
end
return @flag
END
'Kullanimi
select dbo.udf_GetFileSize ('c:\temp\test.txt')
returns bigint
as
BEGIN
DECLARE @FS int
DECLARE @OLEResult int
DECLARE @FileID int
DECLARE @Size bigint
DECLARE @Flag bigint
Set @size =0
Set @Flag =0
EXECUTE @OLEResult = sp_OACreate 'Scripting.FileSystemObject', @FS OUT
EXECUTE @OLEResult = sp_OAMethod @FS, 'GetFile', @FileID OUT,@filename
IF @OLEResult <> 0
begin
set @Flag =-1
end
else
begin
EXECUTE @OLEResult = sp_OAGetProperty @FileId,'Size', @Size OUT
IF @OLEResult <> 0
begin
set @Flag =-2
end
end
EXECUTE @OLEResult = sp_OADestroy @FileID
EXECUTE @OLEResult = sp_OADestroy @FS
if @flag <> -1 and @flag <> -2
begin
set @flag = @size
end
return @flag
END
'Kullanimi
select dbo.udf_GetFileSize ('c:\temp\test.txt')
Etiketler:
sql,
Sql Server,
t-sql,
Tips and Tricks
26 Kasım 2007 Pazartesi
_123 TSQL functions
Cok yararli T-SQL fonksiyonlarinin oldugu bir link.
Download edileblir zip dosya sitede bulunmakda.
http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=502&lngWId=5
Download edileblir zip dosya sitede bulunmakda.
http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=502&lngWId=5
24 Ekim 2007 Çarşamba
Birden fazla kriter ile TSQL Case Statement
select case
when 2 IN (1,2,4,8,10) then 'Found in criteria'
else 'not found'
end
when 2 IN (1,2,4,8,10) then 'Found in criteria'
else 'not found'
end
6 Ağustos 2007 Pazartesi
Bir resultsetden split edilmis string olusturmak
Sql Server üzerinde yaratacagimiz bu UDF, özellikle Reporting konusunda kullanilabilecek bir function örnegidir.
Örnegimizde Northwind veritabani kullaniyoruz.
Bunun icin öncelikle veritabaninda "GetProductIDs" isimli bir UDF olusturuyoruz. Fonksiyonumuz parametere olarak OrderID alacak ve OrderDetails tablosunda bu OrderID ye ait olan kayitlardaki ProductID leri bize virgül ile ayrilmis sekilde varchar olarak döndürecek.
CREATE FUNCTION [dbo].[GetProductIDs]
(
@OrderID int
)
RETURNS nvarchar(MAX)
AS
BEGIN
DECLARE @productIDList nvarchar(MAX)
SELECT @productIDList = COALESCE(@productIDList + ', ', '') +
CAST(ProductID AS varchar(20))
from dbo.[Order Details] Where OrderID = @OrderID
return @productIDList
END;
Fonksiyonumuz database üzerinde yaratildiktan sonra, su sekilde fonksiyonumuzu test edebiliriz.
Select dbo.GetProductIDs(OrderID) as ProductIDs from dbo.Orders
Örnegimizde Northwind veritabani kullaniyoruz.
Bunun icin öncelikle veritabaninda "GetProductIDs" isimli bir UDF olusturuyoruz. Fonksiyonumuz parametere olarak OrderID alacak ve OrderDetails tablosunda bu OrderID ye ait olan kayitlardaki ProductID leri bize virgül ile ayrilmis sekilde varchar olarak döndürecek.
CREATE FUNCTION [dbo].[GetProductIDs]
(
@OrderID int
)
RETURNS nvarchar(MAX)
AS
BEGIN
DECLARE @productIDList nvarchar(MAX)
SELECT @productIDList = COALESCE(@productIDList + ', ', '') +
CAST(ProductID AS varchar(20))
from dbo.[Order Details] Where OrderID = @OrderID
return @productIDList
END;
Fonksiyonumuz database üzerinde yaratildiktan sonra, su sekilde fonksiyonumuzu test edebiliriz.
Select dbo.GetProductIDs(OrderID) as ProductIDs from dbo.Orders
27 Temmuz 2007 Cuma
Multi Parameter > Where IN clause
SQL Split UDF:
if exists (select * from dbo.sysobjects where id =
object_id(N'[dbo].[UTILfn_Split]') and xtype in (N'FN', N'IF', N'TF'))
drop function [dbo].[UTILfn_Split]
GO
create function dbo.UTILfn_Split(
@String nvarchar (4000),
@Delimiter nvarchar (10)
)
returns @ValueTable table ([Value] nvarchar(4000))
begin
declare @NextString nvarchar(4000)
declare @Pos int
declare @NextPos int
declare @CommaCheck nvarchar(1)
--Initialize
set @NextString = ''
set @CommaCheck = right(@String,1)
--Check for trailing Comma, if not exists, INSERT
--if (@CommaCheck <> @Delimiter )
set @String = @String + @Delimiter
--Get position of first Comma
set @Pos = charindex(@Delimiter,@String)
set @NextPos = 1
--Loop while there is still a comma in the String of levels
while (@pos <> 0)
begin
set @NextString = substring(@String,1,@Pos - 1)
insert into @ValueTable ( [Value]) Values (@NextString)
set @String = substring(@String,@pos +1,len(@String))
set @NextPos = @Pos
set @pos = charindex(@Delimiter,@String)
end
return
end
--------
DECLARE @params nvarchar(100)
SET @params='962, 979, 971'
select * from dbo.TABLETEST
where ID IN (select * from dbo.UTILfn_Split(@params,','))
if exists (select * from dbo.sysobjects where id =
object_id(N'[dbo].[UTILfn_Split]') and xtype in (N'FN', N'IF', N'TF'))
drop function [dbo].[UTILfn_Split]
GO
create function dbo.UTILfn_Split(
@String nvarchar (4000),
@Delimiter nvarchar (10)
)
returns @ValueTable table ([Value] nvarchar(4000))
begin
declare @NextString nvarchar(4000)
declare @Pos int
declare @NextPos int
declare @CommaCheck nvarchar(1)
--Initialize
set @NextString = ''
set @CommaCheck = right(@String,1)
--Check for trailing Comma, if not exists, INSERT
--if (@CommaCheck <> @Delimiter )
set @String = @String + @Delimiter
--Get position of first Comma
set @Pos = charindex(@Delimiter,@String)
set @NextPos = 1
--Loop while there is still a comma in the String of levels
while (@pos <> 0)
begin
set @NextString = substring(@String,1,@Pos - 1)
insert into @ValueTable ( [Value]) Values (@NextString)
set @String = substring(@String,@pos +1,len(@String))
set @NextPos = @Pos
set @pos = charindex(@Delimiter,@String)
end
return
end
--------
DECLARE @params nvarchar(100)
SET @params='962, 979, 971'
select * from dbo.TABLETEST
where ID IN (select * from dbo.UTILfn_Split(@params,','))
Kaydol:
Kayıtlar (Atom)