Foro de elhacker.net

Programación => Bases de Datos => Mensaje iniciado por: Skeletron en 25 Octubre 2009, 22:22 pm



Título: Ayuda con indices en base de datos
Publicado por: Skeletron en 25 Octubre 2009, 22:22 pm
Hola señores..
Les comento que tengo una aplicacion, que al ahcer click en un CALENDARIO, aparecen los datos de las "transacciones" realizadas ese dia... (algo así)
Es como que, en la base de datos, hay unas 50 entradas por cada dia de cada mes..
Entonces para agilizar la busqueda me recomendaron crear INDICES...

Si tengo entradas con los sigueintes valores (columnas): "MES(integer)" "DIA(integer)" "TEXTO(Varchar(200))" "VERSION(integer)"
Yo hago selects del tipo: SELECT Texto FROM Tabladedatos Where Mes = 'xx' and Dia = 'xx'

Me recomienda colocar un indice en Mes? en Dia? o en Ambos?


Título: Re: Ayuda con indices en base de datos
Publicado por: Novlucker en 25 Octubre 2009, 22:33 pm
Y puede que hayan muchos registros? Porque en realidad para una tabla con pocos datos y esos cuatro atributos no te hará mucha diferencia :P

Saludos


Título: Re: Ayuda con indices en base de datos
Publicado por: Skeletron en 25 Octubre 2009, 22:35 pm
Abrá aproximadamente 18.500 registros...


Título: Re: Ayuda con indices en base de datos
Publicado por: Novlucker en 25 Octubre 2009, 22:55 pm
A mi realmente no me parece muy necesario, después de todo la búsqueda es por medio de dos integers  :P

Saludos


Título: Re: Ayuda con indices en base de datos
Publicado por: Skeletron en 25 Octubre 2009, 23:02 pm
Ok, muchas gracias!


Título: Re: Ayuda con indices en base de datos
Publicado por: ^Tifa^ en 26 Octubre 2009, 00:57 am
Si lo veo extremadamente necesario, sobretodo porque hoy son 18,500 registros y en semanas o meses podria ser el duplicado.

Si no tienes indices y buscas X dato en una tabla, es como si tuvieras un libro de 1,000 paginas con informacion de lado y lado por pagina, y yo te diga Skeletron buscame en el libro algo sobre 'tecnologia actual' y tu tengas que empezar hoja, por hoja, por hoja a buscarme (digamos que tu libro no tiene indice) sin embargo si tu libro tiene un indice delante que dice los temas y subtemas por paginas, no seria mas eficiente para ti y mas rapido y menos perdida de tiempo por lo menos saber que en la pagina X hay info sobre 'tecnologia actual' que ir hojeando hoja, por hoja, por hoja ???

Esto aplicalo a nivel de un programa en un PC, en este caso la base de datos, hace lo mismito, empieza a buscar la info en las tablas y esto es lectura del HD buscando un dato..... imaginate 20 usuarios a la vez buscando distintos datos en la misma tabla sin indices... y leyendo y leyendo en tu HD buscando ahi...

Como indice podria recomendarte un ID o algo similar, es que si te digo DIA o MES muchos registros podrian tener el mismo DIA y el mismo MES cuando tu solo quieres la info de 1 solo registro por ejemplo. Aun estas a tiempo de alterar la tabla y agregarle un campo ID por registro, y hacer un bucle en tu lenguaje que llene ese campo ID desde 1 hasta 18,500 para que asi cada registro tenga su correspondiente ID y te sea mas facil la busquedad con Indices


Título: Re: Ayuda con indices en base de datos
Publicado por: ^Tifa^ en 26 Octubre 2009, 01:19 am
De hecho como soy un poco pesima exponiendome, lo hago mas visual:

Tengo 1 simple tabla con 3 datitos:

Código
  1.  
  2. mysql> SELECT * FROM ejemplo;
  3. +------+------+--------+    
  4. | dia  | mes  | nombre |    
  5. +------+------+--------+    
  6. |    1 |   11 | Maria  |
  7. |    1 |   10 | Juan   |
  8. |    2 |    9 | Pedro  |
  9. +------+------+--------+
  10. 3 ROWS IN SET (0.00 sec)
  11.  
  12.  

No tengo indices como tu. Asi que hago una mera consulta sencilla:

Código
  1.  
  2. mysql> SELECT * FROM ejemplo WHERE dia = 1;
  3. +------+------+--------+
  4. | dia  | mes  | nombre |
  5. +------+------+--------+
  6. |    1 |   11 | Maria  |
  7. |    1 |   10 | Juan   |
  8. +------+------+--------+
  9. 2 ROWS IN SET (0.00 sec)
  10.  
  11.  
  12.  

Todo bien? visualmente si.... ahora veamos como el motor analiza en verdad el asunto de busquedad en el disco, usemos la herramienta de preferencia EXPLAIN (para tunnings en base de datos)

Código
  1.  
  2. -mysql> EXPLAIN SELECT * FROM ejemplo WHERE dia = 1;
  3. +----+-------------+---------+------+---------------+------+---------+------+------+-------------+
  4. | id | select_type | TABLE   | TYPE | possible_keys | KEY  | key_len | REF  | ROWS | Extra       |
  5. +----+-------------+---------+------+---------------+------+---------+------+------+-------------+
  6. |  1 | SIMPLE      | ejemplo | ALL  | NULL          | NULL | NULL    | NULL |    3 | USING WHERE |
  7. +----+-------------+---------+------+---------------+------+---------+------+------+-------------+
  8. 1 ROW IN SET (0.00 sec)                                                                            
  9.  
  10. mysql> EXPLAIN SELECT * FROM ejemplo WHERE dia = 1 AND mes = 11;
  11. +----+-------------+---------+------+---------------+------+---------+------+------+-------------+
  12. | id | select_type | TABLE   | TYPE | possible_keys | KEY  | key_len | REF  | ROWS | Extra       |
  13. +----+-------------+---------+------+---------------+------+---------+------+------+-------------+
  14. |  1 | SIMPLE      | ejemplo | ALL  | NULL          | NULL | NULL    | NULL |    3 | USING WHERE |
  15. +----+-------------+---------+------+---------------+------+---------+------+------+-------------+
  16. 1 ROW IN SET (0.00 sec)
  17.  
  18.  
  19.  
  20.  

Fijate la parte donde dice:  rows - 3  (como no tengo indices definidos en mi tabla, aunque haga la busquedad por una constante dia = 1 el motor de la DB debe buscar en todos los registros para dar con la ubicacion de ese registro, en este caso recorrio todos los datos de mi tabla que son apenas 3.... en tu caso serian 18,500 registros a recorrer antes de devolverte donde esta el valor).

Ahora creo un indice en mi tabla:

Código
  1.  
  2. mysql> CREATE INDEX indice ON ejemplo(dia);
  3. Query OK, 3 ROWS affected (0.05 sec)
  4. Records: 3  Duplicates: 0  Warnings: 0
  5.  
  6. mysql> EXPLAIN SELECT * FROM ejemplo WHERE dia = 1;
  7. +----+-------------+---------+------+---------------+--------+---------+-------+------+-------------+
  8. | id | select_type | TABLE   | TYPE | possible_keys | KEY    | key_len | REF   | ROWS | Extra       |
  9. +----+-------------+---------+------+---------------+--------+---------+-------+------+-------------+
  10. |  1 | SIMPLE      | ejemplo | REF  | indice        | indice | 5       | const |    1 | USING WHERE |
  11. +----+-------------+---------+------+---------------+--------+---------+-------+------+-------------+
  12. 1 ROW IN SET (0.01 sec)
  13.  
  14. mysql> EXPLAIN SELECT * FROM ejemplo WHERE dia = 3;
  15. +----+-------------+---------+------+---------------+--------+---------+-------+------+-------------+
  16. | id | select_type | TABLE   | TYPE | possible_keys | KEY    | key_len | REF   | ROWS | Extra       |
  17. +----+-------------+---------+------+---------------+--------+---------+-------+------+-------------+
  18. |  1 | SIMPLE      | ejemplo | REF  | indice        | indice | 5       | const |    1 | USING WHERE |
  19. +----+-------------+---------+------+---------------+--------+---------+-------+------+-------------+
  20. 1 ROW IN SET (0.01 sec)
  21.  
  22.  

Que curioso ahora fijate en la parte donde dice rows -> 1 (recorrio 1 sola fila para dar exactamente con mi registro en vez de recorrer todos los registros como haria sino tengo un indice definido).





Título: Re: Ayuda con indices en base de datos
Publicado por: seba123neo en 26 Octubre 2009, 01:50 am
si es verdad al poner indices en la base, aumenta considerablemente la velocidad de busqueda en los selects, yo diria que lo pongas, total mal no te va a venir,y mejor ponerlo ahora que depues cuando se presente algun problema. ¿año no hay?


Título: Re: Ayuda con indices en base de datos
Publicado por: Skeletron en 26 Octubre 2009, 02:48 am
Claro.. lo entendí muy bien Tifa..
Como siempre, me falta "detallarme" mas..
Las entradas son 18.500 y no aumentarán mucho.. es mas, podrian aumentarse unas 5 o 6 entradas por MES.. pero al cabo de 1 o 2 años, no creo que aumente mucho... (a no ser que luego de un tiempo haga éste software 2.0)

Te comento como es la aplicacion así te das cuenta que me conviene para hacer Indice:
En la aplicacion hay un CALENDARIO, que al hacerle click en un dia, llama a la sentencia SELECT texto FROM Efemerdies where mes='messeleccionado' and dia='diaseleccionado'

Por dia hay unas 50 efemerides, y esas efemerides se agregaran en un la LISTA de items de vb.net
lsita.item.add(SQLReader(0))
Se entiende??

Esa base de datos esta en la PC del usuario.. así que no hya MULTIPLES lecturas simultaneas a la base de datos..

Pero igual, la idea es que mas o menos en 6 meses haga a ese Software de tipo 2.0, para que la gente pueda agregar "Efemerides" importantes.. para que yo las analice y las "acepte" y se areguen a la base de datos (que se actualiza automaticamente.. pero eso ya lo tengo FRITO)

Entonces, ahroa sabiendo que mi SELECT tiene que buscar entre todas las entradas, y seleccionar las entradas de X mes (que dará como resultado unas 1.200 entradas..) y entre esas 1.200 tiene que seleccionar las de dia X, que serán aproximadamente 50..

Tendré que poner INDICE a MES? a DIA? o a Ambos?
Porque leí que exederse de Indices, tambien es malo.. seguramente ustedes saben que convendria..


Título: Re: Ayuda con indices en base de datos
Publicado por: Novlucker en 26 Octubre 2009, 02:57 am
Lo que plantea ^TiFa^ esta excelente (como siempre  ;)), no obstante, yo decía que no lo veía necesario porque suponía que era justamente para tu programa de efemerides, las cuales son limitadas y se consultan un número acotado de veces (en un intervalo dado)  :P, además de que en tu caso necesitas recuperar las 50 efemerides y no un solo registro, personalmente no lo pondría, pero creo que le haría caso a ^TiFa^ de sugerir hacerlo de cualquier manera, tiene más experiencia que yo con BBDD

Saludos


Título: Re: Ayuda con indices en base de datos
Publicado por: Skeletron en 26 Octubre 2009, 03:06 am
Novu.. CITO lo mio: (se que odias hacerlo tu)

Citar
Tendré que poner INDICE a MES? a DIA? o a Ambos?
Porque leí que exederse de Indices, tambien es malo.. seguramente ustedes saben que convendria..


Título: Re: Ayuda con indices en base de datos
Publicado por: ^Tifa^ en 26 Octubre 2009, 04:25 am
Gracias Novlucker, aunque para nada quize descartar tu opcion encanto  :-*  solo que 18,500 registros es alguito  largo y dije bueno si el chico puede ahorrarse unos bytes de segundos en lectura del disco poseyendo indices, porque no.

Yo conozco casi nada del funcionamiento interno de SQLite que conste, toda esta ejemplificacion es en base a otras bases de datos relacionales mas profesionales (como MySQL, Oracle, SQL Server) y ya que SQLite pretende ir acorde con el ANSI SQL puede que posea las mismas caracteristicas de funcionamiento que un motor de base de datos profesional. Por lo general, un motor de base de datos profesional funciona asi cada vez que haces una consulta por mas minima que sea :

Paso uno : verificar la metada para ver que permisos posee el usuario conectado a la DB en ese momento sobre esa tabla(si posee permisos de lectura, escritura, modificacion, etc).

Paso Dos: En tu caso que no tienes indices, aunque solo requieras 50 registros como no hay indices el recorrera los 18,500 actuales de registros antes de devolverte los 50 registros (Y si en esos registros tienes valores nulos tarda unos bytes mas en su busquedad).

Paso Tres: Ya finalizado devuelve los datos.

No temas sobre cantidad de indices soportados en una DB, por lo general acceptan un maximo de 64 y mas indices....

Si gustas usas indices por optimizacion mas que todo, pero sino te conviene ya sabes. Si te recomiendo que uses de indice entonces DIA y MES




Título: Re: Ayuda con indices en base de datos
Publicado por: Skeletron en 26 Octubre 2009, 05:00 am
Gracias po la respuestaaaaaaaa!!!!!!!!!!!!!!
Y ya que estamos.. Pasate por aqui, a ver si me das una mano:
http://foro.elhacker.net/programacion_general/ayudaextrano_comportamiento_de_sqlite-t271884.0.html


Título: Re: Ayuda con indices en base de datos
Publicado por: ^Tifa^ en 26 Octubre 2009, 13:19 pm
No conozco en abundancia el funcionamiento interno de SQLite, pero hasta lo poco que he visto en su website, tiene ciertas diferencias en cuanto a forma de funcionar en relacion a una base de datos SQL profesional. Por ejemplo, no maneja permisos de acceso de usuarios  :-\  por ende puedes obviar el punto cuando afirme :

Citar
Paso uno : verificar la metada para ver que permisos posee el usuario conectado a la DB en ese momento sobre esa tabla(si posee permisos de lectura, escritura, modificacion, etc).

Ya que esto al menos en SQLite no aplica, no hay usuarios con distintos privilegios sobre objetos o tablas (tragico para la seguridad  :-\ ) por ende, a lo mejor (aunque no te lo puedo asegurar) utilizar indices en SQLite sea algo relativo, y esto no implique optimizacion alguna a la hora de una busquedad (Como dice el chiquito Novlucker  :-*   :-*  ), aunque puede que si habria que indagar mas sobre el funcionamiento interno de esta DB (Ya que varia demasiado de una base de datos relacional profesional).



Título: Re: Ayuda con indices en base de datos
Publicado por: -Ramc- en 26 Octubre 2009, 16:22 pm
Preguntaste otra vez lo mismo  :xD

Bueno ya te había respuesto acá

http://foro.elhacker.net/programacion_general/eliminar_post-t271946.0.html

Yo te recomendaría que uses algo como id de la entrada o el nombre de la entrada, ya que si tienes 50 entradas por cada día tendrías que usar como llave primaria la fecha exácta, es decir con hora y segundos de ser posible, pero, igualemente es mejor un indice, no se como usas mes como llave primaria ya que no identifica para nada tu tabla, ni es única para cada campo, dejanos ver como es la estructura de la tabla y que campos tienes ademas de esos.

Creo que es algo parecido, pero, bueno, ya lo resolviste.

Saludos.


Título: Re: Ayuda con indices en base de datos
Publicado por: sempus en 26 Octubre 2009, 16:48 pm
raro, yo nunca le pondria un indice a "estos" campos, yo hubiera creado un campo fecha y no uno mes - dia, y crearle el indice a fecha que es mas completo  :silbar: y estoy casi seguro que el tiempo de respuesta seria mejor si hablamos de una cantidad mayor de datos.

^TiFa^ no conocia la utilidad Explain me parece simplemente magnifica ^^


salu2


Título: Re: Ayuda con indices en base de datos
Publicado por: ^Tifa^ en 26 Octubre 2009, 18:25 pm
Me encontre un poco extranio que lleve separado una fecha (1 campo mes, 1 campo dia) existiendo tipo de datos DATE pero... luego dije ya que el chico tiene 18,500 registros jejejejeje.. como que alterar la tabla para modificar esto es un poco complicado y forzado. Entonces, para no complicarle mas el asunto, lo mas facil seria que hiciese un campo ID que le sirva de indice (En este sentido si puede alterar la tabla para agregarle ese campo exclusivo) y llenarlo con un bucle for hecho en cualquier Script que corra desde 1 hasta 18,500 (que son la cantidad de registros que el tiene) pero luego el dio la informacion que por dia podian existir 50 registros... entonces aca ya variaria el asunto del campo ID que podria continuar siendo indice (para usarlo de optimizacion en una consulta) pero dicho campo ID deberia tener un valor unico numerico en los 18,500 registros (El que el quiera hasta el numero 1 si gusta, asi el campo ID que es indice al tener definido el valor '1' es siempre una constante)  y que use tambien de index(mes,dia) asi podria filtrar mejor el asunto a la hora de busquedad sin mucho esfuerzo.

Aunque por lo que veo SQLite descarta muchisimas cosas 'normales' en otras DB profesionales, por ende, desconozco si realmente SQLite haga o no mucho caso a tener campos indices y optimizacion de lectura en el HD.

Por cierto sempus, es bastante utilizada la clausula EXPLAIN en base de datos relacionales, al menos en MySQL y Oracle las suelo utilizar bastante y mejora sobremanera el tiempo de lectura de bytes en disco  ;)  te recomiendo a ti, y a quien sea que investigue mas sobre EXPLAIN en base de datos, ya que estoy consciente que muchos 'programadores webs' piensan que saber SQL es saber manipular  a medias (SELECT, INSERT, UPDATE) y despues de un tiempo cuando la DB comienza a crecer y crecer se preguntan porque va tan lenta mi pagina web en relacion a las consultas antes no era asi  :-\  (Claro antes hablabamos de a lo mejor 1,000 registros y hoy hablamos de 500,000 mil registros) Y esto sin Tunning es critico.

Un besote enorme  :-*   :-*   :-*  


Título: Re: Ayuda con indices en base de datos
Publicado por: Skeletron en 27 Octubre 2009, 19:28 pm
Tifa.. tengo los 18.500 entradas en un .txt.. son lineas de texto.. aun no las he pasado a la base de datos original..
Digamos que no es ningun tipo de problema modificar las columas de la base de datos, porque aun no la he creado.. y las entradas en -txt son solamente los valores del campo: "Texto" porque el campo DIA y MES los voy creando automaticamente.. (dando valores respecto el nombre del archivo..)

Así que.. como me recomendas hacer la tabla?
una columna FECHA? y la columna TEXTO?
FECHA deberia ser un VARCHAR?
Porque cuando le pongo formato DATE, y hago un select y me devuelve tambien la HORA.. (supongamos que inserte: 21-01-1990, me devuelve 21-01-1990 00:00:00)
Y no quiero que sea así... tambien estoy renegando mucho con el formato DATE pqroue no encuentro ejemplos o documentacion en español de como utilizarlo.. hay poco en la red de SQLite (y he buscado mucho... lo juro..)

Dime que harias tu..


Título: Re: Ayuda con indices en base de datos
Publicado por: ^Tifa^ en 27 Octubre 2009, 21:36 pm
Yo crease el campo FECHA DATE, de verdad no tengo palabras para la situacion que te ocurre en relacion a declarar un campo tipo DATE y que SQLite insista en insertar datos como si dicho campo fuese FECHA DATETIME.

El estandar de datos primitivos en todas las DB relacionales profesionales que he visto y conozco (Y la implementacion del estandar ANSI SQL por igual afirma) que un tipo de dato DATE debe registrar los datos insertados de esta manera:

'YYYY-MM-DD' (año-Mes-Dia)

Haz una prueba, create una simple tabla en SQLite con 1 campo FECHA DATE y inserta un registro de la siguiente manera:

INSERT INTO TABLA XXXX VALUES('1990-01-21')

Y luego haz un SELECT deberia devolverte el valor sin la hora pegada (Siempre y cuando el campo sea tipo DATE y no DATETIME).


Título: Re: Ayuda con indices en base de datos
Publicado por: ^Tifa^ en 27 Octubre 2009, 21:50 pm
Si aun haciendo los pasos requeridos te sigue mostrando la fecha en los campos tipo DATE asi :

2009:11:21 15:00:00

Puedes utilizar SUBSTR para ir llenando ese campo  ;)  sino entiendes el funcionamiento de SUBSTR exponlo y se te ayuda. Pero es preferible que tengas el campo con datos DATE en vez de dividido un campo mes, otro año, otro dia.


Título: Re: Ayuda con indices en base de datos
Publicado por: seba123neo en 27 Octubre 2009, 23:51 pm
Porque cuando le pongo formato DATE, y hago un select y me devuelve tambien la HORA.. (supongamos que inserte: 21-01-1990, me devuelve 21-01-1990 00:00:00)
Y no quiero que sea así...

eso es obvio, pero en cualquier motor, ya sea SQL Server o SQL Lite podes formatear  en el select para traer solo la fecha...o lo que quieras, solo es cuestion de investigar un poco, ¿no hay?...en 10 segundos encontre...

Date And Time Functions (http://www.sqlite.org/lang_datefunc.html)



Título: Re: Ayuda con indices en base de datos
Publicado por: ^Tifa^ en 28 Octubre 2009, 01:28 am
Si SQLite tiene sus cositas personalizadas .... hay que pasarle formato por lo visto a los campos DATE en SQLite. Pero si se te complica mucho el asunto chico, crea el campo tipo DATE he inserta la fecha, como te decia si por cada registro de fecha que ingreses se te guardan asi:

1999-11-23   10:03:00

Utiliza para obtener los datos en una busquedad la funcion SUBSTR (Que asumo debe existir en SQLite) te mostrare un ejemplo en MySQL :

Código
  1.  
  2. mysql> SELECT * FROM ejemplo;
  3. +---------------------+
  4. | fecha               |
  5. +---------------------+
  6. | 2009-11-22 00:00:00 |
  7. | 2006-10-30 00:00:00 |
  8. | 2001-08-23 00:00:00 |
  9. | 1998-10-29 00:00:00 |
  10. +---------------------+
  11. 4 ROWS IN SET (0.00 sec)
  12.  
  13. mysql> SELECT substr(fecha, 1, 10) FROM ejemplo WHERE fecha  LIKE '2001-08-23%';
  14. +----------------------+
  15. | substr(fecha, 1, 10) |
  16. +----------------------+
  17. | 2001-08-23           |
  18. +----------------------+
  19. 1 ROW IN SET (0.00 sec)
  20.  
  21. mysql> SELECT substr(fecha, 1, 10) FROM ejemplo WHERE fecha  LIKE '1998-%-29%';
  22. +----------------------+
  23. | substr(fecha, 1, 10) |
  24. +----------------------+
  25. | 1998-10-29           |
  26. +----------------------+
  27. 1 ROW IN SET, 1 warning (0.00 sec)
  28.  
  29.  

No hay tunning ni optimizacion alguna en la consulta, es mas para que te sirva de referencia de como podrias buscar los datos en la tabla sin necesidad de que te devuelve el rango de fecha con la hora incluida. la funcion SUBSTR funciona   SUBSTR(campo, desde, hasta)
Siendo desde la ubicacion del registro donde se comenzara a contar y hasta, hasta donde se contara en el caso de una fecha:

1999-11-23   10:02:00

Desde el digito 1 hasta el 10 es '1999-11-23'

Besos  :-*


Título: Re: Ayuda con indices en base de datos
Publicado por: Skeletron en 28 Octubre 2009, 05:00 am
Porque cuando le pongo formato DATE, y hago un select y me devuelve tambien la HORA.. (supongamos que inserte: 21-01-1990, me devuelve 21-01-1990 00:00:00)
Y no quiero que sea así...

eso es obvio, pero en cualquier motor, ya sea SQL Server o SQL Lite podes formatear  en el select para traer solo la fecha...o lo que quieras, solo es cuestion de investigar un poco, ¿no hay?...en 10 segundos encontre...

Date And Time Functions (http://www.sqlite.org/lang_datefunc.html)



Lee bien lo que puesto.. dije que no hay EN CASTELLANO.. no soy muy bueno con el ingles...


Y ahorita pruebo loq ue em dices Tifa..
Gracias!!!


Título: Re: Ayuda con indices en base de datos
Publicado por: Skeletron en 28 Octubre 2009, 05:17 am
Perdon por armar tanto disturbio al pedo...
Tal vez lo habia hecho mal anteriormente.. tal vez ponia datatime....

Hice lo siguiente:
Cree la base con un Fecha DATE

y luego:
Código
  1. Public Class Form1
  2.  
  3.    Private database As String = "C:\databaseprueba.db3"
  4.    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  5.        Dim SQLconnect As New SQLite.SQLiteConnection()
  6.        Dim SQLcommand As SQLite.SQLiteCommand
  7.        SQLconnect.ConnectionString = "Data Source=" & database & ";"
  8.        SQLconnect.Open()
  9.        SQLcommand = SQLconnect.CreateCommand
  10.        'Insert Record into Foo
  11.        SQLcommand.CommandText = "INSERT INTO Prueba (Fecha) VALUES ('1991-02-22')"
  12.        SQLcommand.ExecuteNonQuery()
  13.        SQLcommand.Dispose()
  14.        SQLconnect.Close()
  15.    End Sub
  16.  
  17.    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
  18.        Dim SQLconnect2 As New SQLite.SQLiteConnection()
  19.        Dim SQLcommand2 As SQLite.SQLiteCommand
  20.        SQLconnect2.ConnectionString = "Data Source=" & database & ";"
  21.        SQLconnect2.Open()
  22.        SQLcommand2 = SQLconnect2.CreateCommand
  23.        SQLcommand2.CommandText = "SELECT * FROM Prueba"
  24.        Dim SQLreader2 As SQLite.SQLiteDataReader = SQLcommand2.ExecuteReader()
  25.        While SQLreader2.Read()
  26.            MsgBox(SQLreader2(0))
  27.        End While
  28.        SQLcommand2.Dispose()
  29.        SQLconnect2.Close()
  30.    End Sub
  31. End Class


Y perfectamente me mostró la fecha así:
22/02/1991


Muchisimas gracias!!!!!


Entonces ahora volviendo al tema... me recomiendas hacer un INDICE en el nuevo campo FECHA, y realizar una busqueda concatenando el dia con el mes...
Tendré que ponerle a todas las fechas el año 0000.. porque son efemerides.. se supone que no importa en que año fueron.. (aunque se detalla en el texto)..

Gracias a todos che.. como siempre, un AGRADO MUY GRANDE el aprendender con ustedes!


PD.: Agrego algo:
para hacer una busqueda, hay que escribirla de esta manera: "SELECT * FROM Prueba WHERE Fecha='1990-01-21'", y no como muestra el resultado (21/01/1990)


Y pregunto algo mas..
Supongamos que hago un INDICE así.
CREATE INDEX indice ON Prueba(Fecha)
Luego al hacer un SELECT, no tengo que poner el nombre del indice no?? tengo que seguir usando el "Prueba" como "nombre de columna"... o me equivoco?


Título: Re: Ayuda con indices en base de datos
Publicado por: ^Tifa^ en 28 Octubre 2009, 05:40 am
Disculpa que no te ayude mucho a estas horas.... es tarde, tengo un suenio enorme  :xD  y debo levantarme a las 5:30 am para el trabajo y ahora son las 12:34 am  :xD

Citar
Supongamos que hago un INDICE así.
CREATE INDEX indice ON Prueba(Fecha)
Luego al hacer un SELECT, no tengo que poner el nombre del indice no?? tengo que seguir usando el "Prueba" como "nombre de columna"... o me equivoco?

No, no tienes que colocar el nombre del indice, dicho nombre es solo para guardarlo en el diccionario de la DB donde se reflejan todos los indices, de todas las tablas y bajo que usuario (En caso que quieras hacer una busquedad bajo nombre del indice para averiguar a que tabla, usuario, instancia pertenece  ;)  lo cual no es tu caso).

Citar
me recomiendas hacer un INDICE en el nuevo campo FECHA, y realizar una busqueda concatenando el dia con el mes...

No debes concatenar ahora, recuerda que la fecha viene ahora en 1 solo formato y pegado  :xD te convendria mas usar SUBSTR por ejemplo.


Título: Re: Ayuda con indices en base de datos
Publicado por: Skeletron en 28 Octubre 2009, 06:15 am
No no.. me referia a que tendre que concatenar porque:
Tengo 12 carpetas, y dentro de cada carpeta tengo 31 archivos de texto con cada linea una entrada para la base de datos.. entonces hago lo sigueinte:

(aunque se me presento otro problema.. leer debajo de todo)

Código
  1.    Private Sub INSERTAR(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  2.        Dim conexión As New SQLite.SQLiteConnection()
  3.        Dim Consulta As SQLite.SQLiteCommand
  4.        Dim linea As String = ""
  5.        conexión.ConnectionString = "Data Source=" & Database & ";"
  6.        conexión.Open()
  7.        Consulta = conexión.CreateCommand
  8.        For Mess As Integer = 1 To 2 '12
  9.            For Diaa As Integer = 1 To 2 '31
  10.                Dim Lectura As StreamReader = New StreamReader("C:\Users\Noel\Desktop\BrodaSoft\Visual Basic Proyectos\BACKUP's\VIDay\Version 7 Oficial\DataBase\" & Mess & "\" & Diaa & ".txt", System.Text.Encoding.Default, False)
  11.                While True
  12.                    linea = Lectura.ReadLine
  13.                    If linea = "" Then
  14.                        Exit While
  15.                    End If
  16.                    linea = linea.Replace("'", "-")
  17.                    linea = linea.Replace("\", "")
  18.                    linea = linea.Replace("""", "-")
  19.                    Consulta.CommandText = "INSERT INTO Efemerides (Fecha, Texto, Version) VALUES ('0000-" & Mess & "-" & Diaa & "', '" & linea & "', '1')"
  20.                    Consulta.ExecuteNonQuery()
  21.                End While
  22.                Lectura.Dispose()
  23.                Lectura.Close()
  24.            Next
  25.            MsgBox("Fin de mes")
  26.        Next
  27.        Consulta.Dispose()
  28.        conexión.Close()
  29.        MsgBox("Listo")
  30.    End Sub


Como veran, leo éste archivo:
C:\Users\Noel\Desktop\BrodaSoft\Visual Basic Proyectos\BACKUP's\VIDay\Version 7 Oficial\DataBase\0" & Mess & "\" & Diaa & ".txt"
Que segun los valores de los FOR, entraré al 1º dia del 1º mes:
C:\Users\Noel\Desktop\BrodaSoft\Visual Basic Proyectos\BACKUP's\VIDay\Version 7 Oficial\DataBase\1\1.txt"
E insertará la 1º linea de ese archivo.. y colocará en la fecha de ingreso: 0000-1-1
:)
Como hago para que ese 0000-1-1 pase a ser 0000-01-01 ??? porque aunque no lo crean, da error en el formato data al hacer el Select :O



Las carperas van del 01 al 012 (era así porque en su momento RIPWAY no me permitia nombre tan corto en carpeta :P)
Y los archivos, del 1 al 31

Cambiarle el nombre a las carpetas, es facil... le pongo del 01 al 12 si quiero.. pero que hago con los archivos???
Capaz tenga que jugar un poco con acumuladores.. y problema solucionado.. ya vere que ahgo..


Título: Re: Ayuda con indices en base de datos
Publicado por: ^Tifa^ en 29 Octubre 2009, 04:26 am
Valgame que pena que no se Visual Basic  :-(

Porque tu problemita lo analize, y lo resolvi pero en PERL  :-[

Código
  1.  
  2. for ( my $mes = 1; $mes <= 12; $mes++ ) {
  3.  for ( my $dia = 1; $dia <= 31; $dia++ ) {
  4.  
  5.        if ( $mes <= 9 && $dia <= 9 ) {
  6.  
  7.              print STDOUT "0000-" . '0' . $mes . "-" .   '0'   .   $dia . "\n";
  8.              next;
  9.        }
  10.            print STDOUT "0000-" . $mes . "-" . $dia . "\n";
  11. }
  12. };
  13.  
  14.  

Lo cual al ejecutar me imprime:

Citar
       
0000-09-01               
0000-09-02               
0000-09-03               
0000-09-04               
0000-09-05               
0000-09-06               
0000-09-07               
0000-09-08               
0000-09-09

Obviamente la condicion se cumple en mes y dia con un cero de primera, siempre y cuando tanto mes como dia sean igual o menor que 9  ;)  puedes hacerlo esto solo es una idea de que podrias hacer para tu problemita. Los puntitos que vez en los PRINT son 'concatenar'  si te sirve puedes analizarlo, echarle mas logica y hacer eso bucles for con condiciones si se cumple tal cosa concatename cero en dia y mes, sino se cumple quitamele el cero.



Título: Re: Ayuda con indices en base de datos
Publicado por: seba123neo en 29 Octubre 2009, 04:37 am
No no.. me referia a que tendre que concatenar porque:
Tengo 12 carpetas, y dentro de cada carpeta tengo 31 archivos de texto con cada linea una entrada para la base de datos.. entonces hago lo sigueinte:

(aunque se me presento otro problema.. leer debajo de todo)

Código
  1.    Private Sub INSERTAR(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  2.        Dim conexión As New SQLite.SQLiteConnection()
  3.        Dim Consulta As SQLite.SQLiteCommand
  4.        Dim linea As String = ""
  5.        conexión.ConnectionString = "Data Source=" & Database & ";"
  6.        conexión.Open()
  7.        Consulta = conexión.CreateCommand
  8.        For Mess As Integer = 1 To 2 '12
  9.            For Diaa As Integer = 1 To 2 '31
  10.                Dim Lectura As StreamReader = New StreamReader("C:\Users\Noel\Desktop\BrodaSoft\Visual Basic Proyectos\BACKUP's\VIDay\Version 7 Oficial\DataBase\" & Mess & "\" & Diaa & ".txt", System.Text.Encoding.Default, False)
  11.                While True
  12.                    linea = Lectura.ReadLine
  13.                    If linea = "" Then
  14.                        Exit While
  15.                    End If
  16.                    linea = linea.Replace("'", "-")
  17.                    linea = linea.Replace("\", "")
  18.                    linea = linea.Replace("""", "-")
  19.                    Consulta.CommandText = "INSERT INTO Efemerides (Fecha, Texto, Version) VALUES ('0000-" & Mess & "-" & Diaa & "', '" & linea & "', '1')"
  20.                    Consulta.ExecuteNonQuery()
  21.                End While
  22.                Lectura.Dispose()
  23.                Lectura.Close()
  24.            Next
  25.            MsgBox("Fin de mes")
  26.        Next
  27.        Consulta.Dispose()
  28.        conexión.Close()
  29.        MsgBox("Listo")
  30.    End Sub


Como veran, leo éste archivo:
C:\Users\Noel\Desktop\BrodaSoft\Visual Basic Proyectos\BACKUP's\VIDay\Version 7 Oficial\DataBase\0" & Mess & "\" & Diaa & ".txt"
Que segun los valores de los FOR, entraré al 1º dia del 1º mes:
C:\Users\Noel\Desktop\BrodaSoft\Visual Basic Proyectos\BACKUP's\VIDay\Version 7 Oficial\DataBase\1\1.txt"
E insertará la 1º linea de ese archivo.. y colocará en la fecha de ingreso: 0000-1-1
:)
Como hago para que ese 0000-1-1 pase a ser 0000-01-01 ??? porque aunque no lo crean, da error en el formato data al hacer el Select :O



Las carperas van del 01 al 012 (era así porque en su momento RIPWAY no me permitia nombre tan corto en carpeta :P)
Y los archivos, del 1 al 31

Cambiarle el nombre a las carpetas, es facil... le pongo del 01 al 12 si quiero.. pero que hago con los archivos???
Capaz tenga que jugar un poco con acumuladores.. y problema solucionado.. ya vere que ahgo..

con un simple Format() se soluciona...


Título: Re: Ayuda con indices en base de datos
Publicado por: Skeletron en 10 Noviembre 2009, 02:15 am
Utilizando el PARSE:
Date.Parse("0000-1-2"), NO funciona, pero con: Date.Parse("1111-1-2") ya funciona... es como que en el Parseado, no puede parsear un año=0000
Dato importante para la comunidad :P

Muy atareado con la facultad.. mucho estudio.. recien hoy me pongo con ésto..


Título: Re: Ayuda con indices en base de datos
Publicado por: Skeletron en 10 Noviembre 2009, 02:17 am
Valgame que pena que no se Visual Basic  :-(

Porque tu problemita lo analize, y lo resolvi pero en PERL  :-[

Código
  1.  
  2. for ( my $mes = 1; $mes <= 12; $mes++ ) {
  3.  for ( my $dia = 1; $dia <= 31; $dia++ ) {
  4.  
  5.        if ( $mes <= 9 && $dia <= 9 ) {
  6.  
  7.              print STDOUT "0000-" . '0' . $mes . "-" .   '0'   .   $dia . "\n";
  8.              next;
  9.        }
  10.            print STDOUT "0000-" . $mes . "-" . $dia . "\n";
  11. }
  12. };
  13.  
  14.  

Lo cual al ejecutar me imprime:

Citar
       
0000-09-01               
0000-09-02               
0000-09-03               
0000-09-04               
0000-09-05               
0000-09-06               
0000-09-07               
0000-09-08               
0000-09-09

Obviamente la condicion se cumple en mes y dia con un cero de primera, siempre y cuando tanto mes como dia sean igual o menor que 9  ;)  puedes hacerlo esto solo es una idea de que podrias hacer para tu problemita. Los puntitos que vez en los PRINT son 'concatenar'  si te sirve puedes analizarlo, echarle mas logica y hacer eso bucles for con condiciones si se cumple tal cosa concatename cero en dia y mes, sino se cumple quitamele el cero.


El problema de ésto, es que con el mes: 10, 11, y 12, pasará el valor: 011, 012... y no lo tomará como un DATE :/


Título: Re: Ayuda con indices en base de datos
Publicado por: ^Tifa^ en 10 Noviembre 2009, 13:44 pm
Pero corazon, solo tienes que Filtrar la condicion como tal.

Código
  1.  
  2. for ( my $mes = 1; $mes <= 12; $mes++ ) {
  3.  for ( my $dia = 1; $dia <= 31; $dia++ ) {
  4.  
  5.        if ( $mes <= 9  ) {
  6. if ( $dia <= 9 ) {
  7.              print STDOUT "0000-" . '0' . $mes . "-" . "0" .   $dia . "\n";
  8. } else {
  9.  print STDOUT "0000-" . '0' . $mes . "-" .   $dia . "\n";
  10.    }
  11.  
  12.        } else {
  13. if ( $dia <= 9 ) {
  14. print STDOUT "0000-" .  $mes . "-0" . $dia . "\n";
  15. } else {
  16. print STDOUT "0000-" . $mes . "-" . $dia . "\n";
  17.  
  18. }
  19. }
  20.  
  21. }
  22. };
  23.  
  24.  

Imprime esto:

Citar

0000-03-13
0000-03-14
0000-03-15
0000-03-16
0000-03-17
0000-03-18
0000-03-19
0000-03-20
0000-03-21
0000-03-22
0000-03-23
0000-03-24
0000-03-25
0000-03-26
0000-03-27
0000-03-28
0000-03-29
0000-03-30
0000-03-31
0000-04-01
0000-04-02
0000-04-03
0000-04-04
0000-04-05
0000-04-06

0000-12-01
0000-12-02
0000-12-03
0000-12-04
0000-12-05
0000-12-06
0000-12-07
0000-12-08
0000-12-09
0000-12-10
0000-12-11
0000-12-12
0000-12-13
0000-12-14
0000-12-15
0000-12-16
0000-12-17
0000-12-18
0000-12-19
0000-12-20
0000-12-21
0000-12-22
0000-12-23
0000-12-24
0000-12-25
0000-12-26
0000-12-27
0000-12-28
0000-12-29
0000-12-30
0000-12-31

PD: Tuve que cortar la impresion porque es muy larga, pero te aseguro que antes del mes 9 y dia 9 salen asi:

0000-09-09

Y si es superior al mes 9 y dia 9 sale

0000-10-10



Título: Re: Ayuda con indices en base de datos
Publicado por: Skeletron en 10 Noviembre 2009, 22:12 pm
Es verdad.. es verdad.. no queria hacer ningun IF, para no alentar el software.. nada mas.. Pero ya lo solucioné dandole un parse con año: 0001


Título: Re: Ayuda con indices en base de datos
Publicado por: ^Tifa^ en 11 Noviembre 2009, 14:24 pm
Me alegro mucho chiquito  :-*

La verdad desconozco el funcionamiento interno de SQL Server o SQLite? olvide cual es el motor que usas :-[ pero como es una DB relacional, asumo (aunque no aseguro) que todo lo aloja en su buffer cache en una porcion de la cache ram de memoria  :-*  si esto es asi, tranquilo con la lentitud del IF ya que la consulta al estar en cache de memoria solo varia los parametros que pases pero no la consulta como tal  ;)  (Al menos en Perl con el modulo DBI funciona asi) Ojala en tu situacion y tu lenguaje tambien. Debe existir sin embargo una manera de optimizar y mejorar sin duda alguna el ejemplo expuesto por mi (Soy debil en programacion puedo resolver una situacion pero reconozco que no de la forma mas optima) el codigo es un mero ejemplo, pero estoy segura que una vez interpretada la idea del codigo, podras mejorarla para tu aplicacion.