Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 18-07-2008
Avatar de RONPABLO
[RONPABLO] RONPABLO is offline
Miembro Premium
 
Registrado: oct 2004
Posts: 1.514
Poder: 21
RONPABLO Va por buen camino
Donald, lo de los UIDs suena interesante, si no te molesta nos podrias decir con que crea los UIDs?? y en donde los crea... desde la aplicación o desde la base de datos?...
__________________
"Como pasa el tiempo..... ayer se escribe sin H y hoy con H"
Responder Con Cita
  #2  
Antiguo 18-07-2008
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
Cita:
Empezado por donald shimoda Ver Mensaje
Amigo, por si acaso solo para que no pierda tiempo en eso, yo tengo en producción en muchos sistemas funcionando las 24 horas del día firebird 2.0.3 así que dudo mucho que sea la versión de firebird.

Si puedes crea un pequeño caso de prueba y lo pruebo a ver que sucede.

Danos la descripción de los campos que están molestando por favor, así te podemos ayudar mejor.

Saludo.
Si no es la versión de Firebird... entonces.... ¿que puede ser? ¿El DBE? ¿El ODBC? ¿El Delphi (algo difícil que sea este el problema)?
Pues hasta que no aparezca look, podríamos seguir adivinando.

Cita:
Empezado por RONPABLO Ver Mensaje
Donald, lo de los UIDs suena interesante, si no te molesta nos podrias decir con que crea los UIDs?? y en donde los crea... desde la aplicación o desde la base de datos?...
No quisiera ser aguafiestas, pero sería bueno que Donald expusiera el tema en un hilo nuevo. Aunque si se considera que complementa y/o que puede ayudar a tratar la segunda duda de look no hay problema.

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #3  
Antiguo 18-07-2008
Avatar de donald shimoda
donald shimoda donald shimoda is offline
Miembro
 
Registrado: jul 2008
Ubicación: Argentino en Santa Cruz de la Sierra
Posts: 1.083
Poder: 17
donald shimoda Va por buen camino
Cita:
Empezado por Delphius Ver Mensaje
Si no es la versión de Firebird... entonces.... ¿que puede ser? ¿El DBE? ¿El ODBC? ¿El Delphi (algo difícil que sea este el problema)?
Pues hasta que no aparezca look, podríamos seguir adivinando.
exacto no sabemos ni que compos usa...
Cita:
Empezado por Delphius Ver Mensaje
No quisiera ser aguafiestas, pero sería bueno que Donald expusiera el tema en un hilo nuevo. Aunque si se considera que complementa y/o que puede ayudar a tratar la segunda duda de look no hay problema.
Saludos,
Te vi tarde...

Será que el moderador puede mover este post a un hilo nuevo?

Saludos.
__________________
Donald Shimoda [Team RO] - Blogs: Remobjects Pascal
Responder Con Cita
  #4  
Antiguo 18-07-2008
Avatar de RONPABLO
[RONPABLO] RONPABLO is offline
Miembro Premium
 
Registrado: oct 2004
Posts: 1.514
Poder: 21
RONPABLO Va por buen camino
Yo en un principio creí que era bueno hacer una pregunta en otro hilo pero al final me pareció que complementaba algo de lo que se hablaba aquí mismo...
__________________
"Como pasa el tiempo..... ayer se escribe sin H y hoy con H"
Responder Con Cita
  #5  
Antiguo 18-07-2008
Avatar de RolphyReyes
RolphyReyes RolphyReyes is offline
Miembro
 
Registrado: ago 2004
Ubicación: Santo Domingo
Posts: 285
Poder: 20
RolphyReyes Va por buen camino
Red face

Saludos.
NO es por aguarle la fiesta a nuestro compañero donald shimoda pero este articulo es muy interesante sobre el uso de GUID como campo primario (IbExpert DataBase Performance Newsletter)

Cita:
Did you ever thought about possibilities to improve your database performance? Sure, a Database System like Interbase or Firebird is able to speed up typical operations internally, but in a lot of cases, there are very easy but powerful improvements.
Here is one more example:

Use the right Datatype!
Due to some customers ideas, we wanted to know how many influence the changes between GUID and Int32 or Int64 Primary Keys will havein the database design regarding performance.
So we created 3 different databases on a windows machine.
Each will have two simple tables (m for master, d for detail).

Here is the DB structure for Int32 IDs:
Código SQL [-] CREATE TABLE M ( ID INTEGER NOT NULL PRIMARY KEY, TXT VARCHAR(30));

Código SQL [-]CREATE TABLE D ( ID INTEGER NOT NULL PRIMARY KEY, M_ID INTEGER REFERENCES M(ID), TXT VARCHAR(30));


Here is the DB structure for Int64 IDs:
Código SQL [-] CREATE TABLE M ( ID BIGINT NOT NULL PRIMARY KEY, TXT VARCHAR(30));

Código SQL [-]CREATE TABLE D ( ID BIGINT NOT NULL PRIMARY KEY, M_ID BIGINT REFERENCES M(ID), TXT VARCHAR(30));


Here is the DB structure for GUIDs:
Código SQL [-] CREATE TABLE M ( ID CHAR(32) NOT NULL PRIMARY KEY, TXT VARCHAR(30));

Código SQL [-]CREATE TABLE D ( ID CHAR(32) NOT NULL PRIMARY KEY, M_ID CHAR(32) REFERENCES M(ID), TXT VARCHAR(30));

For creating the GUID, we are using a UDF from www.ibexpert.com/download/udf/uuidlibv12.zip
Código SQL [-] DECLARE EXTERNAL FUNCTION GUID_CREATE CSTRING(36) CHARACTER SET NONE RETURNS PARAMETER 1 ENTRY_POINT 'fn_guid_create' MODULE_NAME 'uuidlib';

In the next step we will just show you how to create the stored procedure to generate the data in the GUID DB.
Código SQL [-] CREATE PROCEDURE INITDATA (ANZ INTEGER) AS declare variable m varchar(40); declare variable d varchar(40); declare variable dx integer; begin while (anz>0) do begin m=guid_create(); m=strreplace(m,'-',''); insert into m(id,txt) values (:m,current_timestamp); dx=10; while (dx>0) do begin select guid_create() from rdb$database into :d; d=strreplace(d,'-',''); insert into d(id,txt,m_id) values (:d,current_timestamp,:m); dx=dx-1; end anz=anz-1; end end

A Procedure to create the Integer ID Data is much easier using a generator.

After we have created all 3 databases with the param 500000 (which means 500000 master and 5 milllion detail records are created), we disconnect and reconnect again to see that any cache influence will not change the results.

To do the typical SQL Operation, we start a select that joins all records from all tables
Código SQL [-]
 select count(*) from m join d on d.m_id=m.id

Here are the results over all
Operation/Info Int32 Int64 GUID
DB Size 505 MB 550 MB 1030 MB
INITDATA(500000) 271s 275s 420s
Backup 49s 54s 90s
Restore 124s 127s 144s
Select 22s 22s 49s

Resume
The changes between Int64 and Int32 can almost be ignored, but the changes to a GUID is a problematic design. The integer datatypes will give you better performance.
Pagina: http://www.firebirdnews.org/?p=998
__________________
Gracias,
Rolphy Reyes
Responder Con Cita
  #6  
Antiguo 18-07-2008
Avatar de donald shimoda
donald shimoda donald shimoda is offline
Miembro
 
Registrado: jul 2008
Ubicación: Argentino en Santa Cruz de la Sierra
Posts: 1.083
Poder: 17
donald shimoda Va por buen camino
Cita:
Empezado por RolphyReyes Ver Mensaje
Saludos.
NO es por aguarle la fiesta a nuestro compañero donald shimoda pero este articulo es muy interesante sobre el uso de GUID como campo primario (IbExpert DataBase Performance Newsletter)
Pagina: http://www.firebirdnews.org/?p=998
Amigo Rolphy, por favor si aca estamos todos para aprender. Muy buena la info.

La diferencia es que usa mayor cantidad de digitos un GUID que un UID.

Justamente la idea de usar UIDs es porque la longitud de campor requerida es MENOR que usando GUIDS, esa es la ventaja, mientras se mantienen las características de los GUIDS.

22 chars de los UIDS contra 36 de los GUIDs, no es poca cosa...

Saludos.
__________________
Donald Shimoda [Team RO] - Blogs: Remobjects Pascal
Responder Con Cita
  #7  
Antiguo 18-07-2008
Avatar de RolphyReyes
RolphyReyes RolphyReyes is offline
Miembro
 
Registrado: ago 2004
Ubicación: Santo Domingo
Posts: 285
Poder: 20
RolphyReyes Va por buen camino
Smile

Cita:
Empezado por donald shimoda
Amigo Rolphy, por favor si aca estamos todos para aprender. Muy buena la info.
Sí, verdaderamente y me alegra bastante que sea de tu interés.

Entiendo que la diferencia es "considerable" porque son 14 caracteres menos, pero lo que veo es que aun sigue siendo Alfanumérico y no numérico del todo;
que es justamente lo que incide en el rendimiento de la base de datos.

Mencionas que teniendo un sistema "multi-sucursales" que se repliquen en un servidor es más fácil realizar el proceso, creo más bien que eso va a depender de tu estructura de la BD, porque si es "multi-sucursales" debes de un campo que identifique cual sucursal es la propietaria del registro, y tu clave primaria pude seguir siendo un entero.

Lo que quiero explicar al final, es que no me imagino una BD con 100 tablas y todas sus claves primarias sean Varchar, cuando realices algún tipo de consulta pienso que se sembrara el servidor o tu respuesta tardara bastante.

Es lo que creo!!!
__________________
Gracias,
Rolphy Reyes
Responder Con Cita
  #8  
Antiguo 18-07-2008
Avatar de donald shimoda
donald shimoda donald shimoda is offline
Miembro
 
Registrado: jul 2008
Ubicación: Argentino en Santa Cruz de la Sierra
Posts: 1.083
Poder: 17
donald shimoda Va por buen camino
Cita:
Empezado por RolphyReyes Ver Mensaje
Mencionas que teniendo un sistema "multi-sucursales" que se repliquen en un servidor es más fácil realizar el proceso, creo más bien que eso va a depender de tu estructura de la BD, porque si es "multi-sucursales" debes de un campo que identifique cual sucursal es la propietaria del registro, y tu clave primaria pude seguir siendo un entero.
Buen punto. Pero que sucede cuando los datos NO SON de una sucursal sino del conjunto. Ejemplo clientes, o productos.
Son datos que quiero agregar en una sucursal y que automáticamente sean validos en la BD central, se entiende? Con enteros no podes hacerlo.

Cita:
Empezado por RolphyReyes Ver Mensaje
Lo que quiero explicar al final, es que no me imagino una BD con 100 tablas y todas sus claves primarias sean Varchar, cuando realices algún tipo de consulta pienso que se sembrara el servidor o tu respuesta tardara bastante.
Mis pruebas dicen lo contrario.

Mira, hasta donde yo se (sacado de la lista firebird) los indices son mas óptimos en cuanto a respuesta proporcionalmente a cuanto mas datos diferencian los campos, es decir cuando menos se repiten los datos en la clave primaria.

Por tanto una consulta combinada encontrará los datos más rápidamente cuanto mas DIFERENCIAL sea la clave.

Lo único que jode es en el tamaño , si quieres buscarle un pero. Pero la verdad que en estos días, no es el primer punto a mirar en mi opinión cuando se diseña una base. Sino usemos archivos planos y listo.

Saludos.
__________________
Donald Shimoda [Team RO] - Blogs: Remobjects Pascal
Responder Con Cita
  #9  
Antiguo 18-07-2008
Avatar de donald shimoda
donald shimoda donald shimoda is offline
Miembro
 
Registrado: jul 2008
Ubicación: Argentino en Santa Cruz de la Sierra
Posts: 1.083
Poder: 17
donald shimoda Va por buen camino
Cita:
Empezado por RONPABLO Ver Mensaje
Donald, lo de los UIDs suena interesante, si no te molesta nos podrias decir con que crea los UIDs?? y en donde los crea... desde la aplicación o desde la base de datos?...
Claro amigo, con mucho gusto.

Si utilizas un UDF, que es basicamente una dll generado por delphi y que colocas en la carpeta de udfs de tu servidor delphi, entonces puedes crear luego un procedure en tu base que antes de insertar LLAME al codigo de la udf, genere el UID y lo asigne a tu clave primaria.

Si lo haces en tu delphi (lo cual te la libertad de moverlo entre motores de base de datos el dia de mañana) simplemente le asignas el valor al campo, llamando a la función de la librería que a continuación te copio.

Código Delphi [-]
unit uGUID;
interface

type

  PUUIDc = ^TUUIDc;

  TUUIDc = array[0..21] of AnsiChar;



  PGUIDc = ^TGUIDc;

  TGUIDc = array[0..35] of AnsiChar;



function UUIDCreate(uuid: PUUIDc): PUUIDc; stdcall;

function GUIDcreate(guid: PGUIDc): PGUIDc; stdcall;

function GUIDtoUUID(guid: PGUIDc; uuid: PUUIDc): PUUIDc; stdcall; overload;

function GUIDtoUUID(aGUID: TGUID): string; overload;



function GenGUID(Full: Boolean = False; upperCase: Boolean = False): string;

function GenUUID: string;



implementation



uses SysUtils;



function GenGUID(Full, upperCase: Boolean): string;



var

  aGUID: TGUID;



begin

  CreateGuid(aGUID);

  Result:= GuidToString(aGUID);

  if not Full then

    Result:= System.Copy(Result, 2, 36);

  if upperCase then

    Result:= AnsiUpperCase(Result);

end;



const

  URLchars: array[0..63] of AnsiChar = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_-';



function GUIDcreate(guid: PGUIDc): PGUIDc;



var

  s: string;



begin

  s:= GenGUID(False);

  Move(s[1], guid^, SizeOf(guid^));

  Result:= guid;

end;



function GUIDtoUUID(guid: PGUIDc; uuid: PUUIDc): PUUIDc;



var

  x, i: Integer;

  s: string;

  aGUID: TGUID;

  aGuidArray: array[0..1] of Int64 absolute aGUID;



begin

  SetLength(s, SizeOf(guid^));

  Move(guid^, s[1], SizeOf(guid^));

  aGUID:= StringToGuid(s);

  for x:= Low(uuid^) to High(uuid^) do

  begin

    i:= x div 11;

    uuid[x]:= URLchars[aGuidArray[i] and $0000003F];

    aGuidArray[i]:= aGuidArray[i] shr 6;

  end;

  Result:= uuid;

end;



function UUIDCreate(uuid: PUUIDc): PUUIDc;



var

  x, i: Integer;

  aGUID: TGUID;

  aGuidArray: array[0..1] of Int64 absolute aGUID;



begin

  CreateGuid(aGUID);

  for x:= Low(uuid^) to High(uuid^) do

  begin

    i:= x div 11;

    uuid[x]:= URLchars[aGuidArray[i] and $0000003F];

    aGuidArray[i]:= aGuidArray[i] shr 6;

  end;

  Result:= uuid;

end;



function GUIDtoUUID(aGUID: TGUID): string;



var

  x, i: Integer;

  aGuidArray: array[0..1] of Int64 absolute aGUID;



begin

  SetLength(Result, 22);

  for x:= 1 to 22 do

  begin

    i:= Pred(x) div 11;

    Result[x]:= URLchars[aGuidArray[i] and $0000003F];

    aGuidArray[i]:= aGuidArray[i] shr 6;

  end;

end;



function GenUUID: string;



var

  uuid: TUUIDc;

begin

  UUIDCreate(@uuid);

  SetLength(Result, SizeOf(uuid));

  Move(uuid, Result[1], SizeOf(uuid));

end;



end.

La definición del campo FIREBIRD sería.
Código SQL [-]
CREATE DOMAIN GUID AS CHAR(22) CHARACTER SET ISO8859_1 COLATE ES_ES


Es muy importante lo del charset porque generara unos chars muy raros.

P.D. Perdón por la calidad del identado, el formateador de código del foro lo destrozo, ni idea por que.

Espero que te sirva. Saludos.
Saludos.
__________________
Donald Shimoda [Team RO] - Blogs: Remobjects Pascal

Última edición por donald shimoda fecha: 18-07-2008 a las 16:22:47.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
insertar registro en un grid que esta en otro grid @-Soft SQL 7 20-02-2008 17:22:42
Campos calculados y el GRID agova OOP 1 14-02-2008 19:53:04
la computacion grid en accion - world community grid nightynvid La Taberna 0 04-01-2007 17:33:44
campos de un grid despues de un query davidgaldo Conexión con bases de datos 1 13-11-2003 14:46:49
Visualización de campos MEMO en un Grid Cabanyaler Conexión con bases de datos 2 26-08-2003 13:53:10


La franja horaria es GMT +2. Ahora son las 07:13:03.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi