Una query presentate da diverse applicazioni ha DOP diversa
-
16-10-2019 - |
Domanda
Ho una domanda che seleziona da più punti di vista ed è abbastanza / pesante I O. Se eseguo questa query utilizzando Management Studio utilizza il parallelismo tra la maggior parte delle 16 CPU e completa in meno di 10 secondi. Tuttavia, durante l'esecuzione da Spotfire (un prodotto da Tibco) utilizza solo 1 CPU e può richiedere ore per completare.
Sono in grado di replicare il problema in Management Studio se utilizzando l'hint di query OPTION (MAXDOP 1) .
Stavo pensando che può essere un problema Spotfire, ma utilizza il driver JDBC Microsoft per la connessione e non vedo proprietà di connessione per quanto riguarda il parallelismo. Ho confermato utilizzando Profiler che le query da Spotfire e da Management Studio apparire esattamente. il. stesso. L'unica differenza sembra essere l'esecuzione parallela.
Qualcuno può offrire la comprensione del perché questo potrebbe accadere?
! Risolto! [Tipo di]
I reran la traccia di SQL Profiler e ha scoperto che le query sono infatti la stessa, ma il modo in cui vengono eseguiti è diverso.
Da Spotfire:
declare @ p1 int
set @ p1 = 0
declare @ p2 int
set @ p2 = 0
declare @ p7 int
set @ p7 = 0
exec sp_cursorprepexec @ p1 uscita, @ p2 uscita, NULL, N'SELECT a, b, c, d DA MyView', 16,8193, @ uscita p7
selezionare @ p1, p2 @, @ p7
Da Management Studio:
SELECT a, b, c, d Dal MyView
Ho poi aggiunto due nuovi eventi a SQL Profiler e reran le query:
- Prestazioni / grado di parallelismo
- Prestazioni / Showplan tutto
Questo ha dimostrato la query da Spotfire stava usando DOP 0 (BinaryData = 0x00000000) e da Management Studio era DOP 12 (BinaryData = 0x1200000). Successivamente, lo SHOWPLAN mi ha mostrato che la query è stata Spotfire inserendo i risultati dal punto di vista in una tabella temporanea prima di ritornare i dati al client.
Allora perché fare questo? Forse a causa del sp_cursorprepexec dichiarazione. Ma perché quella causa la DOP a scendere a 0? Non lo so.
Credo che la "soluzione" sta per lavorare con Spotfire ed eventualmente messa a punto la stringa di connessione JDBC.
Ecco un articolo da MSDN per quanto riguarda tutti parametri di connessione per JDBC.
Soluzione
Ci sono 2 modi standard per influenzare questo
- MAXDOP hint per query
- massimo grado di parallelismo Opzione per l'intero server
La risorsa governatore di SQL Server 2008 e alcune bandiere traccia influirà esso. Dubito Tibco sta usando il governatore risorsa in modo che possa essere un flag di traccia.
Una possibilità più che ho visto è transazioni implicite SET ON.
Se non ci sono i flag di traccia, effettuate operazioni implicite, e nessun accenno MAXDOP, poi le query non sono lo stesso.
Modifica, dopo l'aggiornamento domanda
Si dovrebbe essere in grado di cambiare un po 'la preparazione impostazione e / o il cursore. Esempio: http: // www .streamreader.org / serverfault / domande / 177.391 / impatto-on-SQL-2000-prestazioni-di-JDBC-selectmethodcursor
Altri suggerimenti
Si potrebbe provare a creare un piano di guida per la query specificando il suggerimento maxdop; il collegato articolo mostra il suo utilizzo quando si ha alcun controllo su query in esecuzione, e un esempio per il controllo di una query sp_cursorprepexec.