Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it L'avatar di Gabbro
    Registrato dal
    Nov 2000
    Messaggi
    828

    [mysql] l'ordine delle where è importante?

    Una curiosità: ma l'ordine delle where è importante?
    ovvero se io faccio


    select * from tabella where campo=2 and data='2006-08-31'

    è uguale a

    select * from tabella where data='2006-08-31' and campo=2

    ?

    non è possibile sottolineare il fatto che io voglio prima che sia verificata la prima condizione (in quanto ci sono meno records) e poi la seconda in modo che la select sia + veloce?

  2. #2
    l'operatore logico AND viene valutato da SX verso DX.

    Quindi se a SX ci sono meno combinazioni TRUE rispetto alle combinazioni presenti a DX quelle combinazioni TRUE di DX corrispondenti ad un FALSE di SX non vengono manco viste.

    In pratica per valutare un campo come richiesto nel where si deve estrarre comunque tutta la tupla. Se i campi sono entrambi TRUE la tupla viene "salvata" solitamente in una tabella temporanea di lavoro, ma non e' detto sia "sempre" cosi'.

    Morale: se i campi di SX che rispondono a TRUE sono numericamente minori dei campi di DX che rispondono a TRUE, sicuramente verranno estratte meno tuple da valutare. Anche se poi sara' difficile apprezzare la cosa, perche' per esempio un numerico e' piu' veloce di una data nella valutazione del campo.

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  3. #3
    Utente di HTML.it L'avatar di Gabbro
    Registrato dal
    Nov 2000
    Messaggi
    828
    Originariamente inviato da piero.mac
    l'operatore logico AND viene valutato da SX verso DX.

    Quindi se a SX ci sono meno combinazioni TRUE rispetto alle combinazioni presenti a DX quelle combinazioni TRUE di DX corrispondenti ad un FALSE di SX non vengono manco viste.

    In pratica per valutare un campo come richiesto nel where si deve estrarre comunque tutta la tupla. Se i campi sono entrambi TRUE la tupla viene "salvata" solitamente in una tabella temporanea di lavoro, ma non e' detto sia "sempre" cosi'.

    Morale: se i campi di SX che rispondono a TRUE sono numericamente minori dei campi di DX che rispondono a TRUE, sicuramente verranno estratte meno tuple da valutare. Anche se poi sara' difficile apprezzare la cosa, perche' per esempio un numerico e' piu' veloce di una data nella valutazione del campo.
    ciao piero grazie per la spiegazione.
    e questa cosa vale solo per mysql o anche per oracle?
    inoltre naturalmente ora ho pensato di trasformare il campo date in timestamp in modo da ottenere una query + veloce. Una volta creato un nuovo campo nella tabella mi ricordo che c'era un modo tramite sql per fare prendere il campo date di ogni tupla e inserire nella stessa tupla il corrispondente timestamp nel nuovo campo. mi sbaglio?

  4. #4
    Originariamente inviato da Gabbro
    ciao piero grazie per la spiegazione.
    e questa cosa vale solo per mysql o anche per oracle?
    inoltre naturalmente ora ho pensato di trasformare il campo date in timestamp in modo da ottenere una query + veloce. Una volta creato un nuovo campo nella tabella mi ricordo che c'era un modo tramite sql per fare prendere il campo date di ogni tupla e inserire nella stessa tupla il corrispondente timestamp nel nuovo campo. mi sbaglio?
    di solito gli AND vengono valutati da SX verso DX ma per ogni rdbms bisogna riferirsi alle singole specifiche sul loro modo di operare nell'insieme e non solo nella valutazione dell'operatore logico.

    per spostare un valore da date a unix timestamp lo puoi fare in un botto solo con un update.

    UPDATE tabella
    set campo_timestamp = unix_timestamp(campo_date)

    Ma non e' che ottimizzi piu' di tanto. I campi di tipo "temporale" sono comunque ottimizzati. Occhio che nel unix timestamp hai i valori di DATETIME mentre un DATE manca di ora:minuti:secondi che vengo defaultati dallo unix timestamp come 00:00:00

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  5. #5
    Utente di HTML.it L'avatar di Gabbro
    Registrato dal
    Nov 2000
    Messaggi
    828
    Originariamente inviato da piero.mac
    di solito gli AND vengono valutati da SX verso DX ma per ogni rdbms bisogna riferirsi alle singole specifiche sul loro modo di operare nell'insieme e non solo nella valutazione dell'operatore logico.

    per spostare un valore da date a unix timestamp lo puoi fare in un botto solo con un update.

    UPDATE tabella
    set campo_timestamp = unix_timestamp(campo_date)

    Ma non e' che ottimizzi piu' di tanto. I campi di tipo "temporale" sono comunque ottimizzati. Occhio che nel unix timestamp hai i valori di DATETIME mentre un DATE manca di ora:minuti:secondi che vengo defaultati dallo unix timestamp come 00:00:00

    si si ho un datetime avevo messo un valore date per fare un esempio + veloce.
    grazie ancora

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