Contacte

1s 8 cerere lot. Interogări simple. Motive pentru performanța suboptimă a interogărilor

Să analizăm cum este sintaxa textelor cererilor pentru exemplu simplu: Document în curs de păstrare Consumabil conţinând în secţiunea tabelară Bunuri lista articolelor vandute si cantitatea. La realizarea unui astfel de document este necesar să se asigure controlul soldurilor negative stocate în registrul de acumulare a soldurilor. Solduri de mărfuri.

Structura configurației este prezentată în figură.

(16,22 kiloocteți) Descărcări: 64

Să formăm o interogare pentru secțiunea tabelară a documentului și tabelul virtual Resturi registrul de acumulare. Vom lua în considerare posibilele rânduri duplicate în document, pentru aceasta vom grupa înregistrările.

Solicitare = Solicitare nouă;
Solicitare.Text = "
| ALEGE
| Doc.Nomenclatura,
| SUM (Doc.Quantity) AS Doc_Number,
| MINIM (ESTE NULL (Reg.Amount Remaining, 0)) AS Reg_Number
| DE LA
| Document.Consumabil.Bunuri AS Doc
| ARTICULAȚIA STÂNGA
| Registrul de acumulare.Solduri de mărfuri.Rămășițe () AS Reg
| PE
| Doc.Nomenclature = Reg.Nomenclature
| UNDE
| Link = & Link
| LOAD BY Doc.Nomenclatura ";

// Glisați prin registru

Sfârșitul ciclului;

Sfârșitul procedurii

Desigur, interogarea dată nu este absolut optimă. Cu ajutorul interogărilor imbricate, îl optimizăm: Să grupăm secțiunea tabulară a documentului înainte de a o alătura cu tabelul de reziduuri, trecem lista de bunuri la parametrii tabelului virtual ca valoare a condiției de calcul a reziduurilor . Ca urmare, cererea noastră va lua următoarea formă:

| ALEGE
| Doc.Nomenclatura,

| DE LA
| (SELECTAȚI

| DIN
| Document.Factura.Marfa
| UNDE
| Link = & Link
| LOAD BY Nomenclator) AS Doc
| ARTICULAȚIA STÂNGA
Nomenclatura B
| (SELECTARE DIVERSE
| Nomenclatură
| DIN
| Document.Factura.Marfa
| UNDE
| Link = & Link)) AS Reg
| PE

Dacă într-o interogare era necesar să se obțină date din rămășițele diferitelor registre, atunci valoarea filtrului și, prin urmare, a doua noastră subinterogare, s-ar repeta în toți parametrii tabelelor virtuale, este firesc ca sistemul să acceseze din nou baza de date pentru fiecare. subinterogare pentru a prelua date.

Tabele temporare

Nu-mi amintesc din ce versiune a devenit posibilă utilizarea tabelelor temporare în interogări. Pentru aceasta, se folosește obiectul „Manager tabel temporar”. De fapt, managerul tabelelor temporare descrie spațiul de nume al tabelelor temporare și este responsabil pentru crearea și distrugerea acestora în baza de date.

Tabelele temporare în sine sunt într-adevăr create fizic în baza de date, așa că ar trebui să le tratați cu atenție, deoarece subsistemul de disc este în prezent cea mai lentă parte a tehnologiei, iar viteza de creare și distrugere a tabelelor depinde direct de aceasta.

Să rescriem interogarea pentru a folosi tabele temporare. Plasați secțiunea tabulară grupată a documentului și lista de produse pentru filtrarea tabelelor virtuale în tabele temporare:

Procedura de procesare a postării (refuz, mod de înregistrare)

MVT = New TemporaryTable Manager;

Solicitare = Solicitare nouă;
Solicitare.Text = "
| ALEGE
| Nomenclatură, SUM (Cantitate) AS Cantitate
| DOCTOR POST
| DE LA
| Document.Factura.Marfa
| UNDE
| Link = & Link
| LOAD BY Nomenclatură ";

Solicitare = Solicitare nouă;
Query.TemporaryTablesManager = MVT;
Solicitare.Text = „SELECTARE DIVERSE
| Nomenclatură
| PLASĂ LISTA DE ARTICOLE
| DE LA
| Document.Factura.Marfa
| UNDE
| Link = & Link ";

Solicitare = Solicitare nouă;
Query.TemporaryTablesManager = MVT;
Solicitare.Text = "
| ALEGE
| Doc.Nomenclatura,
| Doc.Quantity AS Doc_Number,
| IS NULL (Reg.Amount Remaining, 0) AS Reg_Number
| DE LA
| DOCTCH AS Doc
| ARTICULAȚIA STÂNGA
| Registrul de acumulare.Solduri de mărfuri.Rămăși (,
| Nomenclatură
| DIN
| PE
| Doc.Nomenclature = Reg.Nomenclature ";

QueryResult = Query.Run ();
Selecție = QueryResult.Select ();

While Fetch.Next () Buclă

// Verificați dacă există reziduuri negative

// Glisați prin registru

Sfârșitul ciclului;

Sfârșitul procedurii

Când utilizați tabele temporare în textul interogării, utilizați instrucțiunea Loc pentru a crea un nou tabel temporar, în acest caz sistemul nu transferă conținutul acestui tabel în rezultatul interogării (vezi nota 1 și exemplul 2 din textul de mai sus), ci numărul de înregistrări plasate în tabelul temporar, dacă doresc, nu puteți accepta această valoare.

Este, de asemenea, permisă utilizarea instrucțiunii Distrugeîn acest caz, tabelul temporar este distrus, în caz contrar, tabelele temporare sunt distruse împreună cu obiectul manager de tabel temporar.

În interogarea noastră principală, am folosit denumirile tabelelor temporare ca o indicație a sursei de date (trebuie să li se atribuie un sinonim, pe care îl vedem în text). Puteți folosi tabelele temporare ca sursă de mai multe ori, ceea ce, dacă este folosit cu pricepere, vă va permite să scurtați textul interogării (îmbunătățiți lizibilitatea interogărilor complexe) și să creșteți viteza (când utilizați date temporare din tabel în mai multe locuri în interogare) .

Solicitări de lot

Interogările lot completează în mod logic funcționalitatea tabelelor temporare și oferă mai multe opțiuni atunci când lucrați cu interogări.

Într-o interogare în lot, de fapt, puteți descrie mai multe interogări, ambele legate între ele folosind tabele temporare, și nu legate (este posibil, dar nu este clar de ce?). Ca rezultat, puteți executa toate cererile secvenţial și accepta ca rezultat fie o matrice cu rezultatele fiecărei execuții de solicitare, fie rezultatul ultimei. Pentru a obține o matrice cu rezultate de interogare, utilizați metoda RunPackage () cerere de obiect și pentru a obține rezultatul ultimei solicitări ExecuteRequest ().

În textul cererii, cererile de pachete sunt separate prin „;” (punct şi virgulă). O interogare de lot are un spațiu de nume de tabel virtual. Utilizarea unui manager temporar de tabele nu este necesară, dar este posibilă dacă doriți să transferați tabele temporare de la o interogare de lot la alta.

Să rescriem procedura de utilizare a cererilor de lot:

Procedura de procesare a postării (refuz, mod de înregistrare)

Solicitare = Solicitare nouă;
Solicitare.Text = "
| ALEGE
| Nomenclatură, SUM (Cantitate) AS Cantitate
| DOCTOR POST
| DE LA
| Document.Factura.Marfa
| UNDE
| Link = & Link
| ÎNCĂRCARE DUPĂ Nomenclatură
|;
| SELECTAȚI DIVERSE
| Nomenclatură
| PLASĂ LISTA DE ARTICOLE
| DE LA
| Document.Factura.Marfa
| UNDE
| Link = & Link
|;
| ALEGE
| Doc.Nomenclatura,
| Doc.Quantity AS Doc_Number,
| IS NULL (Reg.Amount Remaining, 0) AS Reg_Number
| DE LA
| DOCTCH AS Doc
| ARTICULAȚIA STÂNGA
| Registrul de acumulare.Solduri de mărfuri.Rămăși (,
| Nomenclatura B (SELECTARE DIVERSE
| Nomenclatură
| DIN
| Lista articole AS Lista articole)) Reg. AS
| PE
| Doc.Nomenclature = Reg.Nomenclature ";

While Fetch.Next () Buclă

// Verificați dacă există reziduuri negative

// Glisați prin registru

Sfârșitul ciclului;

Sfârșitul procedurii

De fapt, am eliminat definiția obiectului de interogare și utilizarea managerului de tabel temporar, am combinat textele de interogare (rețineți separatorul „;” dintre texte). Ca urmare, textul interogării a devenit mai lizibil (și lizibilitatea interogării este mult îmbunătățită atunci când se utilizează designerul de interogări).

După executarea cererii către variabilă Gamă de rezultate vom avea 3 elemente. Primele două vor conține un număr care caracterizează numărul de înregistrări plasate în tabele temporare DOCTși Listă de obiecte, iar al treilea va conține o selecție cu câmpuri Nomenclatură, Doc_ Cantitate si Reg_ Cantitate.

Într-o variabilă Rezultatul Cererii va fi inclus doar proba.

Ei bine, cam atât pentru solicitările de lot. Un mecanism foarte convenabil atât din punctul de vedere al scrierii interogărilor, cât și din punctul de vedere al citirii interogărilor complexe.

Platforma 1C Enterprise vă permite să executați mai multe solicitări secvenţial simultan. În 1C, acest lucru se numește un lot de solicitări. În cadrul unui singur pachet, fiecare cerere este separată prin punct și virgulă.

Pentru a realiza o execuție pas cu pas a interogărilor într-un pachet, de regulă, sunt create inițial tabelele temporare, apoi se formează condiții pentru utilizarea lor în comun, cum ar fi filtre, îmbinări, îmbinări. Datorită acestui lucru, rezultatul final este atins. Tabelele temporare obținute ca urmare a oricăror interogări din pachet continuă să existe până la sfârșitul întregului pachet sau până când este executată o interogare care distruge tabelele temporare.

În plus, utilizarea interogărilor pe lot și a tabelelor temporare crește foarte mult lizibilitatea întregii părți a acestui cod. Interogările complexe care conțin și interogări imbricate pot fi foarte greu de înțeles. Cu toate acestea, dacă împărțiți o interogare lungă și complexă în mai multe și chiar folosiți tabele temporare, atunci acest lucru nu numai că va îmbunătăți percepția, dar în majoritatea cazurilor va duce la o performanță mai bună.

Un alt detaliu important în favoarea solicitărilor de lot în 1C este că, spre deosebire de noi, putem obține rezultatul fiecărei solicitări într-un lot separat.

Un exemplu de creare a unui pachet de cereri în limbajul 1C

Pentru a vedea un exemplu de creare a unui pachet de interogări, vom folosi constructorul de interogări, pe care îl vom apela pentru claritate din consola de interogări. Astfel, putem vedea imediat rezultatul execuției pachetului.

Să creăm o cerere de lot simplă. Propun să inserăm imediat textul cererii în, apoi să deschidem și să vedem cum este format pachetul de solicitare. Adăugați o nouă interogare în consolă și inserați următorul text:

Obțineți gratuit tutoriale video 267 1C:

Autoportant.Link,
Părinte care se întreține singur,
Cod autonom,
Cod de selecție rapidă.
Autoportant.
Tip autoportant,
Autoportant, în afara bilanţului,
autosusținut, cantitativ,
DIN
Plan de conturi.Auto-susținere AS Auto-susținută
UNDE
Self-supporting.Ref = & Account
;
////////////////////////////////////////////////////////////////////////////////

SELECTAȚI
Tipuri autoportante
Tipuri autoportante
Tipuri de sub-konto autoportante.Tip de sub-konto.
Self-supportingTypesSubconto.Subconto.TypeValues ​​​​AS TypeValues,
Tipuri autoportanteSubkonto.OnlyTurnover AS OnlyTurnover,
Self-supportingTypesSubconto.Sum AS Sum
DIN
Plan de conturi Autoportante Tipuri de Subconto AS Autoportante
UNDE
Self-supportingTypesSubkonto.Ref = & Cont
FILTREAZĂ DUPĂ
Self-supportingTypesSubconto.NumberLines

La mine arata asa:

Acum să trecem la designerul de interogări. Aici ne va interesa fila „Solicitare pachet”:

După cum puteți vedea, avem un pachet de două cereri. Făcând dublu clic pe oricare dintre ele, puteți trece la editarea acestuia:

Apăsați butonul „Ok” și încercați să vedeți rezultatul solicitării lotului.

Să setăm parametrul „Cont”. Puteți selecta orice cont din planul de conturi. După cum probabil ați ghicit deja, acest pachet de solicitări ar trebui să primească proprietățile contului. Faceți clic pe „Run” și vedeți rezultatul:

Metodele Execute () și ExecutePackage ().

Când interogarea mea a devenit atât de complexă încât a depășit înțelegerea mea, am decis să folosesc interogări pe lot.

Dar m-am confruntat cu faptul că nu știu nimic despre ei. S-a dovedit că totul este foarte simplu. În 5 minute vei putea folosi solicitările de lot. Începeți să citiți.

După cum sa dovedit, totul este foarte simplu. Trebuie doar să scrieți mai multe interogări separate prin punct și virgulă. Rezultatul va fi returnat la ultima cerere.

Solicitările lot au apărut doar în versiunea 8.1.11.67.4.

Iată textul cererii:

SELECTAȚI T1.Zn POZITĂ VTLETTERS DIN (SELECT „A” AS KN COMBINE ALL SELECT „B”) AS T1;

SELECTARE T1.Zn PLACE WTDits FROM (SELECT "1" AS KN COMBINE ALL SELECT "2") AS T1;

ALEGEȚI TB.Zn, TC.Zn, TB.Zn + TC.Zn DIN VT Litere AS TB, VT Numere AS TC

Interogările lot sunt acceptate în orice consolă de interogări obișnuită.

Figura prezintă un exemplu de execuție a interogării:

Și acum puțin din experiență. De ce avem nevoie de solicitări de loturi.

Faptul este că un rezultat intermediar poate fi atașat tabelului temporar, care poate fi apoi necesar în mai multe interogări ulterioare.

Anterior, când nu existau tabele temporare, trebuia să duplicați textul interogării.

Puteți, desigur, să renunțați la interogarea lot executând mai multe interogări secvenţial și manipulând tabele imbricate. Dar solicitările de lot sunt mai convenabile. Doar scrieți o interogare și nu vă gândiți la plasarea tabelelor temporare. Totul se întâmplă de la sine.

În plus, dacă se folosește un sistem de compunere a datelor (ACS), acesta selectează în mod inteligent câmpurile necesare și minimizează întregul lot de solicitări.

Dacă cererile ar avea o metodă Solicitare.Run () atunci acum există o metodă Request.RunPackage () care returnează toate tabelele din pachet, ca o matrice.

Anunțul cererilor de lot pe site-ul web 1c este aici: http://v8.1c.ru/overview/release_8_1_11/#Functional

Povestea vieții

Permiteți-mi să explic ce m-a determinat să fac solicitări de lot.

Deci, imaginați-vă că există un document, el are parte tabulară... Într-o coloană" Eroare»Semnați dacă există o eroare la completarea documentului. Într-o coloană" TextErrors»Pot exista una sau mai multe propoziții cu texte de eroare. Tipurile de erori cuprinse în propuneri sunt cunoscute din timp.

Deci, introducem o listă cu toate erorile din tabel. Coduri de eroare- conține codul de eroare și subșirul de căutare.

Primim una, două sau mai multe erori pentru fiecare linie. pentru că pot exista mai multe erori pe o linie.

Dar eroarea poate să nu fie recunoscută, adică steag " Eroare„Stă, iar textul de eroare nu ne-a dat un cod de eroare.

Facem unirea din stânga, unde codul de eroare este NULL, dăm codul de eroare " Alte erori» .

Dar problema a fost că au existat aproximativ 200 de coduri de eroare, așa că unirea din stânga a funcționat foarte mult timp. A trebuit să-l înlocuiesc cu o conexiune internă care zbura. Dar, în același timp, s-au pierdut liniile pentru care eroarea nu a fost găsită. Nu am reușit niciodată să-mi dau seama cum să trag aceste linii în rezultat.

Solicitarea a fost scrisă pentru sistemul de layout, i.e. în principiu, nu pot fi folosite tabele de valori sau tabele temporare. Aici au intrat cererile de loturi.

Am concatenat încă o dată toate liniile cu erori cu toate liniile pentru care au fost găsite erori și am adăugat în continuare tipul de eroare „Alte erori”.

Articolul descrie mecanismul solicitărilor de lot implementat în platforma 1C: Enterprise. După ce ați citit articolul, veți afla:

  • Ce sunt solicitările de lot și pentru ce sunt acestea?
  • Cum creez un pachet de interogări folosind Generatorul de interogări?
  • Cum returnez o serie de rezultate pentru fiecare interogare dintr-un lot?

Aplicabilitate

Materialul este relevant pentru versiunile actuale ale platformei 1C: Enterprise, versiunea 8.3

Scopul lotului de solicitare

Platforma vă permite să lucrați cu solicitări de lot. Avem posibilitatea de a executa mai multe cereri „o dată”. Într-o cerere de lot, textele solicitării sunt separate prin „;” (punct şi virgulă).

Interogările sunt executate secvențial, în timp ce tabelele temporare care au fost create în timpul execuției oricărei interogări vor exista până la sfârșitul execuției întregului lot de interogări sau până la executarea unei interogări în lotul care distruge acest tabel temporar. O diferenta importanta dintr-o subinterogare este că rezultatele fiecărei solicitări de lot sunt disponibile separat.

Pachetele de interogări vă permit să realizați o execuție în etape a interogărilor. Pentru a face acest lucru, într-o interogare în lot, sunt create mai întâi tabelele temporare, apoi utilizarea lor în comun (unire, unire, filtre) pentru a obține rezultatul final al interogării. De asemenea, este important să rețineți că utilizarea tabelelor temporare în interogări de lot poate îmbunătăți lizibilitatea textului interogării.

Interogările voluminoase cu interogări imbricate împachetate unele în altele sunt adesea destul de greu de înțeles. Dar dacă rescrieți o astfel de interogare folosind tabele temporare, vizibilitatea interogării poate fi îmbunătățită semnificativ. Utilizarea unui lot de interogări cu tabele temporare poate îmbunătăți, de asemenea, performanța interogărilor.

Există tehnici pentru optimizarea performanței interogărilor bazate pe înlocuirea interogărilor imbricate cu tabele temporare.

Un tabel temporar poate fi util atunci când trebuie să utilizați aceleași date de mai multe ori într-o interogare mare, cum ar fi alăturarea sau unirea cu alte tabele. Când se utilizează interogări imbricate, astfel de date ar trebui să fie preluate de mai multe ori folosind aceleași interogări imbricate, ceea ce, desigur, ar afecta atât lizibilitatea textului, cât și performanța.

Construiți un pachet de interogări folosind Designer

Cererile individuale incluse în pachet sunt separate în text prin „;” (punct şi virgulă). Pentru a evita împărțirea manuală a textului interogării, puteți utiliza Designerul de interogări pentru a face acest lucru.
Generatorul de interogări are o filă separată pentru pachetele de interogări. Cererile pot fi adăugate la pachet folosind butonul corespunzător din panoul de comandă și, de asemenea, mutate în sus sau în jos.

Afișarea vizuală a interogărilor individuale - file din partea dreaptă a designerului, cu care puteți trece la editarea textului unei interogări individuale. Pe aceste file sunt afișate nume pentru tabelele temporare, pentru solicitările de selecție de date - „Solicitare lot 2”, etc., pentru distrugere - „- NameBT”.

De asemenea, în lista tabelelor bazei de date apar și tabele temporare create în interior acest pachet... Totuși, acest lucru nu înseamnă că tabelele temporare sunt stocate în baza de date împreună cu toate celelalte tabele din baza de date.

Executarea cererilor de pachete

Dacă obiectul Anchetă executând cererea de lot, managerul temporar de tabele este instalat, tabelele temporare care nu au fost distruse în cadrul interogării lot vor fi salvate în managerul instalat.

În textul unei solicitări de lot, este posibil să se utilizeze și să se distrugă tabelele temporare care existau în managerul de tabel temporar instalat în momentul în care pachetul a fost lansat pentru execuție.

Pe langa metoda A executa () care execută secvenţial toate cererile pachetului şi returnează rezultatul ultimei solicitări din pachet, există o altă metodă în platformă - RunPackage ().

Această metodă execută toate cererile secvenţial şi returnează o serie de rezultate pentru fiecare cerere din pachet, în ordinea în care solicitările apar în corpul pachetului.

Rezultatul executării unei interogări pentru a distruge un tabel temporar este valoarea Nedefinit care este plasat și în tabloul de rezultate.

Acest articol se adresează cititorilor care sunt familiarizați cu limbajul SQL.

Limbajul de interogare în 1C, care a fost folosit începând cu versiunea 8, a devenit astăzi unealtă folositoare pentru lucrul cu baze de date, ceea ce vă permite să citiți din ele, dar nu să scrieți. Sintactic, limbajul de interogare este foarte asemănător cu limbajul SQL, dar în rusă.

Mai jos este un tabel de corespondență între principalii operatori ai limbajului de interogare și SQL:

Operatorii limbajului de interogare 1C

Declarație SQL

VARIAT

COMPUS

ÎNCĂRCARE PENTRU

COMBINA

FILTREAZĂ DUPĂ

Și asta e departe de a fi lista plina... Mai complet informații generale pe disponibile operatorilor limbajul de interogare poate fi obținut de la designerul de interogări, care va fi discutat mai jos.

Executarea unei cereri 1C de la codul programului se realizează folosind obiectul limbajului încorporat „Solicitare”. Un exemplu de scriere a unei interogări de bază de date utilizând limbajul de programare încorporat:

Solicitare = Solicitare nouă; Request.Text = "SELECT | Synonym.Link AS Link | FROM | Directory.Reference1 AS Sinonim"; Selecție = Query.Run ().Selectare (); While Selection.Next () Cycle // Inserare procesare selecție SelectionDetailedRecords Sfârșitul ciclului;

Metoda „Run” execută interogarea, metoda „Select” returnează o valoare de tip „FetchFromQueryResult”. Alternativ, puteți utiliza metoda Unload, care returnează un tabel de valori.

Parametrii de solicitare sunt stocați în proprietatea „Parametri” (în acest caz, este o structură, deci toate metodele de structură sunt aplicabile aici - inserare, ștergere etc.).

Un exemplu de setare a parametrului „Query.Parameters.Insert” („Referință”, ReferenceLink). Într-o solicitare, puteți face referire la parametri prin ampersand „& Reference”. Mai jos este un exemplu de solicitare folosind parametri:

Solicitare = Solicitare nouă; Request.Text = "SELECT | Users.Link AS Link, | Users.Parent AS Parent, | Users.Name AS Nume | FROM | Directory.Users AS Utilizatori | WHERE | Users.Link = & Director"; Request.Parameters.Insert („Director”, DirectoryLink); Selecție = Query.Run ().Selectare (); While Selection.Next () Cycle // Inserare procesare selecție SelectionDetailedRecords Sfârșitul ciclului;

Amintiți-vă că limbajul de interogare este destinat doar citirii datelor din baza de date, prin urmare nu are analogi Instrucțiuni SQL precum INS ERT și UPDATE. Datele pot fi modificate doar prin model de obiect limbaj de programare încorporat 1C. De asemenea, în limbajul de interogare 1C există operatori care nu au analogi în SQL, de exemplu:

  • ÎN IERARHIE
  • LOC
  • INDEX PRIN

ÎN IERARHIE- vă permite să selectați toate elementele catalogului ierarhic care sunt incluse în ierarhia link-ului transmis. Exemplu de solicitare folosind ÎN IERARHIE:

SELECT Bunuri.Link, Bunuri.Articul DIN Director.Marfa AS Bunuri WHERE Bunuri.Link IN IERARHIE (& Citrus) "

În acest caz, rezultatul va returna toate elementele subordonate catalogului de nomenclatură Citrus, indiferent de câte niveluri de ierarhie are acest catalog.

De asemenea, de exemplu, sarcina este să găsiți un produs cu numele „Mâner”. Articolul trebuie inclus în ierarhia „Papetărie”. Bunuri ”, adică nu trebuie să căutăm un clanță. Structura nomenclaturii în acest caz este următoarea:

Cancelaria

| _ Pixuri | _ Pix roșu | _ Pix albastru | _ Pixuri cu cerneală | _ Rigle

Fitinguri

| _ Mâner de ușă | _ Mâner simplu de ușă | _ Mâner de ușă de lux

Scriem o cerere ca aceasta:

SELECT Products.Link, Products.Article FROM Directory.Products AS Products WHERE Produse.

Când utilizați designul ÎN IERARHIE trebuie avut în vedere că, dacă treceți un link gol către parametrul „Office”, interogarea va încetini, deoarece platforma va verifica fiecare element pentru apartenența la rădăcină.

LOC- Această declarație plasează rezultatul într-un tabel temporar. Exemplu de cerere:

SELECT Users.Link AS Link, Users.Parent AS Parent, Users.Name AS Nume PUT Users Selected FROM Directory.Users AS Users WHERE Users.Link = & Directory; SELECT SelectedUsers.Ref AS Link, SelectedUsers.Parent AS Parent, SelectedUsers.Name AS Nume FROM SelectedUsers AS SelectedUsers

Această interogare SQL va fi executată de mai multe interogări:

  • Crearea unui tabel temporar (platforma este capabilă să „reutilizeze” tabelele temporare create anterior, astfel încât crearea nu are loc întotdeauna);
  • Introducerea datelor într-un tabel temporar;
  • Executarea interogării principale și anume SEL ECT din acest tabel temporar;
  • Distrugerea / ștergerea mesei temporare.

Tabelul temporar poate fi distrus în mod explicit, prin construcție DISTRUGE, sau implicit - la închiderea managerului de tabel temporar.

Obiectul „Interogare” al limbajului de programare încorporat are o proprietate „TemporaryTablesManager”, care este destinat lucrului cu tabele temporare. Cod simplu:

MVT = NewTemporaryTablesManager (); Solicitare = Solicitare nouă; Query.TemporaryTablesManager = MVT;

După executarea interogării, MBT poate fi folosit a doua oară într-o altă interogare, ceea ce este, fără îndoială, un alt avantaj al folosirii tabelelor temporare. În acest caz, tabelul temporar va fi șters din baza de date atunci când metoda „Închidere” este numită...

MVT.Închidere ();

... sau la ștergerea unei variabile din memorie, adică la executarea metodei în care a fost declarată variabila. Tabelele temporare măresc încărcarea subsistemului de disc, așa că nu ar trebui să creați prea multe subsisteme temporare (în buclă, de exemplu) sau subsisteme mari.

INDEX PRIN- acest operator este utilizat împreună cu operatorul LOC. Când creează un tabel temporar, acest operator poate indexa tabelul creat, ceea ce accelerează semnificativ lucrul cu acesta (dar numai dacă indexul se potrivește interogării tale).

Consultație gratuită a experților

Vă mulțumim pentru cererea dvs!

Un specialist 1C vă va contacta în 15 minute.

Caracteristicile unor operatori ai limbajului de interogare

PENTRU SCHIMBAREacest operator este conceput pentru a bloca un anumit tabel de interogare (sau toate tabelele care participă la o interogare). Blocarea se realizează prin impunerea unui lacăt U pe masă. În SQL, acest lucru este implementat prin hint UPDLOCK. Acest design este necesar pentru a preveni blocajele. Un exemplu de cerere cu o construcție PENTRU SCHIMBARE:

SELECT Users.Link AS Link, Users.Parent AS Parent, Users.Name AS Nume FROM Directory.Users AS Users LEFT UNION Directory.RFK AS RFK ON Users.RFK = RFK.Link FOR CHANGE Directory.Users

V acest exemplu U lock va fi setat pe tabelul „Utilizatori”. Dacă nu specificați un tabel de blocat, acesta va fi suprapus pe toate tabelele care participă la interogare. Este important de reținut că acest design funcționează numai în configurații care includ mod auto managementul blocurilor.



COMPUS- cererea menține conexiuni STÂNGA / DREAPTA, COMPLET, INTERIOR, care corespunde îmbinărilor în SQL - LEFT / RIGHT JOIN, OUTER JOIN, INNER JOIN.

Cu toate acestea, atunci când utilizați Generatorul de interogări, nu puteți face acest lucru CONEXIUNEA CORECTA. Constructorul va schimba pur și simplu tabele, dar operatorul va fi întotdeauna lăsat. Din acest motiv, în 1C nu veți vedea niciodată utilizarea conexiunii potrivite.

Sintactic, conexiunea arată astfel:

SELECT Tabel1.Ref AS Link FROM Reference.Reference1 AS Table1 LEFT JOIN Reference.Reference2 AS Table2 BY Table1.Attribute = Table2.Attribute

În limbajul de interogare 1C, nu există niciun operator pentru alăturarea unui produs cartezian (CROSS JOIN). Cu toate acestea, absența unui operator nu înseamnă că limbajul de interogare nu acceptă o astfel de conexiune. Dacă este necesar, vă puteți alătura meselor în acest fel:

SELECT Tabel1.Ref AS Link FROM Referință Referință1 AS Tabel1 LEFT JOIN Referință Referință2 AS Tabel2 TRUE

După cum puteți vedea din exemplu, cheia de conectare este setată ADEVĂRAT, adică fiecărui rând dintr-un tabel îi corespunde un rând din altul. Tipul de îmbinare (STÂNGA, DREAPTA, COMPLET, INTERIOR) nu este important dacă aveți rânduri în ambele tabele, dar dacă nu există rânduri în niciunul dintre tabele (lăsând tabelul), rezultatul va fi diferit. De exemplu, când se utilizează INTERN rezultatul conexiunii va fi gol. Folosind STANGA DREAPTA rezultatul va fi o alăturare sau fără date, în funcție de tabelul la care ne alăturăm - cu date sau nu. Folosind DEPLIN conexiunile de date vor fi întotdeauna (desigur, doar un tabel, deoarece există gol în celălalt), alegerea tipului de conexiune depinde de aplicația specifică.

Un mic indiciu vizual cum funcționează Tipuri variate conexiuni:



CA. Spre deosebire de operatorul similar Limbajul SQL- LIKE, un șablon pentru CA poate fi setat folosind doar câteva caractere speciale:

  • % (procent): o secvență care conține orice număr de caractere arbitrare;
  • _ (subliniere): un caracter arbitrar;
  • / - Următorul caracter trebuie interpretat ca un caracter obișnuit.

REZULTATE ON echivalentul în SQL este operatorul ROLLUP. Exemplu de utilizare a operatorului REZULTATE:

SELECTAȚI Produse.Preț CA Preț, Produse.Produs CA Produs DIN Director.Nomenclatură CA Produse MEDIA TOTALĂ (Preț) PE Produs

Rezultatul va fi astfel:

Pat

9833,333

Fier

Un stilou

Adică, la rezultat se adaugă o linie suplimentară care conține valoarea câmpului prin care se realizează gruparea și valoarea funcției de agregare.

Lucrul cu cereri de loturi

1C vă permite să lucrați cu pachete de solicitare. Într-o cerere de lot, textele de interogare sunt separate prin punct și virgulă (;). Solicitarea lotului 1C este executată secvenţial. Exemplu de text de solicitare a lotului:

SELECT Users.Link AS Link, Users.Parent AS Parent, Users.Name AS Nume FROM Directory.Users AS Users;
SELECTARE Program de lucru.Utilizator AS Utilizator, Program de lucru.Data AS Data, Program de lucru.Ore de lucru AS Ore de lucru FROM Registrul de informații.Program de lucru AS Program

Pentru a obține rezultatul tuturor solicitărilor incluse în pachet, trebuie să utilizați metoda obiectului de solicitare RunPackage în loc de Run. Aceasta metoda execută toate cererile secvenţial. Rezultatul unei interogări este o matrice de rezultate pentru fiecare interogare din lot, iar secvența din matrice este aceeași cu succesiunea de interogări din textul lotului.

Având în vedere limbajul de interogare, merită menționată o astfel de caracteristică precum tabelele virtuale. Nu există tabele virtuale în baza de date, este un fel de wrapper care este executat pe partea DBMS ca o interogare folosind subinterogări. Un exemplu de interogare 1C folosind tabele virtuale:

SELECT Registrul de obligații

O astfel de interogare pentru un SGBD va arăta astfel:

SEL ECT T1.Fld25931RRef FR OM (SELECT T2._Fld25931RRef AS Fld25931RRef, CAST (SUM (T2._Fld25936) AS NUMERIC (38, 8)) AS Fld25936Turnover_, CAST (SUM) Fld25931RRef AST. ._AccumRgTn25938 T2 WH ERE ((T2._Fld949 = @ P1)) ȘI ((T2._Fld25936 @ P2 SAU T2._Fld25937 @ P3)) GROUP BY T2._Fld25931RRef SAVING (T2._Fld25936 @ P2 SAU T2._Fld25937 @ P3)) 38, 8))) 0,0 SAU (CAST (SUMA (T2._Fld25937) CA NUMERIC (38, 8))) 0,0) T1 >>>>

Se vede că nu arată ca SQL, deoarece există o subinterogare, grupare. Tabelele virtuale, în mare, sunt „zahăr sintactic”, adică sunt create, în general, pentru comoditatea dezvoltării interogărilor, astfel încât interogările să fie mai compacte și mai lizibile.

Doar registrele au tabele virtuale, dar care tabele virtuale sunt disponibile dintr-un registru pot fi văzute în designerul de interogări.



Când utilizați tabele virtuale, trebuie să oferiți întotdeauna o condiție de selecție. În caz contrar, pot apărea probleme de performanță.



În textul cererii, arată astfel:

Registrul de acumulare.Registrul de pasive.Turns (, Operațiune = & Operațiune) AS Obligații RegisterVooms

Pentru comoditate, scrierea de interogări, adică crearea de texte de interogare, în 1C există un constructor care poate fi apelat prin meniul contextual (clic dreapta):



În Query Designer, puteți vedea o listă completă a funcțiilor și operatorilor acceptați ai limbajului de interogare.


Generatorul de interogări este un instrument vizual foarte flexibil pentru a crea interogări de orice complexitate. Este disponibil doar în modul configurator. În modul Enterprise există așa-numita „Consola de interogări” - aceasta este prelucrare externă furnizate pe discul ITS. Pentru o aplicație gestionată, Query Console poate fi descărcată de pe its.1c.ru.

Descrierea muncii în designerul de interogări depășește domeniul de aplicare al acestui articol, prin urmare nu va fi luată în considerare în detaliu.

Motive pentru performanța suboptimă a interogărilor

Mai jos este o listă a principalelor motive (dar nu toate) care duc la o execuție mai lentă a interogărilor.

  • Utilizarea îmbinărilor cu subinterogări

Nu este recomandat să se alăture cu subinterogări; subinterogările trebuie înlocuite cu tabele temporare. Conectarea subinterogărilor poate duce la o pierdere semnificativă a performanței, în timp ce execuția unei interogări pe diferite SGBD-uri poate varia semnificativ în viteză. Viteza de execuție a unor astfel de interogări este, de asemenea, sensibilă la statisticile din SGBD. Motivul acestui comportament este că optimizatorul DBMS nu poate determina întotdeauna corect planul optim de execuție a interogării, deoarece optimizatorul nu știe nimic despre câte rânduri va returna subinterogarea după execuția sa.

  • Utilizarea tabelelor virtuale în îmbinările de interogare

Tabelele virtuale la nivel DBMS sunt executate ca subinterogări, deci motivele sunt aceleași ca în primul paragraf.

  • Utilizarea condițiilor de interogare care nu se potrivesc cu indecșii existenți

Dacă în condițiile de interogare (în operator UNDE sau în condițiile unui tabel virtual) sunt utilizate câmpuri care nu sunt toate incluse în index, cererea dată va fi executat cu folosind SQL scanare de tabel sau constructe de scanare index (în întregime sau parțial). Acest lucru va afecta nu numai timpul de execuție al interogării, ci și blocările S excesive vor fi impuse pe rândurile suplimentare, ceea ce, la rândul său, poate duce la escaladarea blocărilor, adică întregul tabel va fi blocat.

  • Utilizarea SAU în condiții de interogare

Utilizare operator logic SAU in constructie UNDE poate duce, de asemenea, la o scanare a tabelului. Acest lucru se datorează faptului că SGBD nu poate utiliza corect indexul. In loc de SAU puteți aplica construcția COMBINA TOATE.

  • Obținerea datelor printr-un punct pentru câmpuri de tip complex

Nu este recomandat să obțineți valori printr-un punct (în construcție ALEGE UNDE), deoarece dacă atributul obiectului se dovedește a fi un tip compus, îmbinarea va avea loc cu fiecare tabel din acest tip compus. Ca rezultat, interogarea pe SGBD va fi semnificativ complicată; acest lucru poate împiedica optimizatorul să aleagă planul corect de execuție a interogării.



Ți-a plăcut articolul? Împărtășește-l