Pagina 1 di 4 1 2 3 ... ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 37
  1. #1

    Aiuto lentezza nella query con 10.000 record

    Ciao a tutti,

    ho una tabella (DOMANDE) con più di 10.000 record.

    Nella mia home page dovrei visualizzare le domande più aggiornate.
    In un campo DataAggiornamento metto la data.

    La query è la seguente:
    Codice PHP:
    SELECT FROM Domanda  ORDER BY DataAggiornamento DESC 
    ho la necessità di visualizzare 10 domande per volta.
    La soluzione che ho preso è stata la seguente.

    In un ArrayList prendo il numero di record che mi restituisce la query (quindi tutti e 10.000), poi con un cilco for stampo l'array da 1 a 10 e con un link porto la pagina a stampare i record da 10 a 20 e cosi via.

    In teoria, con una ventina di record funziona alla grande, ma appena ho messo 10.000 record la pagina non si carica neanche.

    Come potrei fare per visualizzare solo 10 record per volta dalla query sopra riportata.

    Avviso che uso il database Access e non posso usarne altri.

    Grazie in anticipo, spero che potete aiutarmi
    Response.Write("Tonyhhkx Programmer32");

  2. #2
    Utente di HTML.it
    Registrato dal
    Dec 2010
    Messaggi
    268
    ci sono colonne indicizzate? questo aiuta parecchio a risolvere problemi di lentezza.
    Un altro trucco è quello di dividere la tabella in 2 / 3 tabelle, così dovresti riuscire ad avere delle query più veloci

  3. #3
    Fammi capire, tu estrai tutti i record e poi li filtri con php?
    Ciao!

  4. #4
    Originariamente inviato da X-mac
    ci sono colonne indicizzate? questo aiuta parecchio a risolvere problemi di lentezza.
    Un altro trucco è quello di dividere la tabella in 2 / 3 tabelle, così dovresti riuscire ad avere delle query più veloci
    solamente il campo chiave è indicizzato.
    Non mi sembra un bel modo creare 2-3 tabelle. Non saprei dove prendere i dati poi.

    Comunque, non è possibile estrarre solo n record da una query?
    Con l'istruzione

    SELECT TOP 10 * FROM DOMANDA

    mi estrae solo i primi 10, ma io avrei bisogno di estrarre solo i primi 10 ordinati per ultimo aggiornamento. Se faccio

    SELECT TOP 10 * FROM DOMANDA ORDER BY DataAggiornamento DESC

    mi da errore.

    Comunque, oltre a questo fatto credo che c'è un altro fattore che mi rallenta.

    Quando estraggo i 10.000 record non estrae solo i 10.000 record di quella tabella.
    QUando estrae un record, cerca anche il record con ID=X della tabella RISPOSTA, quindi per ogni 10.000 query esegue un altra query via codice.

    Ho la tabella DOMANDA con

    IdDomanda, IdRisposta,...

    e la tabella RISPOSTA con

    IdRisposta,....

    forse dovrei risolvere questo problema creando una vista e fare la select su quella vista ma non ci sono riuscito a crearla via codice asp.net con c#
    Response.Write("Tonyhhkx Programmer32");

  5. #5
    SELECT * FROM DOMANDA LIMIT 10

    SELECT * FROM DOMANDA LIMIT 10, 10

    SELECT * FROM DOMANDA LIMIT 20, 10

    ecc...
    Ciao!

  6. #6
    Originariamente inviato da fmortara
    SELECT * FROM DOMANDA LIMIT 10

    SELECT * FROM DOMANDA LIMIT 10, 10

    SELECT * FROM DOMANDA LIMIT 20, 10

    ecc...
    non funziona con database access quell'istruzione
    Response.Write("Tonyhhkx Programmer32");

  7. #7
    Utente di HTML.it
    Registrato dal
    Dec 2010
    Messaggi
    268
    se ti servono SOLO 10 record o 1000 o quelli che vuoi

    select * from tabella limit 10
    così ti estrae i primi 10 record, se ti servono 10 record in particolare puoi utilizzare un filtro, ad esempio vuoi i 10 record più recenti

    select * from tabella where data > '2011-10-01' and data <'2011-10-31' limit 10

    però se te mi dici che ti vengono fuori anche altri dati vuol dire che la tua query estrae i data in join, ossia sarà qualcosa del genere:

    select * from tabella1 join tabella2 on tabella1.idx=tabella2.idx

    il problema di base è la quantità di dati che cominciano ad essere tanti e il db fa fatica.

    Distribuire i dati in più tabelle serve proprio a migliorare le performance del db.

  8. #8
    Originariamente inviato da X-mac
    se ti servono SOLO 10 record o 1000 o quelli che vuoi

    select * from tabella limit 10
    così ti estrae i primi 10 record, se ti servono 10 record in particolare puoi utilizzare un filtro, ad esempio vuoi i 10 record più recenti

    select * from tabella where data > '2011-10-01' and data <'2011-10-31' limit 10

    però se te mi dici che ti vengono fuori anche altri dati vuol dire che la tua query estrae i data in join, ossia sarà qualcosa del genere:

    select * from tabella1 join tabella2 on tabella1.idx=tabella2.idx

    il problema di base è la quantità di dati che cominciano ad essere tanti e il db fa fatica.

    Distribuire i dati in più tabelle serve proprio a migliorare le performance del db.
    certo, ma ripeto che l'istruzione

    SELECT * FROM TABELLA LIMIT 10

    mi da errore istruzione errata!
    Questo perchè acces non mi permette l'istruzione LIMIT.

    Quella che funziona invece è quella con TOP, solo che per qualche BUG di accces, se faccio

    SELECT TOP 10 * FROM TABELLA

    mi estrae i primi 10, se invece faccio

    SELECT TOP 10 * FROM TABELLA ORDER BY DATA DESC

    mi estrae TUTTI i record!!!

    E' un bug secondo me oppure c'è qualcosa che non và
    Response.Write("Tonyhhkx Programmer32");

  9. #9
    allora per ora sto risolvendo cosi:

    SELECT * FROM Domanda INNER JOIN Utente ON Domanda.IdUtente = Utente.IdUtente ORDER BY Domanda.DataAggiornamento DESC

    dove ho già belli e pronti tutti i dati da prendere e non sembra andare lento, ma resta il fatto che sto selezionando 10.000 record mentre a me me ne servono solo 10
    Response.Write("Tonyhhkx Programmer32");

  10. #10
    provando con circa 200.000 record ho un attesa di 5 secondi.
    Sembrerà poca ma è molto essendo che qui sto con un pc super overcloccato ed un SDD da 500 mega al secondo di lettura e scrittura, quindi una volta messo su un server mediocre farà pena!!

    Se solo riuscirei a estrarre solo 10 record... maledetto access
    Response.Write("Tonyhhkx Programmer32");

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.