alberto-moyano   24-06-2024, 21:21
#1
Hola gente, mi consulta es la siguiente, tengo una tabla que es chica en términos de entradas (hoy ronda los 3500 registros y en un par de años con suerte si llega a los 20.000) pero es muy grande en cantidad de columnas (109), la cuestión es que la carga del gridview es muy lenta, no estoy usando el evento data, ya que tengo entendido que su mejora influye sustancialmente cuando se manejan grandes volúmenes de información, que no es mi caso, lo que tengo es una tabla con muchísimas columnas. ¿Mi creencia sobre el evento data es correcto?, o muchas columnas también debe ser tratado como gran volumen de información.

La tabla es única, no tiene claves foráneas, porque no las hay, sus datos son únicos y no llevan relación con ninguna otra tabla, ¿es aconsejable partirla (en varias tablas), aún en estos casos?

En el gridview solo necesito ver los datos de 7 columnas, tiene sentido usar una tabla con esas 7 columnas y otra tabla con las restantes columnas y relacionarlas con una clave foránea.

Que opinión tienen ustedes.

Gracias de antemano por cualquier comentario esclarecedor.

Este es el código que utilizo para cargar la vista, borre todas las lineas para no cansar con la lectura

Código:
Public Sub Mostrar_ListaBIB()

  Dim i As Integer

  VListaBIB.Clear()

  Contenido = Conn.Exec("select * from bibtex ORDER BY id DESC")

  'diseñamos el tableview
  VListaBIB.Columns.Count = 110
  VListaBIB.Header = True
  VListaBIB.Columns[0].Title = "ID"
  VListaBIB.Columns[0].Width = 60
  
' sigue hasta el 109

  VListaBIB.Columns[109].Title = ""
  VListaBIB.Columns[109].Width = 0

  'asigno la cantidad de filas según los datos que existan
  VListaBIB.Rows.Count = Contenido.Count

  'recorremos el resutado de la consulta para mostrarlo
  For i = 0 To Contenido.Count - 1
    VListaBIB[i, 0].Text = Contenido!id
    VListaBIB[i, 1].Text = Contenido!tipoEntrada
    VListaBIB[i, 2].Text = Contenido!citationKey
    VListaBIB[i, 3].Text = Contenido!keywords
   
' sigue hasta el 109

    VListaBIB[i, 109].Text = Contenido!type

    Contenido.MoveNext
  Next

End

Y el código para generar una nueva entrada, no tiene problemas

Código:
Public Sub BtnNuevoBib_Click()

  BtnNuevoBib.Visible = False
  BtnEliminarBib.Visible = False
  btnGuardar.Visible = True
  btnGuardarCambios.visible = False
  btnAgregarCitationKey.Enabled = True
  ToolPanel1.Index = 0

  txtTMPbiblio.Clear 'limpiamos el campo temporal
  txtTMPbiblio.SetFocus()
  LimpiarCamposBIB()
  ObtenerNuevoId()

End

Public Sub ObtenerNuevoId()

  Dim Idn As Integer
  Dim MaxId As Variant

  MaxId = Conn.Exec("SELECT MAX(id) FROM bibtex LIMIT 1")

  If MaxId["MAX(id)"] = Null Then
    Idn = 0
  Else
    Idn = CInt(MaxId["MAX(id)"]) + 1
  Endif

  txtID.Text = Idn
  txtCLAVEbib.Text = "@" & Idn & "-"
  txtKEYWORDS.Text = "," & BaseName & ","

End
Última modificación: 24-06-2024, 21:30 por alberto-moyano.
tincho   24-06-2024, 21:44
#2
(24-06-2024, 21:21)alberto-moyano escribió: no estoy usando el evento data

Pues deberias
(24-06-2024, 21:21)alberto-moyano escribió: ¿Mi creencia sobre el evento data es correcto?

No
(24-06-2024, 21:21)alberto-moyano escribió: Que opinión tienen ustedes.

Tendría que ver la tabla para dar un aopinin puntual, pero en lineas generales, si la tabla tiene columnas en las que van a repetirse datos muchas veces por ejemplo vas a tener una lista de libros y luego Borges va a aprecer 20 veces y Asimov 30 entonces tenes que usar una tabla secundaria con autores y así sucesivemente con todos los campos que sigan la misma filosofia.

1 Saludo.
alberto-moyano   24-06-2024, 22:19
#3
Tincho, gracias por tu respuesta, voy a modificar el código para migrar al evento data. Sobre usar una tabla para autores lo veo muy complicado, ya que BibLaTeX (a través de su parseador, biber) tiene su propia lógica de conectores, por ejemplo la palabra and se convierte a «y», «e», «&» o «et al.» según corresponda al estándar de referenciación de salida elegido y esto me llevaría a tener que construir una función que refleje la suma de autores, además hay una categoría para los autores que no son públicos (others)

Pablo Pozzi and Alejandro Falco --> puedo obtener: Pozzi, Pablo y Alejandro Falco; Pozzi, P. y A. Falco; Pozzi, P. & A. Falco (fijate que el parseador hace el enroque de nombre/apellido para el primer autor)

Si necesito que la palabra and se refleje tal cual, va entre llaves (Pablo Pozzi {and} Alejandro Falco)

otro caso es

Pablo Pozzi and others --> voy a obtener: Pozzi, Pablo et al. o Pozzi, Pablo y otros (según que estándar)

y la cosa se complica aún más cuando hay más de 3 autores.

Voy a hacer algunas pruebas separando la tabla en 2, una que lleve los datos que deseo mostrar en el gridview y otra con los restantes a ver si con eso mejoro la velocidad, al margen de migrar al evento data.

El idioma y las editoriales y su lugar de origen si me parecen aplicables a la lógica de tu comentario, voy a trabajar también en eso.

Gracias nuevamente
Última modificación: 24-06-2024, 22:21 por alberto-moyano.
tincho   25-06-2024, 18:26
#4
(24-06-2024, 22:19)alberto-moyano escribió: El idioma y las editoriales y su lugar de origen si me parecen aplicables a la lógica de tu comentario, voy a trabajar también en eso.
Si es verdad que un libro puede tener varios autores, no tomes el comentario al pie de la letra, solo la idea.
Si la tabla tiene mas 100 campos seguramente se pueda resumir, te dejo un ejemplo del diseño que hice, y no termine, para hacer un formulario para editar bibliografía la otra vez.
Otro trucos pasan por usar la palabra reservada SQL Limit [1] o usar algún filtro con Where o Like  puesto que no tiene ningún sentido enviarle 5000 registros al gridview cuando este podrá mostrarte unos 25 por vez.

[1] https://www.sqltutorial.org/sql-limit/

Código:
CREATE TABLE "authors" (
    "idx"    INTEGER,
    "name"    TEXT UNIQUE,
    "show"    TEXT,
    "code"    TEXT,
    "input"    TEXT,
    PRIMARY KEY("idx" AUTOINCREMENT)
);
CREATE TABLE "books" (
    "idx"    INTEGER,
    "name"    TEXT UNIQUE,
    "title"    TEXT,
    "author"    INTEGER,
    "date1"    TEXT,
    "subject"    INTEGER,
    "desc"    TEXT,
    "series"    TEXT,
    "seridx"    INTEGER,
    "lang"    INTEGER,
    "pub"    INTEGER,
    "crc"    TEXT,
    "file1"    TEXT,
    "file2"    TEXT,
    FOREIGN KEY("lang") REFERENCES "languages"("idx"),
    FOREIGN KEY("pub") REFERENCES "publishers"("idx"),
    FOREIGN KEY("subject") REFERENCES "subjects"("idx"),
    FOREIGN KEY("author") REFERENCES "authors"("idx"),
    PRIMARY KEY("idx" AUTOINCREMENT)
);
CREATE TABLE "publishers" (
    "idx"    INTEGER,
    "name"    TEXT UNIQUE,
    PRIMARY KEY("idx" AUTOINCREMENT)
);
CREATE TABLE "languages" (
    "idx"    INTEGER,
    "name"    TEXT UNIQUE,
    "desc"    TEXT,
    PRIMARY KEY("idx" AUTOINCREMENT)
);
CREATE TABLE "subjects" (
    "idx"    INTEGER,
    "name"    TEXT UNIQUE,
    "desc"    TEXT,
    PRIMARY KEY("idx" AUTOINCREMENT)
);
CREATE TABLE "equivalents" (
    "idx"    INTEGER,
    "name"    TEXT UNIQUE,
    "author"    INTEGER,
    FOREIGN KEY("author") REFERENCES "authors"("idx"),
    PRIMARY KEY("idx" AUTOINCREMENT)
);

1 Saludo.
  
Usuarios navegando en este tema: 3 invitado(s)
Powered By MyBB, © 2002-2024 MyBB Group.
Made with by Curves UI.