Ver Mensaje Individual
  #7 (permalink)  
Antiguo 06/08/2014, 01:13
israel965
 
Fecha de Ingreso: mayo-2012
Mensajes: 49
Antigüedad: 12 años, 10 meses
Puntos: 2
Respuesta: Problema select tabla 45.000 registros

Hola de nuevo,

El tema de la normalización es complejo con esta base de datos, aunque estoy completamente de acuerdo, (El hecho de que los datos provengan de una única tabla de Access, no es óbice para no normalizar).

El problema es que aunque suene extraño, no tenemos campos que sean not null en nuestra tabla, todos tienen algún valor que no nos provee datos.

Aún así podríamos mejorar su estructura y sacar campos que se repiten como localizaciones(comarcas, territorios etc).

La base de datos access es administrada por n personas y cada una lo hace a su criterio, para nosotros es incluso complicada su importación por muchos motivos.

Nosotros creamos la siguiente vista que hace una union all contra otra tabla

Código MySQL:
Ver original
  1. CREATE VIEW `vwtac` AS select
  2. `totact`.`tipus` AS `id_tipus`,
  3. `totact`.`id_unic` AS `id`,
  4. `totact`.`DIA` AS `data_inici`,
  5. `totact`.`DIA` AS `data_fi`,
  6. `totact`.`id_poblacio` AS `id_poblacio`,
  7. `totact`.`id_comarca` AS `id_comarca`,
  8. `totact`.`id_territori` AS `id_territori`,
  9. `totact`.`poblacio` AS `poblacio`,
  10. `totact`.`Comarca` AS `comarca`,
  11. `totact`.`territori` AS `territori`,
  12. `totact`.`municipi` AS `municipi`,
  13. `totact`.`cbla1` AS `cbl1`,
  14. `totact`.`cbla2` AS `cbl2`,
  15. `totact`.`cbla3` AS `cbl3`,
  16. `totact`.`cbla4` AS `cbl4`,
  17. `totact`.`cbla5` AS `cbl5`,
  18. `totact`.`cbla6` AS `cbl6`,
  19. `totact`.`cbla7` AS `cbl7`,
  20. 0 AS `id_indret`,
  21. `totact`.`latitud` AS `lat`,
  22. `totact`.`longitud` AS `lng`,
  23. 0 AS `idind`,
  24. `totact`.`latitudmaltemps` AS `lat_mal_temps`,
  25. `totact`.`longitudmaltemps` AS `lng_mal_temps`,
  26. `totact`.`latitudPoblacio` AS `latitudPoblacio`,
  27. `totact`.`longitudPoblacio` AS `longitudPoblacio`,
  28. `totact`.`LinkPrograma` AS `link_programa`,
  29. `totact`.`fkf` AS `programa`,
  30. `totact`.`HMATI` AS `hora1`,
  31. `totact`.`HTARDA` AS `hora2`,
  32. `totact`.`HNIT` AS `hora3`,
  33. '' AS `hora4`,
  34. `totact`.`descripcio` AS `desctipus`,
  35. `totact`.`lloc` AS `lloc`,
  36. `totact`.`llocre` AS `llocre`,
  37. `totact`.`sipl` AS `sipl`,
  38. `totact`.`splre` AS `splre`,
  39. `totact`.`idcl1` AS `idcl1` from `totac` `totact`
  40.  
  41.  
  42. 999 AS `id_tipus`,
  43. `tblcu`.`id` AS `id`,
  44. `tblcu`.`data_inici` AS `data_inici`,
  45. `tblcu`.`data_acabament` AS `data_fi`,
  46. `tblpob`.`id` AS `id_poblacio`,
  47. `tblcom`.`id` AS `id_comarca`,
  48. `tblter`.`id` AS `id_territori`,
  49. `tblpob`.`poblacio` AS `poblacio`,
  50. `tblcom`.`comarca` AS `comarca`,
  51. `tblter`.`territori` AS `territori`,
  52. '' AS `municipi`,
  53. '' AS `cbl1`,
  54. '' AS `cbl2`,
  55. '' AS `cbl3`,
  56. '' AS `cbl4`,
  57. '' AS `cbl5`,
  58. '' AS `cbl6`,
  59. '' AS `cbl7`,
  60. 0 AS `id_indret`,
  61. NULL AS `lat`,
  62. NULL AS `lng`,
  63. NULL AS `idind`,
  64. NULL AS `lat_mal_temps`,
  65. NULL AS `lng_mal_temps`,
  66. NULL AS `latitudPoblacio`,
  67. NULL AS `longitudPoblacio`,
  68. NULL AS `link_programa`,
  69. 0 AS `programa`,
  70. `tblcu`.`hini1` AS `hora1`,
  71. `tblcu`.`hfi1` AS `hora2`,
  72. `tblcu`.`hini2` AS `hora3`,
  73. `tblcu`.`hfi2` AS `hora4`,
  74. '' AS `desctipus`,
  75. '' AS `lloc`,
  76. '' AS `llocre`,
  77. '' AS `sipl`,
  78. '' AS `splre`,
  79. '' AS `idcl1`
  80. from (((`tblcu`
  81. join `tblpob` on((`tblcu`.`id_poblacio` = `tblpob`.`id`)))
  82. join `tblcom` on((`tblpob`.`id_comarca` = `tblcom`.`id`)))
  83. join `tblter` on((`tblcom`.`id_territori` = `tblter`.`id`)));

Una vez hecha la vista, como la aplicación soporta varios idiomas tenemos tablas de traducción contra la que hacemos su respectiva join, si esto no es suficiente, tenemos un buscador que genera consultas de este tipo:

Código MySQL:
Ver original
  1. (programa != 0 OR link_programa IS NOT NULL) AND data_inici BETWEEN '2010-08-06' AND '2015-08-31' AND id_tipus IN(1,5,4) AND vw.id_comarca IN(38,60) AND vw.id_territori IN(9,3,7) AND vw.id_poblacio IN(1037,1020) AND idcl1IN(225,145,224,300,192,335)

Finalmente con todo eso generamos una consulta que realiza una paginación mostrando 20, 30, 50 o 100 resultados a demanda del usuario.

Sí tenemos índices, son sobre los que hacemos las búsquedas, aunque no los hemos añadido, de todos modos, como puedes ver, hacemos búsquedas sobre campos de tipo entero y fechas.

Gracias por vuestra ayuda.
__________________
Puedes visitarme en uno-de-piera