Ciao utenti JMP. Quando si utilizza JMP Query Builder, abbiamo una risposta rapida per i server SQL che utilizzano "ODBC Driver 11 for SQL Server", ma una risposta lenta su alcuni server Oracle che utilizzano "Oracle in OraClient11g", nell'ordine di 2 o 3 minuti.Abbiamo scoperto per caso che funziona perfettamente usando l'argomento Custom SQL() nella funzione New SQL Query() nello script, invece di usare lo script generato da JMP Query Builder.
Qualcun altro ha visto una risposta lenta da Oracle ODBC?
Parte del problema da quanto ho capito è che il nostro account di accesso per questo database Oracle non consente la visualizzazione di alcune tabelle in alcuni schemi sul server, quindi il generatore di query richiede tempo al primo caricamento per bypassarle. Potrebbe non essere possibile eseguire la replica se l'accesso al database include tutti gli schemi e le tabelle. L'invio diretto di SQL personalizzato ignora questa scansione degli schemi e delle tabelle?
Nell'esempio seguente, utilizzando Query Builder, colonne selezionate e un filtro. Ci sono voluti 147 secondi per eseguire un milione di righe. Ora da Query Builder, seleziona l'SQL dalla scheda SQL o usa la voce di menu "Converti in SQL personalizzato" e copia l'SQL personalizzato (o esegui la query dalla finestra SQL personalizzato) e incollalo come argomento per Personalizzato SQL(), e ci sono voluti solo da 7 a 8 secondi per un milione di righe.
// this is the JSL script generated by JMP Query Builder and saved to the datatable
// takes ~ 147 seconds to run
t1 = Tick Seconds();
New SQL Query(
Version( 130 ),
Connection(mycon),
QueryName( "Test1_147s" ),
Select(
Column( "X1", "t1" ),
Column( "X2", "t1" ),
Column( "X3", "t1" ),
Column( "X4", "t1" ),
Column(
"LAST_UPDATE_DATE",
"t1",
Numeric Format( "m/d/y h:m:s", "0", "NO", "" )
)
),
From( Table( "MY_DATABASE_TABLE", Schema( "SCHEMA" ), Alias( "t1" ) ) ),
Where(EQ(Column( "X2", "t1" ),"AAAA",UI( Comparison( Base( "Categorical" ) ) )))
) << Run foreground;
t2 = Tick Seconds();
t2-t1; // 147 seconds
// Now just copy the SQL code and put into the CustomSQL argument
// takes ~ 8 seconds to run
t1 = Tick Seconds();
New SQL Query(
Connection(mycon),
QueryName( "Test2_8s" ),
CustomSQL(
"SELECT t1.X1, t1.X2, t1.X3, t1.X4,
t1.LAST_UPDATE_DATE
FROM SCHEMA.MY_DATABASE_TABLE t1
WHERE ( ( ( t1.X2 = 'AAAA' ) ) )"
)
) << Run foreground;
t2 = Tick Seconds();
t2-t1; // 8 seconds
Per le nostre best practice di JMP Query Builder, ora dovremo mostrare come eseguire e salvare la query e la tabella dati dalla finestra SQL personalizzata per i database Oracle.
Grazie per i dati sulle prestazioni. Sembra che tu abbia una soluzione.
Sarà interessante vedere se JMP ha alcune informazioni o suggerimenti da condividere.
Grazie per questi suggerimenti! Ha fatto altri test.
Vedo l'effetto di una seconda chiamata al database Oracle, ma vedo ancora la differenza dell'ordine di grandezza tra le due tecniche JSL. Devo solo disconnettermi da JMP14 per testarlo. Se eseguo il test sullo schema lento, la prima volta Custom SQL() impiega 0,4 secondi. Se ripeto le esecuzioni dello script Custom SQL() nella sessione corrente di JMP, viene ridotto a 0,06 secondi.Ma questo non aiuta per il codice Query Builder standard, richiede 120 secondi, qualunque cosa accada. Credo che la modifica da 0,4 a 0,06 tra la 1a e la 2a chiamata al database Oracle, se si verifica per lo schema lento, sia nel rumore dei test ripetuti sempre intorno a circa 120 secondi.
Ho anche testato uno schema "veloce". Anche la prima esecuzione di SQL personalizzato è di circa 0,4 secondi, quindi si riduce a 0,06 secondi per le chiamate successive nella sessione attiva. Per il codice Query Builder standard la prima chiamata è 1.2s, le chiamate successive nella sessione JMP attiva si riducono a 0.8s.
Da questi test, vedendo una riduzione di ~0,3 s per una chiamata ripetuta al database Oracle perché richiama un'ultima query indipendentemente dallo schema per Custom SQL(), ma non la vede nello schema "lento" utilizzando lo script Query Builder stile.
Qui non ci piace il metodo Apri database/Chiudi database (preoccupati di appendere un database aperto), preferiamo usare il Query Builder, ma dovremo usare il metodo Custom SQL() e acquisire il codice SQL dal Query Builder interfaccia utente.
Questi sono solo un paio di commenti per esperienza:
- Oracle richiama un'ultima query, quindi spesso la seconda chiamata è più veloce della prima. Per verificarlo, chiudi la connessione e disconnetti il sistema (in modo da avere un nuovo ID utente di sistema), quindi esegui solo la tua seconda query e ottieni il tempo di esecuzione. Controlla se è meno vicino a 8 secondi o molto più grande o vicino a 147 secondi.
- Gli esperti di JMP dovranno verificare cosa sta realmente accadendo, ma sembra che JMP potrebbe aver creato la tabella e quindi eseguito le istruzioni di query nella prima New SQL Query(). E forse la seconda New SQL Query(), JMP invia semplicemente l'istruzione sql al database e restituisce i risultati.
- Quando eseguo la stessa query o una simile in giorni diversi, mi piace usare Query Builder per creare e testare la query.Quindi ottengo l'SQL e scrivo il mio script per utilizzare Open Database ("stringa di connessione", "stringa di query", "nome tabella");
Buona fortuna!