SQL Server Running Sum (Yürüyen Bakiye)
#1
Merhaba arkadaşlar;

Access ile bir çok yürüyen bakiye denemeleri görmüşüzdür. Sql ile yine Sql de veya ado, dao da Dsum ile ya da başka hazır fonksiyonlarla. Ben de Sql serverda denemek istedim ve 3 farklı yol ile yaptım. Üçünde de süreler arasında çok fark var..

İlk önce deneme yapmak isteyen arkadaşlar için 20.000 kayıtlık tablo oluşturacak kodu verelim..

SQL
  1. CREATE TABLE Satislar (SatID INT, Satis money)
  2. CREATE CLUSTERED INDEX ndx_SatID ON Satislar(SatID)
  3. GO
  4. INSERT Satislar VALUES (1,120)
  5. INSERT Satislar VALUES (2,60)
  6. INSERT Satislar VALUES (3,125)
  7. INSERT Satislar VALUES (4,40)
  8.  
  9. DECLARE @SatID INT, @Satis money
  10. SET @SatID = 5
  11. SET @Satis = 10
  12.  
  13. WHILE @SatID < 20000
  14. BEGIN
  15. INSERT Satislar VALUES (@SatID,@Satis)
  16. SET @SatID = @SatID + 1
  17. SET @Satis = @Satis + 15
  18. END



Tablomuz oluştu ve 20.000 kayıtlık 2 sütundan oluşan 2. sütundaki verilerin herbirinde 15 artan bir tablomuz var. (İlk 4 satır hariç)

Şimdi testlere geçebiliriz. En kötüsünden başlayalım yani SubQuery ile olandan..

SQL
  1. SELECT * , (SELECT SUM(satis) FROM satislar
  2. WHERE SatId<=bb.SatId) AS bbb
  3. FROM Satislar bb



Bu sorgu size tanıdık gelebilir aynısını Access te kullanabiliyoruz.
Bu sorgu yapısıyla 20.000 kayıtlık yürüyen bakiyeli bir sonuç : 1dk 41 saniye

2. yönteme geçelim, burda Cursor ile sonuç alacağız..

SQL
  1. CREATE TABLE #Satislar (SatID INT, Satis money, YuruyenToplam money)
  2.  
  3. DECLARE @SatID INT,
  4. @Satis money,
  5. @YuruyenToplam money
  6.  
  7. SET @YuruyenToplam = 0
  8.  
  9. DECLARE bb_cursor CURSOR
  10. FOR
  11. SELECT SatID, Satis
  12. FROM Satislar
  13.  
  14. OPEN bb_cursor
  15.  
  16. FETCH NEXT FROM bb_cursor INTO @SatID,@Satis
  17.  
  18. WHILE @@FETCH_STATUS = 0
  19. BEGIN
  20. SET @YuruyenToplam = @YuruyenToplam + @Satis
  21. INSERT #Satislar VALUES (@SatID,@Satis,@YuruyenToplam)
  22. FETCH NEXT FROM bb_cursor INTO @SatID,@Satis
  23. END
  24.  
  25. CLOSE bb_cursor
  26. DEALLOCATE bb_cursor
  27.  
  28. SELECT * FROM #Satislar ORDER BY SatID
  29.  
  30. DROP TABLE #Satislar



Bu yöntem ile sonuç 20.000 kayıtta 2 ya da 3 saniye sürmektedir. Oldukça başarılı..

Şimdi son testimizi yapalım burda local update yöntemini kullanacağız..

SQL
  1. DECLARE @Satislar TABLE (SatID INT, Satis money, YuruyenToplam money)
  2.  
  3. DECLARE @YuruyenToplam money
  4.  
  5. SET @YuruyenToplam = 0
  6.  
  7. INSERT INTO @Satislar
  8. SELECT SatID, Satis, NULL
  9. FROM Satislar
  10. ORDER BY SatID
  11.  
  12. UPDATE @Satislar
  13. SET @YuruyenToplam = YuruyenToplam = @YuruyenToplam + Satis
  14. FROM @Satislar
  15.  
  16. SELECT * FROM @Satislar



Veee sonuç 0-1 saniye arası.. İnanılmaz..

Ben aynı testleri 50.000 kayıt ile de yaptım ve sırayla 6 dakika, 7 saniye, 2 saniye olarak sonuç aldım..
Javascript
  1. this.setState({sign:"Here comes the sun...."})







  Alıntı
Bu mesajı beğenenler:
#2
Hocam size imrenmekten ve teşekkür etmekten başka birşey yapamıyoruz.
Teşekkürler..



  Alıntı
Bu mesajı beğenenler:
#3
Elinize sağlık sayın berkant,
bunları örnekle anlatmanız mükünmü acaba,
Eger isterseniz ben örnek bir çalışma yapayım,
siz onun üzerinde bunları bize anlatın.
Çok teşekkürler...



  Alıntı
Bu mesajı beğenenler:
#4
(25-09-2009, 20:06)akd27 demiş ki: Elinize sağlık sayın berkant,
bunları örnekle anlatmanız mükünmü acaba,
Eger isterseniz ben örnek bir çalışma yapayım,
siz onun üzerinde bunları bize anlatın.
Çok teşekkürler...

Sayın Akd, zaten örnek ile çalışın diye örnek tabloyu yapan sql kodunu da verdim en başta Wink
Yine de aklıma gelen şu; siz bunun Access için olduğunu mu düşündünüz yoksa? Sql server için bu yazdıklarım Wink
Javascript
  1. this.setState({sign:"Here comes the sun...."})







  Alıntı
Bu mesajı beğenenler:
#5
Merhaba sayın berkant kardeş,
valla ben access için zannetim ve çok sevindim,
access içinde böyle hızlı bir kodunuz yokmu,
daha önceki 3 sorgudan oluşanı söyleyecekseniz,
hiç zahmet etmeyin, çünkü ben onu yapmaya çalıştım,
malesef yapamadım, daha kolay yukarıdaki gibi bir kodunuz varsa ve bizimle paylaşırsanız ,
çok sevinirim...
İyi hafta sonları...



  Alıntı
Bu mesajı beğenenler:
#6
Ne zamandır söylüyordum... Mukayeseli bir başlık beklemiyordum da açıkcası...
Süper oldu dostum. Wink

*****************
Acces için ise -3. metoda paralel fikir sadece- offline bir recordset(ADOR) yolu izlenebilir. Açarken de cursor tipi ile "LockBatchOptimistic" açılmalı ve "BactchUpdate" ile update olmalı.
Zira diğer cursor tiplerinde döngünün her adımında update olacağından süre uzayacaktır.



  Alıntı
Bu mesajı beğenenler:


Benzer Konular...
Konu: Yazar Cevaplar: Gösterim: Son Mesaj
  Sql Server Sorunu :( ferkuu 1 425 27-06-2022, 14:15
Son Mesaj: adnnfrm
  Sql Server - Access Arayüzü benuva 15 2.949 20-11-2019, 08:30
Son Mesaj: akd27
  Sql Server Diagram Hatası benuva 1 761 15-11-2019, 11:53
Son Mesaj: benuva
  sql server 2012 expres ile bir access veri tabanını ağda paylaşma sercann 0 1.038 08-01-2019, 23:23
Son Mesaj: sercann
  Microsoft SQL Server Hatası PHEADRUS 2 1.451 21-04-2018, 11:01
Son Mesaj: PHEADRUS
  MS SQL Yürüyen Bakiye Sorunu trkmml 4 5.831 31-01-2017, 12:00
Son Mesaj: Zeki Gürsoy
  sql server tablosunda otomatik satır silme hedefkaya 0 1.867 06-11-2016, 18:26
Son Mesaj: hedefkaya
  sql server 2008 yürüyen bakiye ozkbilgi 3 2.380 18-08-2016, 14:10
Son Mesaj: ozkbilgi

Foruma Git:


Bu konuyu görüntüleyen kullanıcı(lar): 1 Ziyaretçi