Re: [altdotnetturkiye] Digest for altdotnetturkiye@googlegroups.com - 19 Messages in 2 Topics

8 views
Skip to first unread message

ONUR OĞURTANI

unread,
May 23, 2012, 11:01:28 AM5/23/12
to altdotne...@googlegroups.com
Selamlar 
2.3 milyonluk bir tabloda fulltext search ne kadar optimize edilsede belli degerlerin atiyorum 2-5 sn altina inmiyecektir.
Ki bu sistem disa acik ise imkansiz olucaktir.
(query optimization,ram e cekip arama vs...)

Eger isleri batch e cevirip Lucene,couchbase  vb... araclar kullanirsaniz 1 sn altinda getirebilrsiniz..

iyi calismalar


23 Mayıs 2012 17:40 tarihinde <altdotne...@googlegroups.com> yazdı:t

Group: http://groups.google.com/group/altdotnetrturkiye/topics

    Eralp Erat <eralp...@gmail.com> May 23 04:25PM +0300  

    Selamlar ;
     
    aşağıda gorduğunuz üzere bir tablo var ve tabloda 2.3 milyon kayıt var.
     
    bu tabloada yer alan content alanını kullanarak bir sorgu oluşturdum.
     
    sorgunun amacı su , girilen keyword e bağlı olarak (bundan sonra keyword
    olarak anılacak) content alanında arama yapıyor ve girilen keyword+...
    şeklinde bütün kelimeleri (ve grupları) dökmesi.Ek olarak gelen sonucların
    % N 'lik bir kısmına dail olması ( örneğin %90 a giriyorsa sonuclarda
    görünsün.) durumuda var.
     
    yani SABANCI diye birşey girdiğimde bana gelen şekil 2 deki gibi çıktı.
     
    Sorgu çok yavaş çalışıyor..Derdim bunu hızlandırmak!..SP'nin çıktısını
    aşağıda verdim.
     
    Fikirlerinizi alabilir miyim ?
     
    Tşk.
     
     
    şekil -1
     
    [image: Inline image 1]
     
     
    Şekil 2
     
    [image: Inline image 3]
     
     
    Sp içerik .
     
     
    USE [ARSIVMPDB]
     
    -- =============================================
     
    -- Author: Eralp Erat
     
    -- =============================================
     
    ALTER PROCEDURE [dbo].[GetMostUsedKeywordsWithSuffixWithRatio]
     
    @key as nvarchar(100),
     
    @ratio as decimal(18,2)= 0.80
     
    AS
     
    BEGIN
     
    SET NOCOUNT ON;
     
    DECLARE @SearchWord varchar(100)
     
    SET @SearchWord = @key
     
     
    DECLARE @SearchWord2 varchar(100)
     
    SET @SearchWord2 = '"'+@key+'"';
     
    CREATE TABLE [dbo].[#tbl_News_q](
     
    [KELIME] nvarchar(60),
     
    [DEGER] [decimal](18, 2) NULL
     
    )
     
     
    DECLARE @DEGER decimal(18,2)
     
    DECLARE @DEGERLIMIT decimal(18,2)
     
    DECLARE @TOPLAM decimal(18,2)
     
    DECLARE @KELIME nvarchar(60)
     
     
    SET @TOPLAM = 0;
     
    SET @DEGERLIMIT = 0;
     
    SET @DEGER = 0;
     
     
    select @DEGERLIMIT = (
     
    select sum(y.adet)
     
    from (Select sep.Col as A,COUNT(*) as adet FROM (
     
    Select * FROM (
     
    Select value =
     
    Upper(RTrim(LTrim(
     
    Replace(Replace(
     
    Replace(Replace(
     
    Replace(Replace(
     
    Replace(Replace(
     
    Replace(Replace(
     
    Replace(Replace(
     
    Replace(Replace(
     
    CAST(content as nvarchar(MAX)),
     
    ',', ' '), '.', ' '),
     
    '!', ' '), '+', ' '),
     
    ':', ' '), '-', ' '),
     
    ';', ' '), '(', ' '),
     
    ')', ' '), '/', ' '),
     
    '&', ''), '?', ' '),
     
    ' ', ' '), ' ', ' '))))
     
    FROM tbl_News as t where CONTAINS(t.Content,@SearchWord2)
     
    ) easyValues
     
    Where value <> ''
     
    ) actualValues
     
    Cross Apply dbo.SeparateValues(value, ' ') sep
     
    Group By sep.Col
     
    ) as y
     
    where y.A like ''+@SearchWord+'%'
     
    --Order By y.adet Desc
     
    ) * @ratio
     
     
    SET @TOPLAM = 0;
     
    SET @DEGER = 0;
     
     
    DECLARE Toplam_Cursor CURSOR FOR
     
    select y.A as KELIME,y.adet as DEGER
     
    from (Select sep.Col as A,COUNT(*) as adet FROM (
     
    Select * FROM (
     
    Select value =
     
    Upper(RTrim(LTrim(
     
    Replace(Replace(
     
    Replace(Replace(
     
    Replace(Replace(
     
    Replace(Replace(
     
    Replace(Replace(
     
    Replace(Replace(
     
    Replace(Replace(
     
    CAST(content as nvarchar(MAX)),
     
    ',', ' '), '.', ' '),
     
    '!', ' '), '+', ' '),
     
    ':', ' '), '-', ' '),
     
    ';', ' '), '(', ' '),
     
    ')', ' '), '/', ' '),
     
    '&', ''), '?', ' '),
     
    ' ', ' '), ' ', ' '))))
     
    FROM tbl_News as t where CONTAINS(t.Content,@SearchWord2)
     
    ) easyValues
     
    Where value <> ''
     
    ) actualValues
     
    Cross Apply dbo.SeparateValues(value, ' ') sep
     
    Group By sep.Col
     
    ) as y
     
    where y.A like ''+@SearchWord+'%'
     
    Order By y.adet Desc
     
     
    OPEN Toplam_Cursor
     
     
    FETCH NEXT FROM Toplam_Cursor INTO @KELIME,@DEGER
     
     
    WHILE @@FETCH_STATUS =0
     
    BEGIN
     
    SET @TOPLAM = @TOPLAM + @DEGER
     
    if (@TOPLAM < @DEGERLIMIT)
     
    begin
     
    insert into #tbl_News_q(KELIME,DEGER) values (@KELIME,@DEGER)
     
    FETCH NEXT FROM Toplam_Cursor INTO @KELIME,@DEGER
     
    end else
     
    break;
     
    END
     
    CLOSE Toplam_Cursor
     
     
    DEALLOCATE Toplam_Cursor
     
     
    select * from #tbl_News_q
     
     
    END

     

    "Hakan Taşpınar" <hknt...@gmail.com> May 23 04:27PM +0300  

    Execution planı gösterebilirmisin
     

     

    Murat Haksal <murat....@gmail.com> May 23 04:59PM +0300  

    Eralp slm
    indb olması constraint ise fulltext,App da çözme durumu varsa lucene bakmanı onerebilirim
     

     

    "Uğur Tılıkoğlu" <tili...@gmail.com> May 23 04:59PM +0300  

    eray hocam affınıza sığınarak, sp biraz karışık geldi. tam olarak ne yapmak
    istediğini bir örnekle anlatabilir misin? belki farklı bir yoldan daha kısa
    çözümü vardır. bir de yavaş çalışıyor derken, kaç sn sürüyor bu?
     

     

    "Hakan Taşpınar" <hknt...@gmail.com> May 23 05:10PM +0300  

    @Murat lucene kullanırken çokça OutOfMemoryExecption sorunu yaşadım. sp
    iyileştirilebilir gibi görünüyor üzerinde daha bakıyorum
     

     

    Eralp Erat <eralp...@gmail.com> May 23 05:11PM +0300  

    acikcasi dynamics CRM içerisinden call ediyoruz hardcode elimizde değil
    sadece JS inject edebildiğimiz için cok daha iyi bir opsiyon olan lucene 'i
    kullanırdık dediğin gibi.
     
    o yüzden olayı sql tarafında çözmek istiyorum.Minimum eforla.
     
     
    2012/5/23 Murat Haksal <murat....@gmail.com>
     

     

    Eralp Erat <eralp...@gmail.com> May 23 05:13PM +0300  

    Sp de kesinlikle optimizasyon yapılabilir cok salla pati oldu zaten
    orneğin.Total sum i almak için aynı query'i calistirmayip cursor i break
    etmeyerek totale ulaşırsam t yi t/2 ye dusurebiliriz.
     
    bunu goruyorum.
     
    lakin bu da kesmiyor beni bazı kelimeler için ( örneğin : test) 6 dk+
    oluyor dönüş zamanı..
     
    cıldırınnnn cıldırıınnnnn
     
    2012/5/23 Hakan Taşpınar <hknt...@gmail.com>
     

     

    Eralp Erat <eralp...@gmail.com> May 23 05:19PM +0300  

    ilk optimizasyon :
     
    DECLARE @total as int;
     
    select @total = 0;
     
    DECLARE @ratio as decimal (18,2);
     
    set @ratio = 0.90;
     
     
    DECLARE @SearchWord varchar(100)
     
    SET @SearchWord = 'SABANCI'
     
     
    DECLARE @SearchWord2 varchar(100)
     
    SET @SearchWord2 = '"'+@SearchWord+'"';
     
     
    --drop table [#tbl_News_q]
     
    CREATE TABLE [dbo].[#tbl_News_q](
     
    [KELIME] nvarchar(60),
     
    [DEGER] [decimal](18, 2) NULL
     
    )
     
     
    DECLARE @DEGER decimal(18,2)
     
    DECLARE @DEGERLIMIT decimal(18,2)
     
    DECLARE @TOPLAM decimal(18,2)
     
    DECLARE @KELIME nvarchar(60)
     
     
    SET @TOPLAM = 0;
     
    SET @DEGERLIMIT = 0;
     
    SET @DEGER = 0;
     
     
    --select @DEGERLIMIT = (
     
    -- select sum(y.adet)
     
    -- from (Select sep.Col as A,COUNT(*) as adet FROM (
     
    -- Select * FROM (
     
    -- Select value =
     
    -- Upper(RTrim(LTrim(
     
    -- Replace(Replace(
     
    -- Replace(Replace(
     
    -- Replace(Replace(
     
    -- Replace(Replace(
     
    -- Replace(Replace(
     
    -- Replace(Replace(
     
    -- Replace(Replace(
     
    -- CAST(content as nvarchar(MAX)),
     
    -- ',', ' '), '.', ' '),
     
    -- '!', ' '), '+', ' '),
     
    -- ':', ' '), '-', ' '),
     
    -- ';', ' '), '(', ' '),
     
    -- ')', ' '), '/', ' '),
     
    -- '&', ''), '?', ' '),
     
    -- ' ', ' '), ' ', ' '))))
     
    -- FROM tbl_News as t where CONTAINS(t.Content,@SearchWord2)
     
    -- ) easyValues
     
    -- Where value <> ''
     
    -- ) actualValues
     
    -- Cross Apply dbo.SeparateValues(value, ' ') sep
     
    -- Group By sep.Col
     
    -- ) as y
     
    -- where y.A like ''+@SearchWord+'%'
     
    -- --Order By y.adet Desc
     
    --) * @ratio
     
     
    SET @TOPLAM = 0;
     
    SET @DEGER = 0;
     
     
    DECLARE Toplam_Cursor CURSOR FOR
     
    select y.A as KELIME,y.adet as DEGER
     
    from (Select sep.Col as A,COUNT(*) as adet FROM (
     
    Select * FROM (
     
    Select value =
     
    Upper(RTrim(LTrim(
     
    Replace(Replace(
     
    Replace(Replace(
     
    Replace(Replace(
     
    Replace(Replace(
     
    Replace(Replace(
     
    Replace(Replace(
     
    Replace(Replace(
     
    CAST(content as nvarchar(MAX)),
     
    ',', ' '), '.', ' '),
     
    '!', ' '), '+', ' '),
     
    ':', ' '), '-', ' '),
     
    ';', ' '), '(', ' '),
     
    ')', ' '), '/', ' '),
     
    '&', ''), '?', ' '),
     
    ' ', ' '), ' ', ' '))))
     
    FROM tbl_News as t where CONTAINS(t.Content,@SearchWord2)
     
    ) easyValues
     
    Where value <> ''
     
    ) actualValues
     
    Cross Apply dbo.SeparateValues(value, ' ') sep
     
    Group By sep.Col
     
    ) as y
     
    where y.A like ''+@SearchWord+'%'
     
    Order By y.adet Desc
     
     
    OPEN Toplam_Cursor
     
     
    FETCH NEXT FROM Toplam_Cursor INTO @KELIME,@DEGER
     
     
    WHILE @@FETCH_STATUS =0
     
    BEGIN
     
    SET @TOPLAM = @TOPLAM + @DEGER
     
    FETCH NEXT FROM Toplam_Cursor INTO @KELIME,@DEGER
     
    END
     
    CLOSE Toplam_Cursor
     
    SET @KELIME = null;
     
    SET @DEGER = 0;
     
    SET @DEGERLIMIT = @TOPLAM * @ratio;
     
    SET @TOPLAM = 0;
     
     
    OPEN Toplam_Cursor
     
     
    FETCH NEXT FROM Toplam_Cursor INTO @KELIME,@DEGER
     
     
    WHILE @@FETCH_STATUS =0
     
    BEGIN
     
    SET @TOPLAM = @TOPLAM + @DEGER
     
    if (@TOPLAM < @DEGERLIMIT)
     
    begin
     
    insert into #tbl_News_q(KELIME,DEGER) values (@KELIME,@DEGER)
     
    FETCH NEXT FROM Toplam_Cursor INTO @KELIME,@DEGER
     
    end else
     
    break;
     
    END
     
    CLOSE Toplam_Cursor
     
     
    DEALLOCATE Toplam_Cursor
     
     
    select * from #tbl_News_q
     
    2012/5/23 Eralp Erat <eralp...@gmail.com>
     

     

    "Uğur Tılıkoğlu" <tili...@gmail.com> May 23 05:28PM +0300  

    dıııt yanlış cevap, resimleri görüyorum ama, saat 17:00'yi geçtiği için
    anlamakta zorluk çekiyorum belki de :) "grupları" ve "%N'lik kısmına
    giriyorsa" kısmını anlamadım. zaten anlasam da yazabilir miyim, orası ayrı
    konu :)
     
    2012/5/23 Eralp Erat <eralp...@gmail.com>
     

     

    Eralp Erat <eralp...@gmail.com> May 23 05:40PM +0300  

    bende de bir sorun var sanırım ( cok tane var itiraf ediyorum burdan
    dünyaya kayda geçsin :) )
     
    şimdi söyle dusun ;
     
    her bir satırda bir kolonda 100 lerce kelimenin olduğu 2milyon kayıt var
    elimizde..FullText search için ayarlı.
     
    aradığım veri su ben SABANCI dediğimde bu kolondaki tüm kelimeleri tarayip
    içinde SABANCI prefix'ine sahip olan bütün kelimeleri group by
    yap ve en cok tekrar edene gore sort et diyorum.
     
    Bu sorgunun cevabını sosyal medya aramalarında kullanıyorum öyle
    diyeyim.Tekrar edilme sıklığı yüksek olan kelime ile daha cok ve daha
    doğruya yakın sonucu yakalayabilirim mantığı var.
     
    %N e girm olayıda su. eskiden top 10 diyordum sonuc içerisinden ama dediler
    ki dur o oyle olmaz. kullanıcının karar vermesi lazim..ee dedim ama sonucu
    1 olan bir suru kayıt olacak manasız olur.O zaman da dedim soyle yapalım
    bir ratio verin örneğin toplamda 100 kelime cıktı diye lim bunların toplam
    cikma adedi ise 750 olsun..
     
    1.SABANCI'nın 550
    2.SABANCI'dan 49
    3.SABANCI'ya 50
    4.SABANCIA 41
    5.SABANCIK 30
    6.SABANCIN 30
    ...
     
    ....
     
    gibi yani..toplam 750 bunun ratio değeri ile çarpında örneğin 0.8 olursa bu
    değer 600 gibi bir değer yapıyor.. yani arama sonucuna sadece 1 ve 2.
    satırlar yansıyor.Geri kalanını umursamıyor.
     
    anlatabildim mi ?
     
     
    2012/5/23 Uğur Tılıkoğlu <tili...@gmail.com>
     

     

    Eralp Erat <eralp...@gmail.com> May 23 03:44PM +0300  

    Geyik işte.
     
    Kusura bakma ama bence iyi bir ders olsun arkadaşının firmasına bu konu.
     
    Keşke manşetlere düşse.Herkes bilsin konuyu.
     
    Adam gibi değer verilmeyen bir departmanın dertleri , asıl fonksiyonları
    (varlık sebebi), kalifiye eleman çalıştırmanın, güvenliğin vb. bir takım
    kriterler yönetimde tekrar gündeme gelir belki..
     
    zihniyeti backuplasınlar ancak..
     
     
    2012/5/22 Muzaffer Anıl KABAN <muzaff...@gmail.com>
     

     

    "Hakan Taşpınar" <hknt...@gmail.com> May 23 03:52PM +0300  

    Genel de kurumsal firmalarda olan bu soruna yorumunu like lıyorum (=
     

     

    "Mehmet Erdanışman" <mehmeter...@gmail.com> May 23 03:55PM +0300  

    @serdar son durum nedir ? datalari paylastilar mi ?

     

    Eralp Erat <eralp...@gmail.com> May 23 04:10PM +0300  

    hiç sanmam..
     
    direkt 20.000 $ isterim.
     
    bir de tehdit ederim 3 saatte yatırdın yatırdın yoksa sildiğime dair video
    cekip youtube a koyarım.Yani silme anını temsili tarihe kaydederim..Acisida
    tarihe geçmiş olur.
     
     
     
    2012/5/23 Mehmet Erdanışman <mehmeter...@gmail.com>
     

     

    "Mehmet Erdanışman" <mehmeter...@gmail.com> May 23 04:38PM +0300  

    Dusundugum gibi oldu uzuldum acikcasi.İns. datalari verirler az para degil.
    Bundan sonra daha dikkatli olsunlar. Yarin baska birileri gelip ," yedekler
    bende 4000 $ verin gonderiyim " diyenler cikabilir.

     

You received this message because you are subscribed to the Google Group altdotnetturkiye.
You can post via email.
To unsubscribe from this group, send an empty message.
For more options, visit this group.

--
You received this message because you are subscribed to the Google Groups "altdotnetturkiye" group.
To post to this group, send email to altdotne...@googlegroups.com.
To unsubscribe from this group, send email to altdotnetturki...@googlegroups.com.
For more options, visit this group at http://groups.google.com/group/altdotnetturkiye?hl=en.

Reply all
Reply to author
Forward
0 new messages