Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 15

Discussione: Query molto lenta

  1. #1

    Query molto lenta

    Buongiorno,
    ho una quesry di SQL Server su una tabella con circa 180.000 record,
    codice:
    Select * from MKTPart Where KeyCorso = 'AB1234566' and Data conferma <> '' order by KeyCorso
    La prima volta che la eseguo dopo che sql è stato avviato impiega circa 10 minuti.
    Dopo la prima volta è immediata e continua così fino al prossimo riavvio di SQL.

    Grazie
    Saluti

    Marzio
    Marzio

  2. #2
    c'è un indice su KeyCorso ?
    ARTRIPE

  3. #3
    Salve,
    forse da ignorante quale sono puo' essere una baggianata, ma provo a darti uno spunto:

    select * from
    (Select * from MKTPart Where KeyCorso = 'AB1234566' and Data conferma <> '')
    order by KeyCorso

    nel senso che: prima filtra e poi ordina

  4. #4
    Amministratore L'avatar di Vincent.Zeno
    Registrato dal
    May 2003
    residenza
    Emilia-Romagna (tortellini und cappelletti land!)
    Messaggi
    20,362
    il secondo esempio ha una inutile ridondanza, è meglio il primo esempio.

    comunque non hai risposto a quello che ti è stato chiesto:
    c'è un indice su KeyCorso ?
    nel caso non ci sia crealo.
    normalmente, in caso di molti record presenti, la sua assenza è causa di rallentamento.

  5. #5
    Utente di HTML.it L'avatar di Joe Taras
    Registrato dal
    Nov 2003
    residenza
    Taranto
    Messaggi
    918
    Quote Originariamente inviata da marziomorandi Visualizza il messaggio
    Buongiorno,
    ho una quesry di SQL Server su una tabella con circa 180.000 record,
    codice:
    Select * from MKTPart Where KeyCorso = 'AB1234566' and Data conferma <> '' order by KeyCorso
    La prima volta che la eseguo dopo che sql è stato avviato impiega circa 10 minuti.
    Dopo la prima volta è immediata e continua così fino al prossimo riavvio di SQL.

    Grazie
    Saluti

    Marzio
    Aggiungo, agli utili consigli già forniti, di verificare il tipo di dato del campo data_conferma. Da come scrivi tu è un varchar. Se è un date o datetime potresti fare una valutazione su IS NOT NULL

  6. #6
    Utente di HTML.it L'avatar di Kahm
    Registrato dal
    Dec 2004
    residenza
    Rome
    Messaggi
    3,518
    Quote Originariamente inviata da liberdino Visualizza il messaggio
    Salve,
    forse da ignorante quale sono puo' essere una baggianata, ma provo a darti uno spunto:

    select * from
    (Select * from MKTPart Where KeyCorso = 'AB1234566' and Data conferma <> '')
    order by KeyCorso

    nel senso che: prima filtra e poi ordina
    io modificherei data conferma in DataConferma (tuttoAttaccato
    altrimenti al query la farei: and [Data conferma] <> ''
    NN vi diro mai chi sono in realta,
    tutti i miei 3D sono orfani, non insistete per farmi rispondere ai 3D aperti da me

  7. #7
    Utente di HTML.it L'avatar di Joe Taras
    Registrato dal
    Nov 2003
    residenza
    Taranto
    Messaggi
    918
    Si, ma questa modifica, impatta su eventuali errori sintattici, non sulla lentezza della stessa

  8. #8
    Quote Originariamente inviata da marziomorandi Visualizza il messaggio
    Buongiorno,
    ho una quesry di SQL Server su una tabella con circa 180.000 record,
    codice:
    Select * from MKTPart Where KeyCorso = 'AB1234566' and Data conferma <> '' order by KeyCorso
    La prima volta che la eseguo dopo che sql è stato avviato impiega circa 10 minuti.
    Dopo la prima volta è immediata e continua così fino al prossimo riavvio di SQL.

    Grazie
    Saluti

    Marzio
    Se la prima volta ci mette 10 minuti è perchè deve fare una full scan, quindi non è indicizzata...
    Intanto, per leggibilità e per evitare errori, racchiuderei i campi e le tabelle nei classici apici, quindi la query diventa

    codice:
    SELECT * FROM `MKTPart` WHERE `KeyCorso` = 'AB1234566' AND `Data conferma` <> '' ORDER BY `KeyCorso`
    In seconda battuta, modifica il nome del campo "Data conferma" e usa qualcosa tipo "Data_Conferma" (niente spazi nei nomi, ti eviti un sacco di problemi)

    Ultimo....quanto è importante questa query? Nel senso...la usi spesso per ogni utente/ricerca? Immagino di sì, quindi:

    L'ideale, a occhio, è creare una chiave sui due campi "KeyCorso" e "Data_Conferma" (una chiave con due campi, non una chiave per ogni campo).
    Questo però ha senso SE il formato della Data_Conferma è un TimeStamp oppure un int(10) e ci salvi dentro un TimeStamp oppure la rappresentazione unixhepoc della data.
    A questo punto, essendo fondamentalmente un numero, l'indice lavora molto meglio che una stringa. Fatto questo, cambi la query da <> '' a > 0
    Ancora meglio sarebbe valorizzare sempre la Data_Conferma, impostando che può essere null e vale 0 come predefinito, così non dovresti avere problemi con le query di inserimento


  9. #9
    non metterei "0" come predefinito in una data; se è vuota, meglio lasciarla NULL
    ARTRIPE

  10. #10
    Quote Originariamente inviata da optime Visualizza il messaggio
    non metterei "0" come predefinito in una data; se è vuota, meglio lasciarla NULL
    Sì anche, dipende sempre da quanto è "complesso" adattare il codice dietro (php, asp, python, non cambia molto) per trattare NULL rispetto a 0 (zero), ma, almeno secondo la mia modesta esperienza, soprattutto dovendo usare il campo come indice, è preferibile usare un valore "congruo" rispetto al campo, quindi se è un int meglio usare "zero", se è una stringa meglio usare "" (vuoto), "0000-00-00 00:00:00" se è un DateTime, current_timestamp() se è TimeStamp ecc ecc.
    Ripeto, secondo me

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