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ı

SQL Performans - NOT EXISTS yerine JOIN kullanarak perfomans artisi saglamak.

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.





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')

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

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

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



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,','))