Compusul 1c tipuri, devin un expert în 1s

Compusul 1c tipuri, devin un expert în 1s

Având în vedere starea cumplită actuală a programelor noastre, putem spune că programarea este cu siguranță încă o artă negru, și totuși nu putem numi o disciplină tehnică.

Motivul pentru scris acest articol a fost cea mai recentă analiză a acestei erori:

Server: Msg 8632, Nivel 17, stat 2, linia 1
Eroare internă: a fost atinsă o limită de servicii de expresie. Vă rugăm să căutați expresii potențial complexe din interogare, și să încerce să le simplifice.

Cum se păstrează tipul de date compozit în baza de date

La prima vedere, totul este destul de simplu. câmp de tip compozit din baza de date este reprezentată de două, trei sau mai multe câmpuri individuale:

Vestea bună este că, deși în acest șir lucruri mizerie de lungime nelimitată și magazin de valoare nu va funcționa 🙂 În acest moment, observăm că, chiar și câmpurile goale ale valorilor compozite (cu excepția lungimii variabile de tip string) stoca valoarea maximă în ceea ce privește dimensiunea de depozitare, și anume:

Acest lucru conduce la costuri inutile considerabile pentru spațiu pe disc și serverul de baze de date de memorie, chiar și fără a lua în considerare faptul că datele stocate pe paginile aliniate 8-kibibaytnym.

Corolar 1: tip compus duce la o creștere semnificativă a dimensiunii câmpului în înregistrare.

Ei bine, lăsați baza de disc are 30 GiB și 35 GiB - cine aceste banut conteaza si observa? Aviz de cel puțin MS SQL Server, atunci când va construi indici. Lungimea maximă a unui indice de 16 câmpuri sau 900 bytes. Aceste limite sunt adesea încălcate în registrele de date cu câmpuri compuse din măsurătorile. Apropo, pe indicele, și că toate ar fi dacă indexăm domeniul compozit? (. Fără ordonare suplimentară), în cel mai simplu caz, de exemplu, indexăm directorul câmp compozit, mai multe indicii care urmează să fie construite pentru fiecare tip de bază:

Cinci indici. Din fericire, cazul cel mai frecvent în cazul în care un tip compozit poate face referire la mai multe domenii, și există alte tipuri, doar un singur index. Dar indecșilor pe un câmp - nu contează. Problema apare atunci când câmpurile de componente multiple cu indici sunt măsurători în registre. La urma urmei, platforma încearcă să creeze un index pentru fiecare combinație de tipuri de baze (înregistrează informații pe masă registru principal în registrele de acumulare și de contabilitate - cu privire la rezultatul tabelelor). Există 3 dimensiuni „universale“ și au 126 de indici (pentru informațiile registru 5 * 5 * 5 pentru câmpuri compozite + 1 câmp special intern). Probabil din cauza faptului că în MS SQL Server nu poate fi construit mai mult de 254 de indici, al patrulea și ulterior câmpurile din index, pur și simplu nu participă, dar nu va duce la eroare.

Corolar 2. Pentru câmpurile compozite pot fi create de către mulți indici. Pentru a înregistra informații cu compozit de măsurare LOTURI indicilor.

Acești indici ocupă spațiu pe disc, să ia timp pentru a insera / schimba / șterge înregistrări, necesită o întreținere regulată. Cineva va spune: „Da, bine! Să ia, dar viteza de eșantionare!“. Este adevărat? Pentru a căuta operațiuni pe o singură valoare - da. În multe alte cazuri - nu.

Exemplu. Să presupunem că avem un câmp compozit Spravochnik1 SostavnoePole (poate conține un număr sau o referință la Document1) și Spravochnik2 același câmp compozit SostavnoePole (poate conține un număr sau o referință la Document1). SostavnoePole indexate în ambele directoare. Există un fel de anchetă:

Indici? Uita. Dacă încă mai scrie astfel de întrebări, puteți pune imediat de pe 120.000 de ruble și o voință de demisie.

Următoarea rundă de teroare începe la accesarea recuzită recuzită. De multe ori programatori leneș a scrie ceva de genul Registrator.Osnovanie.Kontragent sau Subkonto1.Vladelets.Kod.

Exemplu. Să documentele noastre din exemplul anterior, există o bază de câmp, și poate fi un compozit (RaskhodnayaNakladnaya și PrihodnayaNakladnaya) și un Contraparte câmp. Să vedem cum se va efectua o anchetă:

Și va fi efectuată astfel (în paranteze pătrate ale bazei de date de teren, sunt „părți“ ale câmpului compozit):

În exemplul nostru, acest lucru este de rezultate de interogare extrem de simple în tabelele 6 la compușii 7, 7 în care toate mesele au șanse foarte mari pentru a obține o scanare completă a indicelui grupat (adică, în esență, o scanare de masă) în loc de a folosi codurile corespunzătoare, chiar dacă este cazul. Nu respingerea „Am o bază mică, și așa vin în jos!“ Performanța cererii, în unele cazuri, poate scădea gradul de numărul de tabele. Ce înseamnă în practică? În practică, acest lucru înseamnă că, chiar și în acest caz, cererea primitivă poate fi de 128 de ori mai lent atunci când numărul de documente sau încetiniți dublat de două ori, prin creșterea cantității de documente 10%. În configurații tipice, în cazul în care în tipul de compus poate fi zeci sau sute de simplu, utilizarea unor astfel de cereri va duce aproape întotdeauna la probleme semnificative de performanță. Un alt punct negativ poate deveni inutilă atunci când blocarea unor astfel de cereri în tranzacție (de exemplu, în timpul documentului) nu este suficient că interogarea se execută mai mult și mai mult, astfel încât, de asemenea, toți ceilalți utilizatori cad în mod constant de pe timeout de blocare.

Și este destul de trist devine activitatea acestei cereri atunci când tipul de compozit poate să conțină nu numai referire la condițiile și conexiunile devin chiar mai greoaie și degradată rapid.

Fără a discuta corectitudinea sau incorectitudinea a problemei inițiale, vom încerca să înțelegem dacă este posibil să se stabilească o astfel de cerere „puțin sânge“, fără a schimba arhitectura soluției? Este foarte posibil, dar la costul de acest lucru va fi dimensiunea și lizibilitatea interogare:

În acest exemplu de realizare, a devenit un pic mai multe conexiuni, dar acestea sunt garantate de a utiliza indicii corespunzătoare. În plus, planificatorul interogările MS SQL Server sunt date un pic mai multă libertate în alegerea planurilor prin utilizarea conexiunii interne - este simetrică în raport cu tabelele și, în acest caz, cu mai multă acuratețe reflectă esența.

În această variantă, în general, planurile de execuție pot fi mai puțin stabile și depind în mare măsură de statisticile datelor. Dar, în acest exemplu de realizare, mai puțini compuși în prezența unor indici adecvați (și stele confluență cu succes peste planificator), acesta poate fi mai rapid.

Acum puteți vedea de ce un modest Subkonto1.Vladelets de expresie în cererea de resturi de registru contabil, și în special în partea în care această cerere, prins panică în mine?

Corolar 8. Pentru recuzită valori de tip compozit are loc mai mulți compuși din stânga, poate fi destul de mult și acest lucru poate degrada performanța interogării. Pentru popi popi din valorile de tip compozit (Pole1.Rekvizit1.Rekvizit2 unde cel puțin compus Pole1) folosit structuri foarte greoaie și ineficiente.

Nu utilizați întotdeauna tipul de compozit este un „bun“ decizie. De exemplu, în cazul în care valoarea unui tip de compozit este afișat în raport, că există o dilemă:

Corolarul 9. Dacă obține o idee de tip compozit, într-o interogare, atunci acest lucru duce la un număr mare de compuși. Dacă primiți apoi, în ieșire, cum ar fi un raport, aceasta va duce la un număr mare de cereri. Vești bune acolo.

Folosind valorile din tipurile compuse expresii complexe în interogări

Ne-ar dori să arate cum să pună în aplicare de lucru cu componente în anumite tipuri de limbaj expresii de interogare:

  • Funcții agregate (min, max, count)
  • Folosind expresii în SELECT ... Când ... SFARSITUL

Voi arăta exemple de astfel de tabel temporar:

articole similare