Domanda

Ho ottenuto un grande lavoro di conversione: 299 GB di immagini JPEG, già presenti nel database, in equivalenti di miniature per scopi di reportistica e larghezza di banda.

Ho scritto una funzione SQLCLR thread-safe per fare il campionamento delle immagini, bel lavoro.

Il problema è che quando lo eseguo in un'istruzione UPDATE (dal campo PhotoData al campo ThumbData), questo viene eseguito in modo lineare per prevenire le condizioni di gara, usando solo un processore per ricampionare le immagini.

Quindi, come potrei utilizzare al meglio i 12 core e la configurazione del raid phat di questo computer database? Utilizzare una sottoquery nella clausola FROM dell'istruzione di aggiornamento? È tutto ciò che è necessario per consentire il parallelismo su questo tipo di operazione?

Ad ogni modo l'operazione è suddivisa in lotti, circa 4000 immagini per lotto (in una query con finestra di circa 391k immagini), questa macchina ha molte risorse da masterizzare.

È stato utile?

Soluzione

Anche io raccomando il "round-robin" metodologia sostenuta da kragen2uk e onupdatecascade (li sto votando). So di aver letto qualcosa di irritante sulle routine CLR e sul paralellismo SQL, ma dimentico cosa fosse in questo momento ... ma penso che non giochino bene insieme.

Il bit che ho fatto in passato su compiti simili è stato quello di impostare una tabella che elenca ogni lotto di lavoro da svolgere. Per ogni connessione che si avvia, passa a questa tabella, gestisce il batch successivo, lo contrassegna come elaborato, lo elabora, lo aggiorna come Fine e si ripete. Ciò ti consente di valutare le prestazioni, gestire il ridimensionamento, consentire arresti e riavvii senza dover ricominciare da capo e ti dà qualcosa per mostrare quanto sia completa l'attività (per non parlare del fatto che sta effettivamente facendo qualcosa).

Altri suggerimenti

Controllare l'impostazione di configurazione per Massimo grado di parallelismo (MAXDOP) sul proprio SQL Server. Puoi anche impostare il valore di MAXDOP.

Questo link potrebbe esserti utile http://www.mssqltips.com/ tip.asp? punta = 1047

applausi

Non è possibile dividere la query in batch ed eseguire ciascun batch separatamente su una connessione separata? Il server SQL utilizza il parallelismo in una query solo quando ne ha voglia, e sebbene tu possa fermarlo, o addirittura incoraggiarlo (un po ') modificando la soglia di costo per l'opzione di parallelismo su O, ma penso che sia piuttosto incostante.

Una cosa degna di nota è che deciderà se utilizzare o meno il parallelismo al momento della compilazione della query. Inoltre, se la query viene compilata in un momento in cui il carico della CPU è maggiore, è meno probabile che il server SQL consideri il parallelismo.

Trova alcuni criteri per suddividere l'insieme in sottoinsiemi distinti di righe (1-100, 101-200, qualunque cosa) e quindi chiama l'istruzione di aggiornamento da più connessioni contemporaneamente, in cui ciascuna connessione gestisce un sottoinsieme di righe sul tavolo. Tutte le connessioni dovrebbero essere eseguite in parallelo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top