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

    Condizione 1=1

    Ciao,

    per facilitare la costruzione delle condizioni di una query, spesso gli sviluppatori usano come prima opzione: where 1=1
    in modo che poi si possa sempre aggiungere: and var = condizione; senza star li a menarsi troppo se si tratta della prima condizione e quindi mettere o meno la and;

    La mia domanda è: la condizione 1=1 può influire sulle performance? In rete ho trovato diverse opinioni ma nulla di concreto/chiaro.
    Ovviamente parlo di query su tabelle contenente oltre 500.000 record (anche 1mln).

    Il comportamento può anche differenziarsi in base al tipo di database?
    Nel mio caso si lavora su Oracle (ma non mi dispiacerebbe sapere il funzionamento su altri Db).


    Grazie.

    regalami un oggi da favola...e il domani bhe!?non mi importa se tu 6 con me! ©Ily

  2. #2
    io non ho mai percepito rallentamenti, ma di sicuro qualcosa influisce: quanto non saprei.

  3. #3
    io lo uso spesso, l'avevo copiato da un libro di K Yanks sul php e mysql fatto molto bene secondo me
    Un tardo hegeliano di Busalla / allevava un gorilla nella stalla
    citando Adorno nell notti chiare / finché il primate stanco di ascoltare
    lo strangolò con una sciarpa gialla Dillo Con Parole Sue

  4. #4
    Utente di HTML.it L'avatar di nman
    Registrato dal
    Jan 2011
    residenza
    Milano
    Messaggi
    1,333
    Con SQLServer 2008R2 su un vecchio e storico PC ho lanciato
    la Query esposta alla fine su una tabella da 21.500.000 record,

    __________________________________________________ ___________

    Praticamente esegue 5 operazioni

    Registra Datetime
    Lancia una vista normale su una parte dei 21.500.000 record
    Registra Datetime alla fine del 1° step

    Registra ancora Datetime
    Lancia la stessa vista di prima ma aggiungo WHERE 1 = 1
    Registra ancora Datetime alla fine del 2° step


    __________________________________________________ ___________


    Il risultato è il seguente con 10.000.000 di record
    codice:
     Inizio vista normale su 10000000 di record   2012-06-04 21:43:29.1700000
     Fine    2012-06-04 21:45:29.5600000
     Inizio vista 1 = 1 su 10000000 di record   2012-06-04 21:45:29.5600000
     Fine    2012-06-04 21:47:32.7500000
    Quindi tralasciando i millesimi

    la prima da 21.43.29 a 21.45.29 = 120 secondi
    la seconda da 21.45.29 a 21.47.32 = 123 secondi

    __________________________________________________ ____________


    Ripeto la prova con 15.000.000 di record
    codice:
     Inizio vista normale su 15000000 di record   2012-06-04 22:07:55.3870000
     Fine    2012-06-04 22:10:58.4370000
     Inizio vista 1 = 1 su 15000000 di record   2012-06-04 22:10:58.4830000
     Fine    2012-06-04 22:14:42.9200000
    Quindi sempre tralasciando i millesimi

    la prima da 22.07.55 a 22.10.58 = 183 secondi
    la seconda da 22.10.58 a 22.14.42 = 224 secondi

    __________________________________________________ ____________


    Ripeto la prova con 20.000.000 di record
    e il glorioso PC mi va in errore di memoria

    __________________________________________________ ____________




    Segue per conoscenza la Query utilizzata (SQLServer2008R2)

    codice:
    -- Definisco il DB Da usare
    USE Ute;
    GO
    
    -- Decido quanti dei 21.548.725 record utilizzare per la prova
    SET NOCOUNT ON;
    
    DECLARE @Record int;
    SET @Record = 15000000.0;
    
    -- ____________________________________________________________________________
    
    --  Registro l'inizio della vista normale
    PRINT  N' Inizio vista normale su ' + Cast(@Record AS nvarchar) + N' di record   ' + Cast((Cast(GETDATE() as datetime2(7))) AS nvarchar)
    
    -- Eseguo la Vista
    SELECT
    CUt,
    COg,
    CId
    FROM
    dbo.Cor
    WHERE CId < @Record
    
    -- Registro la fine della vista
    PRINT  N' Fine    ' + Cast((Cast(GETDATE() as datetime2(7))) AS nvarchar)
    
    -- _____________________________________________________________________________________
    -- ____________________________________________________________________________
    
    --  Registro l'inizio della vista 1 = 1
    PRINT  N' Inizio vista 1 = 1 su ' + Cast(@Record AS nvarchar) + N' di record   ' + Cast((Cast(GETDATE() as datetime2(7))) AS nvarchar)
    
    -- Eseguo la Vista
    SELECT
    CUt,
    COg,
    CId
    FROM
    dbo.Cor
    WHERE CId < @Record AND 1 = 1
    
    -- Registro la fine della vista
    PRINT  N' Fine    ' + Cast((Cast(GETDATE() as datetime2(7))) AS nvarchar)
    
    -- _____________________________________________________________________________________



    Saluti

  5. #5
    Utente di HTML.it L'avatar di nman
    Registrato dal
    Jan 2011
    residenza
    Milano
    Messaggi
    1,333
    ho ripetuto la prova con solo 1.000.000 di record


    codice:
     Inizio vista normale su 100000 di record   2012-06-04 22:38:43.5900000
     Fine    2012-06-04 22:38:46.3270000
     Inizio vista 1 = 1 su 100000 di record   2012-06-04 22:38:46.4200000
     Fine    2012-06-04 22:38:47.8400000
    la prima da 22.38.43 a 22.38.46 = 3 secondi
    la seconda da 22.38.46 a 22.38.47 = 1 secondi




    Strani questi numeri,

    parlando della prima prova se 1.000.000 di record li fa in 3 secondi
    10.000.000 di record li fa in 120 secondi

    Sembra che ci sia un qualcosa di esponenziale ?????

    Forse l'affaticamento della macchina ?????



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.