domenica 9 maggio 2010

FIND('-') (il Mito). Perchè?

E' noto a tutti che a partire dalla versione nav 4.00 SP1 sono stati introdotti le seguenti funzionalità:
  1. FINDFIRST
  2. FINDLAST
  3. FINDSET([ForUpdate][, UpdateKey])

introdotte per sostituire la funzione FIND([Which]). Il FIND presenta una serie di svantaggi come :

  1. l'utilizzo di cursori dinamici per il recupero di dati
  2. restituisce tutto il recordset dei dati della tabella interessata, anche se a noi interessa solo un record. (in questo modo proprio per aver utilizzato i cursori creati e deallocati si ha uno spreco di risorse come occupazione di memoria,CPU,TempDB).
  3. se non dichiarato il find non capisce se deve recuperare i dati i modalità lock o readuncommited.

il FINDFIRST ed il FINDLAST non utilizzano i cursori. Il FINDSET permette di recuperare da SQL solo il numero di record dichiarato nel recordset del DB.

NOTA: il RecordSEt di default a partire dalla versione NAV 6.0 è stato impostato a 50 mentre nelle precedenti era a 500. Bisogna arrivare ad un compromesso sul numero di record da restituire ad un repeat..until. Si rischia di fa ripetere troppe volte la query di recupero dei dati e l'allocazione di memoria. Esempio: supponiamo di effettuare il

rec.findset(false,false) repeat.. until se la tabella rec. restituisce circa 1000 record un recordset impostato a 50 deve effettuare circa 20 chiamate al DB , allocare e deallocare il cursore ed interessare non da poco l'NDBCS.

L'ISEMPTY la funzione piu veloce del west! indica con un valore booleano di ritorno se la tabella è piena o è vuota in base hai filtri indicati. Non ha bisogno di settare la chiave per filtrarsi. Utilizza le statistiche delle chiavi della tabella. Esempio:

  • SELECT TOP 1 NULL FROM "CRONUS$G/L Entry" WITH (READUNCOMMITTED) WHERE ("Posting Date"= '2010-01-01')

Nessun commento:

Posta un commento