Performanslı Tablo Karşılaştırma

Katılım
3 Eylül 2008
Mesajlar
44
Excel Vers. ve Dili
2010
Selamun aleyküm.

1. tablodaki verilerimi 2. tabloda arayıp birebir eşleştiriyorum. 2. tabloda aynı koşula uyan 1'den fazla kayıt olduğu için join fonksiyonları işimi görmüyor. Ben 1.tablodaki veriyi 2. tabloda şarta uyan ilk veriyle eşleştiriyorum.


Sayaçla 2 tabloyu karşılaştırıyorum ama verilerin çokluğu nedeniyle işlem 1 günden fazla sürüyor. Bu işi daha kısa sürede nasıl yapabilirim? Yardımlarınızı rica ederim.

Örnek Resim:
http://hizliresim.com/QYaGnA

Kod:
DECLARE @Sayac1 AS INT = ( SELECT COUNT(*) FROM #T1 );---50.000 adet veri
DECLARE @Sayac2 AS INT = ( SELECT COUNT(*) FROM #T2 );---100.000 adet veri
DECLARE @Siralama1 AS INT = 1;
DECLARE @Siralama2 AS INT = 1;
DECLARE @T1column1 VARCHAR(16), @T1column2 NUMERIC(25, 2), @T1column3 DATE;
DECLARE @T2column1 VARCHAR(16), @T2column2 NUMERIC(25, 2), @T2column3 DATE;
DECLARE @T2column4 INT;
DECLARE @T1column4 INT;

Goto1:

WHILE @Siralama1 <= @Sayac1
    BEGIN
        Goto2:
        WHILE @Siralama2 <= @Sayac2
            BEGIN
                SELECT @T2column1 = Column1, @T2column2 = Column2, @T2column3 = Column3, @T2column4 = Column4 FROM #T2 WHERE Siralama2 = @Siralama2;
                WHILE @T2column4 IS NULL
                    BEGIN
                        SELECT @T1column1 = Column1, @T1column2 = Column2, @T1column3 = Column3, @T1column4 = Column4 WHERE Siralama1 = @Siralama1;
                        WHILE @T1column1 = @T2column1 AND @T1column2 = @T2column2 AND @T1column3 >= @T1column3
                            BEGIN
                                UPDATE #T2
                                SET Column4 = @T1column4 WHERE Siralama2 = @Siralama2;
                                SET @Siralama1 = @Siralama1 + 1;
                                SET @Siralama2 = 1;
                                GOTO Goto1;
                            END;
                        SET @Siralama2 = @Siralama2 + 1;
                        GOTO Goto2;
                    END;
                SET @Siralama2 = @Siralama2 + 1;
            END;
        SET @Siralama1 = @Siralama1 + 1;
        SET @Siralama2 = 1;
    END;
 
Son düzenleme:

Zeki Gürsoy

Uzman
Uzman
Katılım
31 Aralık 2005
Mesajlar
4,344
Excel Vers. ve Dili
Office 365 (64 bit) - Türkçe
Temporary table yerine "table" declarasyonu kullanın; daha performanslıdır. SQL Server da cursor ve döngüleri evvelden beri performanslı bulmadım zaten.

Eğer temp table yerine memory table de beklediğiniz performansı vermediyse aşağıdaki verdiğim senaryoyu da deneyebilirsiniz.

- İki tablo için de ayrı ayrı recordset açın ve "activeconnection" özelliğini "nothing" ile bağlantıyı koparın.

- Birinci recordset teki columnları ikinci recordsetin filter özelliğine verip filitreleyin.

- İkinci recordsette birden fazla kayıt dönse bile imleç ilk kayıtta olcağından direkt "update" yaparsınız. Bağlantı kapalı olduğu için veritabanına yansımayacak.

Diğer bir yol, bu iki recordsetin içeriğini "getrows" ile iki boyutlu bir array' a alıp aynı işlemleri uygularsınız. RAM üzerinde işlem yapmak, döngü ile de olsa çok hızlıdır biliyorsunuz.

En kötü ihtimalle iki tablonuzu excel sayfalarına alıp döngü uygulasanız 5 dk. bile tutmaz sanırım.
 
Katılım
3 Eylül 2008
Mesajlar
44
Excel Vers. ve Dili
2010
Temporary table yerine "table" declarasyonu kullanın; daha performanslıdır. SQL Server da cursor ve döngüleri evvelden beri performanslı bulmadım zaten.

Eğer temp table yerine memory table de beklediğiniz performansı vermediyse aşağıdaki verdiğim senaryoyu da deneyebilirsiniz.

- İki tablo için de ayrı ayrı recordset açın ve "activeconnection" özelliğini "nothing" ile bağlantıyı koparın.

- Birinci recordset teki columnları ikinci recordsetin filter özelliğine verip filitreleyin.

- İkinci recordsette birden fazla kayıt dönse bile imleç ilk kayıtta olcağından direkt "update" yaparsınız. Bağlantı kapalı olduğu için veritabanına yansımayacak.

Diğer bir yol, bu iki recordsetin içeriğini "getrows" ile iki boyutlu bir array' a alıp aynı işlemleri uygularsınız. RAM üzerinde işlem yapmak, döngü ile de olsa çok hızlıdır biliyorsunuz.

En kötü ihtimalle iki tablonuzu excel sayfalarına alıp döngü uygulasanız 5 dk. bile tutmaz sanırım.
Memory tablede performans değişmedi. Diğer çözüm yollarınızı ilk fırsatta deneyip sonucu yazarım. Dediğiniz gibi excelde makroyla sorun çok basit bir şekilde hem de performanslı olarak çözülüyor. İdareten makroyla sorunu mu çözüyorum. İlginiz için teşekkür ederim.
 
Üst