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.

Ecco un altro articolo da qualcuno che ha avuto lo stesso problema esatto che ho, anche senza risoluzione.

È stato utile?

Soluzione

Ci sono 2 modi standard per influenzare questo

  1. MAXDOP hint per query
  2. 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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a dba.stackexchange
scroll top