Zoque.Forum
Dirsek Teması:
Geri Dön Zoque.Forum » Webmaster Kaynaklari » Sunucu Tabanlı Programlama (Server Side) » Veritabanları » SQL optimize etme sorusu...


Yanıt
 
LinkBack Seçenekler
Old 30.08.2006   #1 (permalink)
 
cgencer's Avatar
 
Ü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?
__________________
obsesif v2 + daha iyi net + uçuca + facebook + linkedin
cgencer şu an çevrimdışı  
Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!Spurl'e kaydet! http://reddit.com/submit?url=%url%&title=%title%Wong'e kaydet!Yahoo'ya kaydet!Google'a kaydet!MSN'e kaydet!Facebook'e kaydet!
Mesajdan alıntı yaparak yeni bir cevap ekleyin
Old 30.08.2006   #2 (permalink)
 
PsyChaos's Avatar
 
Üyelik Tarihi: 17.04.2003
Yer: Istanbul
Yaş: 24
Mesaj: 268
Re: SQL optimize etme sorusu...

aynı durum benim içinde geçerli.
bunun yanı sıra SQL server'da nasıl regexp kullanacağımıda bulamadım
PsyChaos şu an çevrimdışı  
Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!Spurl'e kaydet! http://reddit.com/submit?url=%url%&title=%title%Wong'e kaydet!Yahoo'ya kaydet!Google'a kaydet!MSN'e kaydet!Facebook'e kaydet!
Mesajdan alıntı yaparak yeni bir cevap ekleyin
Old 30.08.2006   #3 (permalink)
 
blurise's Avatar
 
Ü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.
__________________
Günce;
Zübeyr Dereli;
PGP Public Key;
blurise şu an çevrimdışı  
Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!Spurl'e kaydet! http://reddit.com/submit?url=%url%&title=%title%Wong'e kaydet!Yahoo'ya kaydet!Google'a kaydet!MSN'e kaydet!Facebook'e kaydet!
Mesajdan alıntı yaparak yeni bir cevap ekleyin
Old 30.08.2006   #4 (permalink)
 
PsyChaos's Avatar
 
Ü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
Sütunumdada veriler şu şekilde olsun

[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.
PsyChaos şu an çevrimdışı  
Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!Spurl'e kaydet! http://reddit.com/submit?url=%url%&title=%title%Wong'e kaydet!Yahoo'ya kaydet!Google'a kaydet!MSN'e kaydet!Facebook'e kaydet!
Mesajdan alıntı yaparak yeni bir cevap ekleyin
Old 30.08.2006   #5 (permalink)
 
PsyChaos's Avatar
 
Ü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
PsyChaos şu an çevrimdışı  
Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!Spurl'e kaydet! http://reddit.com/submit?url=%url%&title=%title%Wong'e kaydet!Yahoo'ya kaydet!Google'a kaydet!MSN'e kaydet!Facebook'e kaydet!
Mesajdan alıntı yaparak yeni bir cevap ekleyin
Old 30.08.2006   #6 (permalink)
 
cgencer's Avatar
 
Üyelik Tarihi: 02.08.2001
Yer: istanbul
Yaş: 38
Mesaj: 1,549
Re: SQL optimize etme sorusu...

kendi kendine verdiğin bu soru-cevap benim pek de işime yaramıyor; zira ben performans farkını sormuştum. zaten sorun/cevabın da ASP... ama ilgilenen birileri olabilir tabii yakın konular olduğu için de...
__________________
obsesif v2 + daha iyi net + uçuca + facebook + linkedin
cgencer şu an çevrimdışı  
Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!Spurl'e kaydet! http://reddit.com/submit?url=%url%&title=%title%Wong'e kaydet!Yahoo'ya kaydet!Google'a kaydet!MSN'e kaydet!Facebook'e kaydet!
Mesajdan alıntı yaparak yeni bir cevap ekleyin
Old 30.08.2006   #7 (permalink)
 
PsyChaos's Avatar
 
Ü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
PsyChaos şu an çevrimdışı  
Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!Spurl'e kaydet! http://reddit.com/submit?url=%url%&title=%title%Wong'e kaydet!Yahoo'ya kaydet!Google'a kaydet!MSN'e kaydet!Facebook'e kaydet!
Mesajdan alıntı yaparak yeni bir cevap ekleyin
Old 03.09.2006   #8 (permalink)
 
emremer's Avatar
 
Ü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 : )
emremer şu an çevrimdışı  
Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!Spurl'e kaydet! http://reddit.com/submit?url=%url%&title=%title%Wong'e kaydet!Yahoo'ya kaydet!Google'a kaydet!MSN'e kaydet!Facebook'e kaydet!
Mesajdan alıntı yaparak yeni bir cevap ekleyin
Sponsorlu Bağlantılar
Zoque.Forum
Reklam
Yanıt

Etiketler

sorusu , etme , optimize , sql


 
Zoque'a hoşgeldiniz!
Zoque 27.02.1999 tarihinde yayın hayatına başlamış, paylaşıma dayalı bir oluşumdur. Tasarım, teknoloji, web, kültür ve sanat ana başlıkları altında bilgi paylaşımı ve benzer değerlere sahip katılımcıların birbirleriyle iletişime girmelerine imkan sağlar. "Az ama Öz" sloganından yola çıkarak, kaliteli ve nitelikli katılımı temel alır.

Saygın ve ciddi bir ortamda yardımlaşmak, haberleşmek, kendi bildiklerini diğer katılımcılarla paylaşmak isteyen, oluşumumuza düzenli katılımda bulunacağı inancını taşıyan konuklarımızı üye olmaya davet ediyoruz. [ » ]


Üye Girişi:

En popüler ilk 100 etiket
Tag Cloud
acil adsl ajax almak arama araniyor ariyorum ariyoruz asp bilen bilgi bilgisayar blog calisma css div domain dosya eleman film firefox flash font form forum fotograf freelance google gore grafik grafiker hakkinda hangi hata hatasi hosting html ilgili ilk image internet istanbul istiyorum java javascript karakter kayit kisisel kullanimi link logo mac mail menu microsoft muzik mysql nasil neden nedir online oyun photoshop php problemi program programi reklam resim satilik sayfa script server ses sistemi site sitesi son soru sorun sorunsali sorunu sql swf tasarim tasarimci tasarimcisi tasarimi turk turkce veri video web windows wordpress xml yardim yazi yeni zoque
Zoque RSS Aboneliği
Son eklenen konuları e-posta ile haber verelim mi?

Forum Yazılımı: vBulletin® Version 3.7.4 Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0

Arayüz/Skin "Güneş" © www.zoque.com / net. Copyright © 1999 - 2008
Forum Saati GMT +2. Şu anda saat: 00:38.