Excel Forum
ALTIN ÜYELİK Hakkında Bilgi


Geri Git   Excel Forum > Diğer Yazılımlar > SQL
Atatürk
Şifremi Unuttum

DUYURU SİSTEMİ / REKLAM PANOSU

SQL Yapısal sorgulama dili hakkında sorularınızı buraya sorabilirsiniz.

Özel Arama


Yanıtla
 
Paylaş Konu Araçları Görünüm Modları
Eski 02-12-2015, 13:30   #1
excelmaster
 
Giriş: 03/09/2008
Mesaj: 44
Excel Vers. ve Dili:
2010
Question Performanslı Tablo Karşılaştırma

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: (Rahat kopyalayabilmeniz için tüm kodu seçmenizi sağlar)
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;

Bu mesaj en son " 02-12-2015 " tarihinde saat 16:36 itibariyle excelmaster tarafından düzenlenmiştir....
excelmaster Çevrimdışı   Alıntı Yaparak Cevapla
Eski 02-12-2015, 19:22   #2
Zeki Gürsoy
Uzman
 
Zeki Gürsoy kullanıcısının avatarı
 
Giriş: 31/12/2005
Şehir: Sakarya-Hendek
Mesaj: 3,353
Excel Vers. ve Dili:
Office 2016 (x64) - Türkçe
Varsayılan

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.
__________________

gursoyzeki@gmail.com




Zeki Gürsoy Çevrimdışı   Alıntı Yaparak Cevapla
Eski 02-12-2015, 19:51   #3
excelmaster
 
Giriş: 03/09/2008
Mesaj: 44
Excel Vers. ve Dili:
2010
Varsayılan

Alıntı:
Zeki Gürsoy tarafından gönderildi Mesajı Görüntüle
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.
excelmaster Çevrimdışı   Alıntı Yaparak Cevapla
Yanıtla


Konu Araçları
Görünüm Modları

Gönderme Kuralları
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is Açık
SimgelerAçık
[IMG] kodu Açık
HTML kodu Kapalı


Saat 19:25


Bu forum Elit NET - www.elitnet.com.tr tarafından sunulmaktadır.

Excel Eğitimi - Mobil Uygulama - Çorlu - Çorlu Web Tasarım - Tarot Falı - invest in turkey - Lingerie - Dyeing Machine - Karton Bardak- Çorlu Özel Eğitim- Site Yönetimi- Led Aydınlatma- Pronet Tekirdağ- Çorlu Kamera- Pronet Edirne- Pronet Kırklareli- Pronet Çerkezköy- Pronet Çorlu- Pronet Lüleburgaz- Pronet Keşan- Çorlu Araç Takip- Çorlu Su Arıtma- Boru Profil- Gebze Emlak- Beylikdüzü Temizlik- İstanbul Burun Estetiği- Bakır Sülfat- Rampa- Rotary- Çorlu İnternet Sitesi- youngblood- Çorlu Palet- Çerkezköy Palet- Çorlu Prefabrik- Çorlu Sürücü Kursu- Çorlu Sandviç Panel- Şişli Avukat- Korona Test Kalemi- Çorlu Vinç- Çorlu Pimapen Tamiri-
Powered by vBulletin Version 3.7.2
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Advertisement System V2.6 By   Branden