Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    Query Select join tra 2 tabelle di circa 4000 elementi LENTA

    Innanzi tutto un saluto al forum.

    Riassumo il mio problema, ho da fare un confronto tra due tabelle per ricavare i valori delle tuple che sono state modificate o aggiunte nella tabella pass rispetto alla tabella web ... il problema è che sono tabelle di circa 400 record l'una e la query mi impiega circa 20 secondi ... qualche consiglio?

    Grazie a tutti, a seguire la query:

    SELECT pass.*, web.id AS webid FROM con_annuario_passaggio_indirizzi AS pass
    LEFT JOIN
    con_annuario_web_indirizzi AS web ON pass.id_count = web.id_count
    WHERE
    (pass.id_socio != web.id_socio OR
    pass.cod_tipo_ind != web.cod_tipo_ind OR
    pass.nome_pubblico != web.nome_pubblico OR
    pass.presso != web.presso OR
    pass.ca != web.ca OR
    pass.indirizzo != web.indirizzo OR
    pass.cap != web.cap OR
    pass.localit != web.localit OR
    pass.pr != web.pr OR
    pass.nazione != web.nazione OR
    pass.telefono != web.telefono OR
    pass.fax != web.fax OR
    pass.orario != web.orario OR
    pass.e_mail != web.e_mail OR
    pass.descrizione != web.descrizione)
    OR web.id IS NULL

  2. #2
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    1,469
    bhè è una query francamente assai diciamo così "delirante".
    Dovresti operare in senso inverso,ovvero trovare tutte le righe uguali e per complemento quelle diverse.
    ---
    Ad ogni modo io aggiungere più semplicemente un campo CRC (o SHA) alla tabella dove calcoli la "firma" dei campi (concatenandoli).
    Diventa quindi immediato trovare le righe modificate.

    Altra alternativa è un flag "sporco" (intero) che attivi da trigger, in pratica dopo un UPDATE lo fai settare a 1.
    Dopo la "sincronizzazione" li posti tutti a zero

  3. #3
    Ciao e grazie per la risposta.

    Per curiosità ti dico che la soluzione che ho adottato è quelle tramite il flag, ma non attivato da trigger ma da chi scrive su quella tabella ... tramite odbc ... non voglio dilungarmi oltre ma questo database io l'ho per così dire ... ereditato e non sapevo se i proprietari erano disposti a mettere un nuovo campo.
    Quindi ogni volta che mi modificano un record impostano anche il flag a modificato su quel record ... dopo la sincronizzazione mi resetto il flag a tutte.

    Quello che invece sono a chiederti è cosa intendi per "Dovresti operare in senso inverso,ovvero trovare tutte le righe uguali e per complemento quelle diverse."
    Soprattutto cosa intendi per completamento? Cortesemente mi potresti fare un esempio anche semplice?

    Grazie e saluti

    Originariamente inviato da franzauker
    bhè è una query francamente assai diciamo così "delirante".
    Dovresti operare in senso inverso,ovvero trovare tutte le righe uguali e per complemento quelle diverse.
    ---
    Ad ogni modo io aggiungere più semplicemente un campo CRC (o SHA) alla tabella dove calcoli la "firma" dei campi (concatenandoli).
    Diventa quindi immediato trovare le righe modificate.

    Altra alternativa è un flag "sporco" (intero) che attivi da trigger, in pratica dopo un UPDATE lo fai settare a 1.
    Dopo la "sincronizzazione" li posti tutti a zero

  4. #4
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    1,469
    il flag è una soluzione dipendente dallo stato, l'hash no (è stateless) e quindi, in generale, è preferibile la seconda per universalità.
    ---
    detto questo se vuoi cercare le righe DIVERSE puoi anche cercare
    tutte\righe uguali, sostanzialmente una trasformazione di De Morgan (o un semplice "differenza tra patatoni volevo dire insiemi").

    Utilizzando un indice coprente (che nel tuo caso è ridicolo, visto che è praticamente l'intera tabella, ma è piccola, quindi ci potrebbe stare) puoi fare un join per individuare le righe UGUALI, prendendone ad esempio la chiave primaria espansa con un GROUP_CONCAT

    A quel punto fai una select ... where chiave NOT IN (elenco_chiavi_uguali), ottenendo quindi quelle diverse

    come potrai osservare non ti suggerisco di fare una singola subquery dipendete giacchè lenta per mysql [la soluzione sarebbe... togliere mysql per qualcosa di meno scemo].
    ---
    Le righe "nuove" le trovi con un join "semplice" sulle relative chiavi delle due tabelle.

  5. #5
    Grazie!



    Originariamente inviato da franzauker
    il flag è una soluzione dipendente dallo stato, l'hash no (è stateless) e quindi, in generale, è preferibile la seconda per universalità.
    ---
    detto questo se vuoi cercare le righe DIVERSE puoi anche cercare
    tutte\righe uguali, sostanzialmente una trasformazione di De Morgan (o un semplice "differenza tra patatoni volevo dire insiemi").

    Utilizzando un indice coprente (che nel tuo caso è ridicolo, visto che è praticamente l'intera tabella, ma è piccola, quindi ci potrebbe stare) puoi fare un join per individuare le righe UGUALI, prendendone ad esempio la chiave primaria espansa con un GROUP_CONCAT

    A quel punto fai una select ... where chiave NOT IN (elenco_chiavi_uguali), ottenendo quindi quelle diverse

    come potrai osservare non ti suggerisco di fare una singola subquery dipendete giacchè lenta per mysql [la soluzione sarebbe... togliere mysql per qualcosa di meno scemo].
    ---
    Le righe "nuove" le trovi con un join "semplice" sulle relative chiavi delle due tabelle.

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 © 2025 vBulletin Solutions, Inc. All rights reserved.