Oppure

Loading
30/01/15 16:15
darioza
Ciao a tutti!
quest'oggi la mia domanda è di prestazione...
per realizzare un autocomplete in ambiente web (asp.net c#) se non volessimo appesantire troppo il database e far aspettare troppo l'utente, avendo come limite strutturale la mole di dati che teoricamente potremmo andare a trovare, come si può fare?
ok, limitare l'estrazione, ma come quantitativo di richieste e mole di dati estratti...che si fa?
in piu, se digito "D" potrei memorizzare in memoria tutti i dati, oppure aspettare alla seconda lettera "DA"..
ma non posso prevedere a priori la mole dati, e ho dubbi su come potrebbe reagire il server sql...e la pagina, in termini di rallentamento all'utente...
chi mi tranquillizza?8-|
(O mi fa perdere il sonno?)
aaa
31/01/15 2:01
pierotofy
Solitamente si può fare così:

- Quando l'utente comincia a scrivere sulla casella di ricerca, fai partire un timer (con un timeout di circa 500 millisecondi)
- Se l'utente continua a battere, il timer riparte da 500 millisecondi (si resetta)
- Allo scadere del timer, se c'è del testo nella casella, fai una ricerca usando "VALORE%" (dove valore è il contenuto della casella di ricerca). Nota che il % è alla fine. Assicurati di aver creato un indice per il campo che stai usando per la ricerca (così il database può ottimizzare la query).

Questo ovviamente ha delle limitazioni (se l'utente digita "ciao" è c'è un campo chiamato "we ciao we", questo non verrà ritornato nell'auto completamento, mentre "ciao we", si). Ma è semplice da implementare.
Il mio blog: piero.dev
31/01/15 10:23
darioza
Grazie mille!
Quindi diciamo che limitando la ricerca all'origine.sulla query e affidandomi ad un timer piuttosto che al numero di caratteri dovrei risolvere.
Tutte le mie remore sono dovute al fatto che la ricerca è molto varia e complessa, a livello d'accessibilità potrebbe essere il caso di mettere un menù da cui delimitare la ricerca?
...quindi avere un campo in cui l'utente mi indica se sta cercando una persona, una via, ecc...ecc ?
Alla fine sarebbero 3-4 opzioni
È piu l'aiuto eventualmente offerto da questa scelta oppure non mi conviene?
l'ho individuata come un punto critico, quindi la ricerca è ancora in analisi, su carta ma non su codice
suggerire, alla digitazione di "Dario": "via Dario Dario", "Dario cantante", "Dario scrittore", ecc...ecc... In tempi ottimali, alla Google diciamo (non come loro ovviamente, non esiste il confronto) è quindi sconsigliabile a priori come strada da intraprendere?
aaa
01/02/15 19:26
Roby94
Permettimi di dire che le prestazioni dell'approccio di ricerca sono molto legate alla struttura del DB, quindi la scelta di aggiungere una varibile di ricerca potrebbe rallentare la query o velocizzarla.
Es Il paramento in più mi permette di delimitare la ricerca a una cerchia ristretta di tabelle, allora sicuramente la ricerca sarà più performante.
Il parametro in più rende la ricerca più selettiva, all'ora probabilmente la query richiederà piu tempo per le verifiche sul singolo record rendendo il tutto piu lento.

Queste sono considerazioni molto grossolane non sapendo ne la struttura del tuo DB ne l'implementazione del tuo DB.
aaa
01/02/15 19:55
darioza
Sono 3-4 tabelle separate, perché la ricerca è "generica" quindi potrei cercare "Dario" o "tavolo" o "Garibaldi" nello stesso campo, e devo suggerire, per esempio, su "Garibaldi":"via Garibaldi", "Garibaldi", "piazza Garibaldi"
...ecco perché ci sto ragionando su...
aaa
01/02/15 20:01
Roby94
Ok, ma se vuoi un aiuto devi darci qualche informazione in piu, struttura delle tabelle, DB e campi di ricerca, se invece vuoi provare da solo, buonafortuna non è un lavoro impossibile ;)
aaa
01/02/15 22:05
darioza
Non è tanto"come fare" ma "come fare affinché non vi siano rallentamenti"...
Ho strade, oggetti, nomi di persona e luoghi distribuiti in tabelle diverse su mssql...
Poi le vie sezionate all'interno della tabella (ma penso sia ininfluente, sono dati giàarchiviati, la modifica è sconsigliabile per la mole)
la cosa che penso sia difficile, ma che sinceramente ignoro è il risultato...
Se vado su Google, per esempio, qualsiasi cosa digito...ho praticamente subito un suggerimento o piu di uno...
Vorrei lo stesso risultato o comunque non un cattivo risultato...
aaa
01/02/15 22:17
Roby94
Quello che tu cerchi sta tutto nella scrittura delle query, blocchi non possono esserci, al massimo parte una richiesta a Mysql e questo non fa in tempo a rispondere che gia ne è partita un altra richiesta, qui puoi applicare uno smorzamento come ti ha suggerito Piero, che ti porta ad evitare delle query inutili, ma quando hai bisogno di fare la richiesta al DB la query deve essere impostata a dovere, per garantirti il massimo delle prestazioni.
Per questo ti chiedo la struttura precisa del DB, se no aiutarti a generare queste query risulta impossibile, capisci?
aaa