|
|
#1 (permalink) |
|
Üyelik Tarihi: 02.08.2001
Yer: istanbul
Yaş: 38
Mesaj: 1,549
|
SQL optimize etme sorusu...
bu saatte kim ilgilenir bilmem, ama sorumu yine de sorayım, sabaha bakarım artık bir cevap var mı diye... sayısı haylice olan içerikleri keyword'lerle bağlantılandıracağım. daha önce yüzbinlerce entry içeren bir db'de (MySQL) LEFT/RIGHT JOIN gibi işlemlerle her içeriğe yönelik birden fazla keyword getirme işleminde toplam row adedi fazla olduğu için yavaşlama sorunları yaşadım. bu yüzden her entry için ilgili keyword'leri ayrı table'da tutmak yerine aynı table'da ek bir field içinde virgülle ayrılmış tutmaya karar verdim. bu sayede her bir entry'ye ait keyword'ler tek basit sorguda elime geçiyor, sonra da ilgili tablodan bu keyword'lerin ne olduğuna baktırıyorum. yani: table1: 1,"ahmet" 2,"mehmet" 3,"veli" 4,"ali" table2: 1,"içerik1","1,3" 2,"içerik2","2,3,4" 3,"içerik3","1,3,4" gibi. tabii burada hangi içerikte hangi keyword ilişkili diyebilmek için sorgulamada LIKE/REGEX kullanmak gerekmeye başlıyor. merak ettiğim şu; db düzeni açısından çok temiz olmayan bu yöntem başka yerlerde program logic'i açısından ufak tefek sorunlar yaratabilir; elde edebileceğim performans farkı buna değecek kadar olabilir mi? |
|
|
|
|
|
#3 (permalink) |
|
Üyelik Tarihi: 05.12.2003
Yer: İstanbul
Mesaj: 899
|
Re: SQL optimize etme sorusu...
Benim korkum bunun sana hiz konusunda fayda saglamayacagi, sayilari virgulle ayirmaya basladigin andan itibaren int yerine string olarak tutulacaklarini biliyoruz. bunun basit bir index ile cozumlenmesi daha dogru olur.
ne icin kullandigini bilmiyorum ama arama vs turu bir is icinse icerige ait keywordlerden ziyade keywordlerden icerige ulasacagini da dusunerek burada bir yanlislik oldugunu dusunuyorum. |
|
|
|
|
|
#4 (permalink) |
|
Üyelik Tarihi: 17.04.2003
Yer: Istanbul
Yaş: 24
Mesaj: 268
|
Re: SQL optimize etme sorusu...
şöyle birşey yazdım (gerçi hazır bir function buldum biraz kendime göre modifiye ettim)
Kod:
ALTER FUNCTION [dbo].[find_in_set]
(
@source varchar(100),
@param varchar(100)
)
RETURNS bit
AS
BEGIN
Declare @separator char(1)
Declare @index int
Declare @array_value varchar(1000)
Set @separator = ','
Declare @flag bit
Set @flag = 0
Set @source = @source + ','
While PatIndex('%'+ @separator +'%' , @source) <> 0
Begin
Select @index = PatIndex('%'+ @separator +'%' , @source)
Select @array_value = RTrim(LTrim(Left(@source, @index - 1)))
if @array_value = @param
Begin
Set @flag = 1
break
End
Select @source = Stuff(@source, 1, @index, '')
End
RETURN @flag
END
[1, 3, 5, 13, 11] gibi. Select AlanAdi1 From tblAdi Where dbo.find_in_set(AlanAdi2,'1') deyince istediğim sonucu döndürüyor. Fakat ben şu şekilde de iş yapmasını istiyorum Select AlanAdi1 From tblAdi Where dbo.find_in_set(AlanAdi2,'1, 5') Dediğim de de bana sonuç döndürmesi lazım Select AlanAdi1 From tblAdi Where dbo.find_in_set(AlanAdi2,'1, 20') Dediğimde de bana sonuç döndürmesi lazım çünkü sonuç itibari ile 1 o alanda mevcut durumda. Recursive bişiler denedim fakat beceremedim. Yardımcı olursanız sevinirim. |
|
|
|
|
|
#5 (permalink) |
|
Üyelik Tarihi: 17.04.2003
Yer: Istanbul
Yaş: 24
Mesaj: 268
|
Re: SQL optimize etme sorusu...
bir arkadaşında yardımı ile sorunu çözmüş bulunuyoruz.
burarada ismi find_by_value oldu Kod:
ALTER FUNCTION [dbo].[find_by_value] (@source VARCHAR(255), @param VARCHAR(255))
RETURNS BIT AS
BEGIN
DECLARE @isFound BIT
SET @isFound = 0
---------------------------------------------------------------
-- Eğer aranan değer (@param) kendisi de virgulle ayrılmış ise
-- onu parçalamamız gerekiyor
----------------------------------------------------------------
IF CharIndex(',', @param) <> 0
BEGIN
WHILE Len(@param) > 0
BEGIN
-- Arananı ayrıştır
DECLARE @element VARCHAR(4)
-- Eğer son elemansa virgul bulamayacağız
IF (CharIndex(',', @param) = 0)
SET @element = @param
ELSE
SET @element = SubString(@param, 1, CharIndex(',', @param) -1)
-- Her aranan için tek tek dene
IF dbo.find_by_value(@source, @element) = 1
RETURN 1
ELSE IF CharIndex(',' , @param) = 0
SET @param = ''
ELSE
SET @param = SubString(@param, CharIndex(',', @param) + 1 , Len(@param))
END-- while
-- Bulunamadı
RETURN 0
END
--------------------------------------------------------------
-- @param tek değer içeriyorsa
-- @source içinde arayalım ve
-- geri dönüş değerini belirleyelim
-------------------------------------------------------------
Declare @separator char(1)
Declare @separator_position int
Declare @array_value varchar(1000)
Set @separator = ','
Declare @Control bit
Set @Control = 0
Set @source = @source + ','
While PatIndex('%'+ @separator +'%' , @source) <> 0
Begin
Select @separator_position = PatIndex('%'+ @separator +'%' , @source)
Select @array_value = RTRIM(LTRIM(Left(@source, @separator_position - 1)))
if @array_value = @param
Begin
Set @Control = 1
break
End
Select @source = stuff(@source, 1, @separator_position, '')
End
RETURN @Control
END
|
|
|
|
|
|
#6 (permalink) |
|
Üyelik Tarihi: 02.08.2001
Yer: istanbul
Yaş: 38
Mesaj: 1,549
|
Re: SQL optimize etme sorusu...
|
|
|
|
|
|
#7 (permalink) |
|
Üyelik Tarihi: 17.04.2003
Yer: Istanbul
Yaş: 24
Mesaj: 268
|
Re: SQL optimize etme sorusu...
aslında benimki de ASP ile çözülebilir ama ben birden çok tabloda işlem yapacağım için yazacağım kodlar çok uzayacaktı o yüzden böyle bir çözüm geliştirdim.. seninde işine yarar diye düşünmüştüm.
neyse belki başkasına yarar. iyi çalışmalar |
|
|
|
|
|
#8 (permalink) |
|
Üyelik Tarihi: 02.11.2001
Yer: Viyana, İstanbul
Yaş: 31
Mesaj: 1,019
|
Re: SQL optimize etme sorusu...
benim aladığım dille, şöyle bir yapın var (?)
hasan amcanın elma ağaçları bu sene çok daha verimli | elma, hasan amca, ağaç migrosta elma fiyatları yaz başından bu yana çok düştü | düşük fiyat, migros, elma hasan amca konusu altında ona ait etikerler var, kullanıcı "elma" yı tıklarsa içinde "elma" anahtarı geçen konuların içinde arama yapıp, o konuları liseyeleyecek (select `konu_id` from ...like ..) sorgu şunu yapsa; anahtarlar arasında "elma" araması yapsa ve oradan ilgili konuları listelese.. (select `anahtarlar` from .. .) daha performanslı olacaktır sanırım. //maillerdeki bozuk türkçe karektelerle uğraşmaktan beyinim sulanmış bi halde, soruyu anladım mı ya da saçmaladım mı bilmiyorum : )
__________________
Z:web 2.0 As Flowers E-kart Düşünüyorum Öyleyse e-Varim Emre Murat Tatar Duyarlı Gençlik TR |
|
|
|
| Sponsorlu Bağlantılar | |
|
Zoque.Forum
Reklam
|
|
Zoque'a hoşgeldiniz!