Scurtați depozitul de date timp de boot, ferestre pro-l

Trimite o cerere pentru un material

Recent, am nevoie pentru a optimiza procesul de lot se efectuează în fiecare noapte pentru Data Warehouse SQL Server, asociat cu descărcarea de mai mult de 250 de mii. Fișiere nestructurate. După unele experimente am fost capabil de a reduce timpul total de încărcare de la 14 ore la 15 minute.

Pentru aceasta am folosit:

Să parcurgem procesul de punere în aplicare a prezentei decizii.

Observații generale

Scurtați depozitul de date timp de boot, ferestre pro-l

1. datelor pe ecran restarteze prin utilizarea pachetului SQL Server Integration Services

Aici vreau să explic de ce trebuie să încărcați valorile rânduri de date în baza de date. La prima vedere, conservarea datelor stabilite în linia (format din doar două câmpuri - data și valoarea) în baza de date nu este necesară. M-am gândit cum să le păstreze în formatul original (ca fișiere separate) sau de a folosi o bază de date, care este diferită de SQL (de exemplu, Hadoop). Dar unul dintre principalele cerințe mele a fost calcularea rânduri de corelare a datelor cu întreaga bază de date. Datorită capacităților de baze de date SQL (și pe baza unui set de interogări) capabil de a efectua o astfel de interogare aproximativ un minut pe serverul de putere medie.

Îmbunătățește performanța - schimbarea pachetului SSIS

Pentru a crește performanța, am făcut o încercare de a optimiza pachetul SSIS. La testarea cu un subset mic de date (1000 linii de date), pachetul în starea sa inițială a fost efectuată timp de 3,5 minute. sarcinilor atribuite fluxului de date nu folosesc OLE DB destinație și SQL de destinație, am redus pachetul run-time de până la 1,5 minute.

Apoi am considerat diferite metode de execuție în paralel a pachetului SSIS. Am schimbat pachetul pentru prelucrarea simultană a diferitelor pachete de fișiere (sub formă de mai multe Dataflow sarcini), a creat un pachet major pentru executarea în paralel a pachetului de bază (a se vedea. Figura 2 prezintă) și verificat o combinație a interacțiunii lor. Din păcate, nu am fost în stare să realizeze o performanță mai bună. Pe calculatorul meu nu este observat de suprasarcină CPU, memorie, sau disc, dar SSIS de lățime de bandă a scăzut proporțional cu numărul de dosare procesate simultan.

Scurtați depozitul de date timp de boot, ferestre pro-l

2. Ecranul de bază pachete de execuție paralele

Cu toate acestea, am avut nici o îndoială că este posibil să se îmbunătățească procesarea paralelă a SSIS, așa că am decis să ia în considerare metode alternative pentru a descărca fișiere.

INSERT comanda VRAC

INSERT comanda BULK a apărut în versiunea de SQL Server 7.0 și este folosit pentru a încărca datele dintr-un fișier într-un tabel sau vizualizare. Nu este la fel de flexibil ca pachetul SSIS, dar suficient de bun este configurabil și oferă posibilitatea de a porni de la atât locale, cât și de la fișiere la distanță în mai multe formate. Folosind argumente INSERT VRAC poate controla dimensiunea tranzacției, erorilor de redirecționare (și pentru a indica numărul maxim admisibil de erori), și de a schimba comportamentul și blocați condițiile de declanșare pentru activarea tabelului.

Așa cum se arată în Listarea 1. Am pregătit un script T-SQL cu cursorul pentru a captura calea fișierului pentru fiecare secvență (rețineți că pachetul SSIS pentru a itera peste căi pentru fișiere printr-o sarcină ciclică foreach). În interiorul cursorului am numit comanda BULK INSERT pentru a încărca fiecare secvență în tabelul de intermediar; după finalizarea cursorului I rula o procedură stocată ([DBO]. [spI_SeriesValue]) pentru combinarea rezultatelor intermediare la tabela destinație.

Prima dată când rulați acest script în Management Studio, mi se părea că nimic nu sa întâmplat. Am fost la o pierdere: timp de câteva secunde în fereastra de rezultate interogare ar putea vedea în poarta goală. Apoi, ca și în cazul în care trezirea, SQL Server a început febril pentru a furniza date. Nu am putut crede ochilor mei și executați din nou script-ul. A doua oară, rezultatul a fost obținut chiar ușor mai rapid - cu 5 secunde! A fost o decizie prin care întreaga secvență ar putea reîncepe în 25 de minute.

Cu toate acestea, după testarea cu un număr mai mare de serii a dezvăluit că scenariul nonlinearly scalare a avut loc (de exemplu, timpul de procesare este de 5 secvență tysyachnoy a fost de aproximativ 32 de secunde - de o reducere a productivității cu circa 20%). Cu toate acestea, eu încă mai vrut să afle dacă este posibil să se elimine un anumit număr de operațiuni de scriere la fișierele de date sau de jurnal asociat cu utilizarea tabelelor de așteptare.

Tabelele sunt optimizate pentru a se potrivi memorie

Am schimbat codul din Listarea 1 la utilizarea optimizată pentru plasarea în memorie, pe termen scurt, tabele intermediare. Pe de o miime de performanță script-ul de secvență de test a fost aproape la fel ca înainte (

5 secunde). Executarea repetată a unui set mai mare de (5? Secvența miime) script-ul a fost completat în 22 de secunde.

Acum am avut o soluție scalabilă liniar cu un număr redus de operații de scriere a fișierelor de date sau jurnalele (înregistrarea pe disc nu este disponibilă, cu excepția ultimei asociației echipe). Ca o etapă finală, am decis să aflu dacă pot efectua mai multe versiuni ale acestui scenariu, în paralel, menținând în același timp de scalare liniară.

executarea asincronă a comenzilor T-SQL

Am schimbat script-ul pentru a intra la începutul sau la sfârșitul intervalului secvenței de date în valoare de pachete de secvență pentru a efectua expedieri periodice din tabelul de așteptare la masa de destinație, apoi salvați modificările ca o procedură stocată. Ar fi posibil să se întoarcă la pachetul SSIS (sarcini multiple execute SQL, apel proceduri stocate) pentru a furniza procesare paralelă, dar am vrut să găsească o cale de T-SQL, numit sau executate de către serverul de baze de date. În mod implicit, procedura stocată sau script T-SQL execută fiecare comandă în sincronizare. Căutare pe Internet cu cuvinte cheie asincrone T-SQL oferă mai multe opțiuni, inclusiv componenta a serviciului SQL Broker, o procedură stocată în baza CLR și crearea dinamică sau executarea de locuri de muncă SQL Server Agent.

În acest din urmă decizia nu poate procesa toate seturile de date în mai puțin de 15 minute. Mă întreb ce-mi „server“ (de fapt, o mașină virtuală pe un laptop) are resurse semnificative de CPU și memorie, așa că, probabil, voi fi capabil să ruleze sarcini suplimentare în paralel, pentru a reduce și mai mult timpul de procesare.

Trebuie să spun că repornirea se face în fiecare noapte pentru mai mult de 250 de mii de dosare delimitate -. Nu este cazul cel mai tipic. Dar puteți utiliza una (sau mai multe) dintre cele trei metode descrise de mine (INSERT VRAC, tabelul care sunt optimizate pentru memorie și executarea asincronă a T-SQL), în mediul lor.

Listarea 1. Script T-SQL Script de comanda BULK INSERT

Listarea 2. Crearea unui tabel de scurt, care este optimizat pentru plasarea în depozit

Listarea 3. Tonuri de locuri de muncă SQL Server Agent de la T-SQL pentru organizarea operațiunilor asincrone

Partajați imagini cu prietenii și colegii

articole similare