Herkese merhaba,
Zaman zaman soru gelir... yürüyen, koşan, zıplayan bakiye vs.
Standart "SELECT" sql ile tam bir işkence haline gelebilen bu istek SQL Server sistemlerde kolay ve "ÇOK" hızlıdır.
Sevgili Berkant konuyla ilgili performans sonuçlarını bizlerle paylaşmıştı. Ben de Firebird ile yaptığım test sonuçlarını sizlerle paylaşmak istedim.
Koşullar:
Local sistem; Firebird Server versiyon:2.1.3; Celeron 2.8; 2 GB DDR; Toplam 50.000 ondalıklı kayıt.
Süreler, VB6 ile Datagrid nesnesinde görüntülendikten sonra alındı.
Database Yapısı (SQL Script):
Kayıt dolduran yapı..
Bilindiği gibi Stored Procedure' ler sunucu(server) işlenir. Cursor' lar ayrıca Firebird' de standart sql cümlelerinde de kullanılabiliyor "EXECUTE BLOCK" deyimi ile.
For-Each yapı..
Fetch yapı..
Sonuçlar:
- Execute Block For-Each : 1,22 sn
- Execute Block Fetch Cursor : 1,26 sn
- Stored Procedure For-Each : 1,56 sn
- Stored Procedure Fetch Cursor : 1,67 sn
![[Resim: speedtest2q.jpg]](http://img18.imageshack.us/img18/5636/speedtest2q.jpg)
![[Resim: speedtestv.jpg]](http://img30.imageshack.us/img30/5673/speedtestv.jpg)
.
Zaman zaman soru gelir... yürüyen, koşan, zıplayan bakiye vs.
Standart "SELECT" sql ile tam bir işkence haline gelebilen bu istek SQL Server sistemlerde kolay ve "ÇOK" hızlıdır.
Sevgili Berkant konuyla ilgili performans sonuçlarını bizlerle paylaşmıştı. Ben de Firebird ile yaptığım test sonuçlarını sizlerle paylaşmak istedim.
Koşullar:
Local sistem; Firebird Server versiyon:2.1.3; Celeron 2.8; 2 GB DDR; Toplam 50.000 ondalıklı kayıt.
Süreler, VB6 ile Datagrid nesnesinde görüntülendikten sonra alındı.
Database Yapısı (SQL Script):
SQL
- /* ZEKİ GÜRSOY © 2009 */
- /* Script bittiğinde connection da otomatik
- kapanacaktır. */
-
- -- Yeni database..
- CREATE DATABASE 'C:\zeki.fdb'
- USER 'SYSDBA'
- PASSWORD 'masterkey'
- PAGE_SIZE = 2048
- DEFAULT CHARACTER SET WIN1254;
-
- -- Tablo yapmak için bağlantı kur..
- CONNECT 'C:\zeki.fdb'
- USER 'SYSDBA'
- PASSWORD 'masterkey';
-
- -- Tablo..
- CREATE TABLE SATISLAR (
- SATID INTEGER,
- SATIS NUMERIC(18, 2));
-
- -- ID alanı indexlenir..
- CREATE INDEX INDEXIM ON SATISLAR(SATID);
-
- /* Procedure' ler..
- Firebird' de iki farklı cursor kullanımı vardır:
- 1- For-Each yapısı,
- 2- Fetch (Explicit) cursor */
- SET TERM ^;
-
- -- For-Each yapı..
- CREATE PROCEDURE BAKIYELER
- RETURNS(
- SATID INTEGER,
- SATIS NUMERIC(18, 2),
- BAKIYE NUMERIC(18, 2))
- AS
- DECLARE VARIABLE DYN_BAKIYE NUMERIC(18, 2);
- BEGIN
- DYN_BAKIYE = 0.00;
- FOR
- SELECT SATID, SATIS FROM SATISLAR
- INTO :SATID, :SATIS DO
- BEGIN
- DYN_BAKIYE = DYN_BAKIYE + SATIS;
- BAKIYE = DYN_BAKIYE;
- SUSPEND;
- END
-
- END^
-
- -- Fetch yapı..
- CREATE PROCEDURE BAKIYELER2
- RETURNS(
- SATID INTEGER,
- SATIS NUMERIC(18, 2),
- BAKIYE NUMERIC(18, 2))
- AS
- DECLARE VARIABLE DYN_BAKIYE NUMERIC(18, 2);
- DECLARE C CURSOR FOR
- (SELECT SATID, SATIS FROM SATISLAR);
- BEGIN
- DYN_BAKIYE = 0.00;
- OPEN C;
- WHILE (1 = 1) DO
- BEGIN
- FETCH C INTO :SATID, :SATIS;
- IF (ROW_COUNT = 0) THEN LEAVE;
- DYN_BAKIYE = DYN_BAKIYE + SATIS;
- BAKIYE = DYN_BAKIYE;
- SUSPEND;
- END
- CLOSE C;
- END^
-
- SET TERM ; ^
Kayıt dolduran yapı..
SQL
- -- 50.000 adet 10 ile 100 arası rasgele ondalık sayılar..
- EXECUTE BLOCK
- AS
- DECLARE I INT = 1;
- BEGIN
- WHILE (I <= 50000) DO
- BEGIN
- INSERT INTO SATISLAR VALUES (:I, ROUND((90 * RAND()) + 10, 2));
- I = I + 1;
- END
- END;
Bilindiği gibi Stored Procedure' ler sunucu(server) işlenir. Cursor' lar ayrıca Firebird' de standart sql cümlelerinde de kullanılabiliyor "EXECUTE BLOCK" deyimi ile.
For-Each yapı..
SQL
- EXECUTE BLOCK
- RETURNS(SATID INTEGER,
- SATIS NUMERIC(18, 2),
- BAKIYE NUMERIC(18, 2))
- AS
- DECLARE VARIABLE DYN_BAKIYE NUMERIC(18, 2);
- BEGIN
- DYN_BAKIYE = 0.00;
- FOR
- SELECT SATID, SATIS FROM SATISLAR
- INTO :SATID, :SATIS DO
- BEGIN
- DYN_BAKIYE = DYN_BAKIYE + SATIS;
- BAKIYE = DYN_BAKIYE;
- SUSPEND;
- END
- END;
Fetch yapı..
SQL
- EXECUTE BLOCK
- RETURNS(SATID INTEGER,
- SATIS NUMERIC(18, 2),
- BAKIYE NUMERIC(18, 2))
- AS
- DECLARE VARIABLE DYN_BAKIYE NUMERIC(18, 2);
- DECLARE C CURSOR FOR
- (SELECT SATID, SATIS
- FROM SATISLAR);
- BEGIN
- DYN_BAKIYE = 0.00;
- OPEN C;
- WHILE (1 = 1) DO
- BEGIN
- FETCH C INTO :SATID, :SATIS;
- IF (ROW_COUNT = 0) THEN LEAVE;
- DYN_BAKIYE = DYN_BAKIYE + SATIS;
- BAKIYE = DYN_BAKIYE;
- SUSPEND;
- END
- CLOSE C;
- END;
Sonuçlar:
- Execute Block For-Each : 1,22 sn
- Execute Block Fetch Cursor : 1,26 sn
- Stored Procedure For-Each : 1,56 sn
- Stored Procedure Fetch Cursor : 1,67 sn
![[Resim: speedtest2q.jpg]](http://img18.imageshack.us/img18/5636/speedtest2q.jpg)
![[Resim: speedtestv.jpg]](http://img30.imageshack.us/img30/5673/speedtestv.jpg)
.


Teşekkürler Zeki..