PDA

Ver la Versión Completa : Manejo de Indices en Mysql temporal


lbidi
17-04-2018, 20:14:10
Estimados..

Tengo el siguiente codigo para crear una tabla temporal en un server MYSQL.
FDQuery.SQL.Clear;
FDQuery.SQL.Add( 'CREATE TEMPORARY TABLE temp ( ');
FDQuery.SQL.Add( 'Cliente Double,');
FDQuery.SQL.Add( 'Nombre Char(30),');
FDQuery.SQL.Add( 'Direccion Char(30),');
FDQuery.SQL.Add( 'Total Double,');
FDQuery.SQL.Add( 'Telefono Char(10) );');
FDQuery.SQL.Add( 'CREATE INDEX xCliente on temp (Cliente);');
FDQuery.SQL.Add( 'CREATE INDEX xNombre on temp (Nombre);');
FDQuery.SQL.Add( 'CREATE INDEX xDireccion on temp (Direccion);');
FDQuery.SQL.Add( 'CREATE INDEX xTotal on temp (Total DESC);');
FDQuery.ExecSQL;

cTablaMy.IndexName := 'xTotal'; <<---- aqui me da error



cual es la sintaxis correcta para tomar por defecto el indice que le indico.
estan bien creados los indices de esta manera ??

Gracias.

Casimiro Notevi
17-04-2018, 20:51:35
¿Y qué es cTablaMy?

lbidi
17-04-2018, 20:53:09
Perdon Casimiro.. es una FDTable..

Neftali [Germán.Estévez]
18-04-2018, 08:50:35
Normalmente cuando se trabaja con SGBD's (Sistemas de Gestión de Base de Datos) no se aplican índices a nivel de componentes, porque se supone que ese trabajado de planificación y optimización queda a cargo del servidor de Bases de Datos. A diferencia de cuando trabajamos con Bases de datos locales(DBase, Accesss, Paradox,...) que ese trabajo quedaba para el programador.

Muchos componentes actuales siguen manteniendo esas propiedades por compatibilidad o simplemente porque entre los componenetes disponibles (aunque trabajemos con SGBD's) sigue existiendo uno para trabajar en memoria (TFDMemTable en el caso de FireDAC (http://docwiki.embarcadero.com/Libraries/Tokyo/en/FireDAC.Comp.Client.TFDMemTable)).

En ese caso sí tiene sentido trabajar con índices porque estamos convirtiendo el trabajo con un servidor de Base de Datos en un trabajo similar a una Base de Datos de escritorio, ya que TFDMemTable lo que hace es traer todos los datos de la tabla a memoria.
Para ellos debes definir los índices en la propiedad Indexes (http://docwiki.embarcadero.com/Libraries/Tokyo/en/FireDAC.Comp.DataSet.TFDDataSet.Indexes) y luego activar el que quieras utilizando la propiedad IndexName (http://docwiki.embarcadero.com/Libraries/Tokyo/en/FireDAC.Comp.DataSet.TFDDataSet.IndexName).

El el caso de TFDTable tal y como te he dicho puedes:

1) Definir los índices en Indexes (http://docwiki.embarcadero.com/Libraries/Tokyo/en/FireDAC.Comp.DataSet.TFDDataSet.Indexes) y liuego activarlo con IndexName (http://docwiki.embarcadero.com/Libraries/Tokyo/en/FireDAC.Comp.DataSet.TFDDataSet.IndexName)
2) Definiendo directamente la propiedad IndexFieldName (http://docwiki.embarcadero.com/Libraries/Tokyo/en/FireDAC.Comp.DataSet.TFDDataSet.IndexFieldNames) que es excluyente con la anterior.

En ambos casos lo que hece el SGBD es "convertir" eso en un ORDER BY en la Base de Datos.

La otra opción en estos casos, es utilizar un TFDQuery y definir la sentencia SQL necesaria con la parte ORDER BY que necesitemos.

lbidi
18-04-2018, 14:53:31
Gracias Neftali por tu amplia y concisa respuesta.

Tratare de hacerlo con FDMemTable y luego cuento como me fue.

Saludos

lbidi
18-04-2018, 20:45:42
Gracias nuevamente Neftali. Lo hice con FDMemTable y anda como balazoo..

Saludos

lbidi
18-04-2018, 20:51:34
Me surge una duda ahora con el siguiente codigo al agregar indices a la tabla.
with FDMemTable.Indexes.Add do
begin
Name := 'xTotal';
Expression := 'Total';
Active := True;
end;

como se hace para indicar que este indice lo quiero descendente ??

Gracias

lbidi
18-04-2018, 21:01:31
Me respondo yo mismo.

Se hace asi
FDMemTable.IndexFieldNames := 'Total : D';

aunque el : y la D van juntos, no los pongo porque me sale el emoticon.. y no se como evitarlo. :confused:

Saludos

Casimiro Notevi
18-04-2018, 22:29:18
aunque el : y la D van juntos, no los pongo porque me sale el emoticon.. y no se como evitarlo.

Con este "comando": :D