Newsgroup: it.comp.lang.delphi
Titolo: Firebird batte Access 147-1

Facendo delle prove con FB ho voluto generare una tabella di 1.000.000 (un 
milione) di record, con un campo data e un campo numerico, utilizzando lo 
script riportato di seguito.
Poi sono andato a vedere le dimensioni del file di database: 256 Kb
Allora, per curiosità, ho provato a fare la stessa cosa in Access, con il 
codice sotto riportato.
Dimensioni del database: 36.9 Mb
Ogni ulteriore commento è superfluo...
========================= SQL SCRIPT ==================================
/*
Obiettivo:
- generare automaticamente una lista di N date consecutive, a partire 
dalla 
data D inclusa. Ogni riga avrà anche un numero progressivo, da 1 a N.
Svolgimento:
- creiamo un nuovo database (E:\test.fdb);
- importiamo una UDF per incrementare una data di un giorno, nello 
specifico 
importiamo da fbudf.dll (fornita nella distribuzione di Firebird) la 
funzione 
ADDDAY;
- creiamo una procedura TEST con due parametri di input, DATE_START (data 
di 
partenza) e DAY_COUNT (numero di righe da generare) e due parametri di 
output, A_DATE (la data generata) e PROG (il numero progressivo della 
riga);
- il corpo della procedura è:
  PROG = 0;
  WHILE (PROG < DAY_COUNT) DO
  BEGIN
    A_DATE = ADDDAY(DATE_START, PROG);
    PROG = PROG + 1;
    SUSPEND; 
  END
- infine eseguiamo il seguente statement SQL:
  SELECT * FROM TEST('TODAY', 10); 
oppure
  SELECT * FROM TEST('10.12.2003', 10);
Osservazioni:
- l'uso di SUSPEND conserva il valore di tutte le variabili (anche di 
quelle 
locali eventualmente definite con DECLARE VARIABLE), mentre EXIT termina 
definitivamente la procedura.
*/
SET SQL DIALECT 3;
SET NAMES ISO8859_1;
CREATE DATABASE 'E:\test.fdb' 
USER 'SYSDBA' PASSWORD 'masterkey'
PAGE_SIZE 1024
DEFAULT CHARACTER SET ISO8859_1;
DECLARE EXTERNAL FUNCTION ADDDAY
    TIMESTAMP,
    INTEGER
    RETURNS TIMESTAMP
    ENTRY_POINT 'addDay' MODULE_NAME 'fbudf';
SET TERM ^ ; 
CREATE PROCEDURE TEST (
    DATE_START DATE,
    DAY_COUNT INTEGER)
RETURNS (
    A_DATE DATE,
    PROG INTEGER)
AS
BEGIN
  EXIT;
END^
ALTER PROCEDURE TEST (
    DATE_START DATE,
    DAY_COUNT INTEGER)
RETURNS (
    A_DATE DATE,
    PROG INTEGER)
AS
BEGIN
  PROG = 0;
  WHILE (PROG < DAY_COUNT) DO
  BEGIN
    A_DATE = ADDDAY(DATE_START, PROG);
    PROG = PROG + 1;
    SUSPEND; /*nota l'uso di SUSPEND a differenza di EXIT*/
/*    IF (R = 3) THEN
      EXIT;*/
  END
END
^
SET TERM ; ^
====================== CODICE ACCESS - VBA ===========================
Sub test(start As Date, count As Long)
    Dim r As DAO.Recordset
    Dim i As Long
 
    Set r = CurrentDb.OpenRecordset("SELECT * FROM TABELLA1", 
dbOpenDynaset)
    CurrentDb.Execute ("DELETE * FROM TABELLA1")
    For i = 1 To count
        r.AddNew
        r!C = i
        r!Data = DateAdd("d", i, start)
        r.Update
    Next
 
'dopo aver creato una tabella di nome TABELLA1 
'con due campi: Data (data/ora) e C (intero lungo)
 
'eseguo la seguente riga in Immediata
'test Date, 1000000
'dimensioni del database: 36.9 Mb
'compatto il database
'dimensioni del database: 36.9 Mb
'eseguo la seguente riga in Immediata
'test date, 10
'dimensioni del database: 36.9 Mb
'compatto il database
'dimensioni del database: 136Kb
End Sub
======================FINE CODICE=======================================
Note: Access 2002 e Firebird 1.5
-- 
Mauro Falzari 
   [ 
http://digilander.libero.it/mauro.falzari
 ]
 
 "Se guardi nell'abisso, anche l'abisso guarda in te." 
   (Friedrich Nietzsche)

 Poi sono andato a vedere le dimensioni del file di database: 256 Kb
probabilmente è una cosa che non interessava nessuno, ma giusto per 
completezza, preciso che preso dall'entusiasmo avevo trascurato un piccolo 
(!) un problema di metodo, infatti con lo script che avevo postato generavo 
una tabella sì di 1.000.000 di record ma questa poi non veniva salvata nel db 
(tecnicamente, essendo una select procedure).
Creando invece una tabella e popolandola di un milione di record ho ottenuto 
una dimensione di 54.77Mb.


 una dimensione di 54.77Mb.
Mi sembrava che ci fosse qualcosa che non andava...ma visti i risultati 
che avevi ottenuto, stavo per chiederti il codice sorgente della 
procedura. ;-)
-- 
Marco «Alka» Breveglieri
  ABLS Team S.n.c. - Software & Web
  Via De Gasperi, 14
  42019 Scandiano (Reggio Emilia)
 
http://www.abls.it

 procedura. ;-)
eh già!!
il codice sorgente della procedura "che non andava" è riportato in calce 
al primo post di questo 3ad, il codice sorgente della prova corretta 
invece è questo:
/*************************************************************************
*****/
/****          Generated by IBExpert 2.5.0.56 14/09/2004 17.07.02          
****/
/*************************************************************************
*****/
SET SQL DIALECT 3;
SET NAMES ISO8859_1;
CREATE DATABASE 'E:\TEST.FDB'
USER 'SYSDBA' PASSWORD 'masterkey'
PAGE_SIZE 1024
DEFAULT CHARACTER SET ISO8859_1;
/*************************************************************************
*****/
/****                        User Defined Functions                        
****/
/*************************************************************************
*****/
DECLARE EXTERNAL FUNCTION ADDDAY
    TIMESTAMP,
    INTEGER
    RETURNS TIMESTAMP
    ENTRY_POINT 'addDay' MODULE_NAME 'fbudf';
SET TERM ^ ; 
/*************************************************************************
*****/
/****                          Stored Procedures                           
****/
/*************************************************************************
*****/
CREATE PROCEDURE NEW_PROCEDURE (
    DATE_START DATE,
    DAY_COUNT INTEGER)
AS
BEGIN
  EXIT;
END^
SET TERM ; ^
/*************************************************************************
*****/
/****                                Tables                                
****/
/*************************************************************************
*****/
CREATE TABLE NEW_TABLE (
    DATA  DATE,
    C     INTEGER
);
/*************************************************************************
*****/
/****                          Stored Procedures                           
****/
/*************************************************************************
*****/
SET TERM ^ ;
ALTER PROCEDURE NEW_PROCEDURE (
    DATE_START DATE,
    DAY_COUNT INTEGER)
AS
DECLARE VARIABLE CNT INTEGER = 1;
BEGIN
  WHILE (CNT < DAY_COUNT + 1) DO
  BEGIN
    INSERT INTO NEW_TABLE(DATA, C) VALUES (ADDDAY(:DATE_START, :CNT), 
:CNT);
    CNT = CNT + 1;
  END
END
^
SET TERM ; ^
