internetul Windows. Android

Cum să găsiți apariția unui simbol în linia 1c. Care este schema implementată de noi

În acest articol, vă voi spune despre funcția de căutare rapidă 1c Enterprise 8. Ce este o căutare rapidă? Foarte simplu. Căutarea rapidă este una dintre modalitățile de navigare în liste mari de înregistrări 1C. Acestea pot fi liste de documente, directoare, registre sunt tot ceea ce este reprezentat de tabele.

Ce este o căutare rapidă?

Funcția de căutare rapidă din documentele 1c Enterprise este extrem de convenabilă și vă permite să nu derulați prin intermediul unor matrice de date uriașe (de exemplu, utilizând bara de defilare) și accesați imediat locația dorită din listă. Din păcate, utilizatorii de novici de 1C întreprindere 8 (inclusiv 1c contabilitate 8) inițial nu utilizează capacitatea de a căuta rapid, preferând să răsturneze manual listele de documente (și pot fi foarte mare). Acest articol vă va ajuta să vă ocupați de utilizarea unei căutări rapide în 1C.

În primul rând, trebuie remarcat faptul că în configurațiile întreprinderii 1c 8 construite pe forme gestionate, lucrări de căutare rapide altfel decât în versiunile anterioare 1c. Prin urmare, vom analiza separat utilizarea de căutare rapidă în gestionat Formas. și în obișnuit.

Căutare rapidă în contabilitatea 1c 8.2

În versiuni ale contabilității 1c de la 8,0 la 8.2 Funcția este destinată tranziție La partea dorită a listei. De exemplu, uitați-vă la fereastra planului de cont afișată în figură.


Fereastra a subliniat un rând. Acordați atenție triunghiului neautorizat de la benzile la care indică săgeata roșie. Ca și în alte programe Windows, unde există liste (de exemplu, în dirijor), poziția acestui marker (triunghi) determină sortarea listei ca întreg - În ce coloană este instalată marcajul, pe aceeași și întreaga listă va fi sortată. În figură, marcajul este în coloana de cod, prin urmare, factura de cont va fi sortată prin cod.

Markerul poate fi mutat de la o coloană la alta, stângace pe coloana dorită ( pe coloana de rubrică!) Șoarece. Dacă marcajul este deja în coloana curentă, atunci clicul va duce la o schimbare în direcția de sortare la opusul (adică, de la mai mult la un mai mic sau invers). Acesta este un comportament standard pentru orice programe Windows.. Care este caracteristica acestui marker în întreprinderea 1C și cum este legată de căutarea rapidă?

Căutarea rapidă în listele 1C Enterprise 8 este realizată de coloană în care markerul este în picioare. În acest caz, căutarea rapidă în planul de cont va fi realizată prin codul coloanei.

Aici era o parte importantă Articole, dar fără JavaScript nu este vizibil!

Cum să vă bucurați de căutarea rapidă în 1c? Uşor! Începeți să imprimați ce doriți să găsiți în această coloană.. Unde există un marker. În exemplul, în figura de mai sus, trebuie să introduceți numărul contului. De exemplu, doriți să găsiți un scor de 50 de casier. În acest caz, introduceți ( mouse Faceți clic pe nicăieri!) Numărul 50 de la tastatură și dacă în această coloană există un cont cu același număr (și este, desigur, este), apoi lista derulează la această linie, iar șirul însuși va fi dedicat. Rezultatul este afișat în ecranul planului de cont de mai jos.

site-ul web

Textul pe care indică săgeata, nu trebuie să mă spăl - El va dispărea.

Dacă începeți să introduceți cuvântul "bilet" în exemplul de mai sus, textul din partea de jos a ferestrei va fi introdus și apoi stivuit. Se întâmplă deoarece, de îndată ce start Șirul de căutare rapid introdus încetează să se potrivească cu începutul cel puțin unei linii din această coloană, 1C întreprindere concluzionează că linia dorită nu se găsește și o șterge automat. Cu privire la ar trebui să vă amintiți două reguli.

În 1C Enterprise 8 Căutarea rapidă se face la începutul liniei, adică. Coloana este căutată pentru o coincidență a textului de intrare cu începutul uneia dintre rândurile acestei coloane.
Aceasta implică o recomandare importantă: la introducerea datelor la cărți de referință, apelați elementele astfel încât să fie convenabil să căutați cu Căutare rapidă. De exemplu, numele contrapartidei este mai bine să scrieți ca "NAMEFIRMA LLC" decât "LLC NAMEFIRMA. Și chiar mai mult, nu ar trebui să utilizați citate și alte caractere inutile în nume (vorbim despre umplerea numelui în forme).

Dacă ați început să introduceți text, și este șters - ceea ce căutați lipsesc în această coloană! În acest caz, verificați limba de introducere, precum și coloana în care se efectuează o căutare rapidă. O eroare tipică - nu coloana este selectată. De exemplu, markerul este instalat în coloana de cod, iar căutarea este făcută de numele contului.

Căutare rapidă în 1c Contabilitate 8.3

Acum, să vedem care este diferența dintre o căutare rapidă în versiunea 1c Enterprise 8.3. Utilizarea este în mare parte similară cu versiunea 8.2, dar există o diferență semnificativă care ar trebui să fie amintită.

În contabilitatea 1c 8.3, precum și în orice alte configurații pe formele gestionate (cel noua interfață) Funcționează ca filtru. Pur și simplu puneți, ca urmare a unei funcții de căutare rapidă, o parte a listei ascunzând..

Cum să-l folosești, vă vom da seama cu dvs. acum. Pentru a începe, uitați-vă la captura de ecran a planului de cont Contabilitate 1C 8.3, care este redus mai jos.

site-ul web

După cum puteți vedea, același marker într-una din coloane. Căutarea este de asemenea realizată de coloana în care este instalat markerul. Totul rămâne neschimbat. Cu toate acestea, dacă începeți să introduceți textul (în exemplul, numărul contului), atunci vor apărea următoarele.

site-ul web

După cum puteți vedea, caseta de căutare a fost deschisă automat. Aceeași fereastră se va deschide dacă faceți clic pe butonul de căutare din bara de instrumente Fereastră (în figura este subliniată). Ca rezultat, când faceți clic în fereastra de căutare, găsiți Găsirea (în imagine este ascunsă în spatele meniului derulant) sau trebuie doar să introduceți, apoi obțineți următorul rezultat.

site-ul web

Se pare ca căutarea rapidă în contabilitatea 1c 8.3 Lasă doar partea vizibilă a listei care satisface condițiile de căutare. În acest caz, butonul de găsire dispare și, în schimb, apare o lentilă cu o cruce (în figura stresată), când faceți clic pe care se întoarce lista la starea inițială (Acest lucru rămâne evidențiat un șir găsit ca urmare a căutării rapide).

O altă caracteristică importantă a căutării rapide în contabilitatea 1C 8.3 - Coincidența nu caută în partea de sus a liniei, ca în versiunea 8.2, dar este o căutare pentru o coincidență cu orice parte a rândurilor din coloană. Astfel, dacă contrapartida se numește "Ltd.phirma LLC", și când căutați să începeți să introduceți "NameFirma LLC", atunci va fi încă un șir!

Desăvârșim concluzii

Astfel, o căutare rapidă în contabilitatea 1c 8.2 și versiunile anterioare este destinată să derulați lista pe linia dorită și în contabilitatea 1c 8.3 Căutarea rapidă funcționează ca un filtru obișnuit, ascunzând o parte inutilă a listei.

Notele principale din partea Zasitorică

02/07/2013 Cautare de blocare

Implementat în versiunea 8.3.3.641.

Am îmbunătățit serios intrarea pe linie. Pentru a face acest lucru, a trebuit să implementăm un nou mecanism de căutare puternic în câmpul de introducere. Acum poate lucra rapid la milioane de înregistrări conținute în baza de date.

Am analizat sarcinile căutării de la utilizatori. A efectuat un audit al mecanismelor din platforma care utilizează algoritmi de căutare diferiți. Ca urmare, introducerea liniei dobândite noi oportunități calitative.

Utilizatorii pot căuta acum oriunde în nume, și nu numai la începutul liniei. Acestea pot folosi căutarea de text integral și chiar efectuați căutarea folosind o sarcină de fundal. Pentru ca căutarea de text integrală să funcționeze eficient la intrarea în linie, am optimizat suplimentar acest mecanism de căutare și am crescut performanța acestuia.

Toate proprietățile noi care vă permit să configurați intrarea pe linie, am colectat pe un marcaj separat fereastra pentru editarea obiectului de configurare:

De exemplu, puteți specifica că căutarea va fi efectuată oriunde în linie și nu numai la început:

Apoi, utilizatorul poate recruta orice fragmente de cuvinte, și nu doar simbolurile din care începe șirul căutat:

Utilizarea căutării cu textul complet la introducerea liniei este activată de o proprietate separată:

Utilizând căutarea cu textul integral, utilizatorii pot între volumul mare de date pentru a găsi rapid date adecvate despre oricare dintre cuvintele conținute, de exemplu, în numele:

De asemenea, pot căuta mai multe cuvinte celebre. Cuvintele neterminate vor fi completate automat de posibilele combinații:

Dacă datele sunt minunate, atunci în ambele cazuri puteți specifica că căutarea trebuie efectuată utilizând lucrarea de fundal:

Apoi, lângă câmpul de introducere, o imagine animată va fi afișată pentru utilizatori, similară cu o imagine, care este afișată când este afișat raportul:

  • dacă în obiectul care este utilizat în câmpul de introducere nu este de așteptat la cantități mari de date, vă sfătuim să activați căutarea șirului oriunde;
  • dacă obiectul este planificat un numar mare de Datele apoi:
    • vă sfătuim să includeți căutarea de text și fundal;
    • În același timp, puteți utiliza, de asemenea, căutarea unui șir oriunde, dar împreună cu căutarea de fundal și, de preferință, cu căutări text integral; La majoritatea căutărilor efectuate printr-o căutare de text integral.

Toate proprietățile enumerate puteți, dacă este necesar, puteți suprascrie în procesul de efectuare a unei soluții aplicate.

Pe client - în clientul de introducere a evenimentelor de intrare a clientului Auto) și Executive Exquisites :

Pe server - în modulul manager al managerului, în care se efectuează căutarea. În manipulatorul de evenimente Procedură :

În mod natural, în acest loc, pe server, este imposibil să suprascrie metoda de căutare "Direct" sau "Alocarea de fundal" . Deoarece executarea codului este deja transferată pe server.

Rând - unul de tipuri primitive Datele în sisteme 1C: Enterprise 8. Variabile cu tip linia conțin text.

Valori ale variabilelor de tip liniaÎnchis în citate duble. Mai multe variabile acest tip pot fi pliate.

Per1 \u003d "cuvânt 1";
Per2 \u003d "cuvânt 2";
Per3 \u003d per1 + "" + per2;

În cele din urmă Per3. va fi important Cuvânt 1 cuvânt 2 ".

În plus, în sisteme 1C: Enterprise 8 oferă funcții pentru lucrul cu linii. Luați în considerare principalul:

Intră (<Строка>, <Подсказка>, <Длина>, <Многострочность>) — funcția este concepută pentru a emite o casetă de dialog în care utilizatorul poate specifica valoarea tipul variabil Linia. Parametru <Строка> este obligatoriu și conține numele variabilei în care va fi înregistrat șirul introdus. Parametru <Подсказка> opțional este caseta de dialog Titlu. Parametru <Длина> opțional, spectacole lungime maxima Au intrat în liniile. Implicit este zero, ceea ce înseamnă o lungime nelimitată. Parametru <Многострочность> Opțional. Specifică modul de intrare text cu mai multe linii: Adevăr - introduceți textul multi-line cu separatoare de linii; Lie - Introduceți o linie simplă.

Șirul poate fi introdus și, cunoscând codul de simbol în enicode codificarea:

Simbol(<КодСимвола>) — codul este introdus ca număr.

Litera \u003d simbol (1103); // I.

Există, de asemenea, o funcție inversă care vă permite să aflați codul oricărui simbol.

Codeimvol (<Строка>, <НомерСимвола>) — returnează numărul simbolului specificat în codarea Unicode sub forma unui număr.

Funcțiile de conversie a înregistrării textului:

VREGA (<Строка>) - Convertește toate caracterele șirului în registrul de sus.

NREGA (<Строка>) - Convertește toate caracterele șirului la literele mici.

Trega (<Строка>) - Convertește toate simbolurile șirului în registrul titlului. Adică primele litere din toate cuvintele sunt convertite în majuscule, iar literele rămase din cea inferioară.

Căutați și înlocuiți caracterele din șir:

A găsi(<Строка>, <ПодстрокаПоиска>) - Găsiți numărul de caractere al căutării unui substring de căutare. De exemplu:

Găsiți ("șir", "Oka"); // patru.

STRNET.<Строка>, <ПодстрокаПоиска>, <НаправлениеПоиска>, <НачальнаяПозиция>, <НомерВхождения>) - Găsirea numărului de caractere al căutării substringului de căutare, numărul de intrare este indicat în parametrul corespunzător. În acest caz, căutarea începe cu un simbol al cărui număr este specificat în parametru Instalare.Căutarea este posibilă de la început sau de la sfârșitul liniei. De exemplu:

Număr de intrare \u003d STRNET ( "Moarte", "O", direcție. În primul rând, 1, 4); // 7.

Strună (<Строка>, <ПодстрокаПоиска>, <ПодстрокаЗамены>) - găsește în linia originală toate intrările de substring de căutare și îl înlocuiește cu înlocuirea înlocuirii.

RUST ("String", "Oka", ""); // Pagina.

Linia goală (<Строка>) - verifică șirul pentru prezența unor caractere semnificative. Dacă nu există caractere semnificative sau nu există caractere, atunci valoarea este returnată Adevărat. In caz contrar - Fals.

Strirling (<Строка>, <ПодстрокаПоиска>) - Calculează numărul de apariții ale subsolitului de căutare în linia sursă.

Strirling ( "Studiați, studiați și studiați din nou", "a studia" , "" ) ; // 3.

Strarb (<Строка>, <ЗначениеПодстановки1>…<ЗначениеПодстановкиN> — solicită parametrii din șir. Șirul trebuie să conțină forme de substituție: "% 1 ..% n". Markerii de numerotare începe cu 1. Dacă valoarea parametrului Nedefinit, Stringul gol este substituit.

Strarb ( "Parametrul 1 \u003d% 1, parametrul 2 \u003d% 2", "1" , "2" ) ; // parametrul 1 \u003d 1, parametrul 2 \u003d 2

Funcții de conversie a rândului:

Un leu(<Строка>, <ЧислоСимволов>) - Returnează primele personaje de primă șir.

Drepturi (<Строка>, <ЧислоСимволов>) - Returnează cele mai recente caractere de șir.

Medii (<Строка>, <НачальныйНомер>, <ЧислоСимволов>) - Returnează un șir în lungime în<ЧислоСимволов>Începând cu simbolul<НачальныйНомер>.

Sokrel (<Строка>) Se taie din caractere nesemnificative în partea stângă a primului simbol de semnificație din rând.

Copp (<Строка>) - taie din caractere nesemnificative în partea dreaptă a ultimului simbol semnificativ din șir.

Sokrlp (<Строка>) - taie din caractere nesemnificative în partea stângă a primului simbol de semnificație din rând și la dreapta ultimului simbol semnificativ din rând.

Plotchikstka (<Строка>, <НомерСтроки>) - obține un șir de un șir multi-linie după număr.

Alte caracteristici:

STRDLIN (<Строка>) - Returnează numărul de caractere din șir.

Strokelost (<Строка>) - Returnează numărul de rânduri într-un șir multi-linie. Șirul este considerat nou dacă este separat de simbolul de traducere a rândului anterior.

Stresh (<Строка1>, <Строка2> ) - Compară două linii fără a se înregistra. Funcția funcționează în mod similar cu obiectul Comparaţie. Se intoarce:

  • 1 - Dacă prima linie este mai mare decât cea de-a doua
  • -1 - dacă a doua linie este mai mare decât prima
  • 0 - Dacă rândurile sunt egale

Grevă ("primul rând", "al doilea șir"); // unu

Numele meu este Pavel Barkets, lucrez la SoftPoint. De mai bine de 10 ani am rezolvat sarcini de optimizare a performanței. Și în ciuda numărului mare de probleme rezolvate, numărul lor nu este redus, dar crește în progresie geometrică. Volumele de date Creșterea și sarcinile pentru optimizarea lucrărilor cu aceste date sunt complicate. Acest proces este inevitabil.

Subiect de articol - abordările netriviale ale optimizării. O sa fie luat in considerare două aspecte:

  • Primul - căutați stres. Utilizatorii o folosesc adesea, iar mulți, probabil, au întâlnit deja o așteptare semnificativă, căutarea substringului nu este suficient de efectuată.
  • Al doilea - realizarea documentelor mari, cum ar fi închiderea lunii, calculul costului. Desigur, mulți au întâlnit faptul că contabilii cheltuiesc aceste documente timp de 5-9 ore, noaptea și nu timp. Cel mai interesant lucru este că metodele clasice de optimizare nu vă ajută întotdeauna. Dacă, atunci când conduceți astfel de documente, rulați în măsurarea măsurării debuggerului, va vedea acest lucru cel mai mare număr Timpul este cheltuit pentru a scrie structurile temporare sau reale - tabele, registre etc. Și este imposibil să rezolvăm această sarcină cu metode clasice.

Căutați stres

Primul subiect - Căutați stres. În acest an am venit de mai multe ori cu probleme la această operațiune. Veniți la compania de asigurări pentru extinderea politicii, vă este oferit să găsiți la numărul de telefon. Este clar că nu este căutare clasică. Pe numărul total al telefonului, deoarece utilizatorul ar putea avea un număr peste opt, prin cele șapte sau cumva, prin urmare, caută numere ale camerei. În acest caz, se utilizează operațiuni de căutare pe termen lung - într-o serie de situații, întârzierea poate fi câteva secunde și poate veni până la câteva minute.

Căutați caractere inițiale

Voi începe cu primul exemplu atunci când căutarea este efectuată utilizând caractere inițiale. Acesta este un caz special de găsire a unui substring atunci când utilizatorul știe exact că valoarea dorită începe cu anumite caractere.

Căutarea caracterelor inițiale este implementată în 1c utilizând echipa ca (sau într-o versiune în limba engleză, cum ar fi), indicând valoarea cu "%" la sfârșit ("%" desemnează o secvență de orice alte caractere). De exemplu, căutăm:

Numele ca "Ivano%"

Rețineți că dacă aveți un index în acest domeniu în sistem, atunci căutarea indexului va fi utilizată în interogarea SQL - Aceasta este o căutare după index.

Condiția "ca bara de căutare" este echivalentă cu căutarea în intervalul de valori. Într-un caz particular, când căutăm "Ivano%" - aceasta este echivalentă cu căutarea în gama de nume de familie, care începe la "Ivano", și, terminând cu "Ivanp" (deoarece simbolul "P" merge după Simbolul "O").

Optimizatorii moderni convertesc în mod independent cum ar fi solicitarea de căutare a cererii de interogare. Prin urmare, dacă aveți un index în acest domeniu în sistem, veți primi un astfel de rezultat atunci când interpretați interogarea în termeni de condiții SQL - optimizatorul va trimite o cerere de la cum ar fi sub forma unei căutări după gama.

Astfel, puteți exercita o căutare rapidă clasică utilizând un index (căutați index). Nu există probleme cu acest lucru sau să le rezolvăm într-un mod simplu.

Căutați introducerea

Acum, luați un exemplu mai complicat atunci când este necunoscut, în care locația liniei este valoarea dorită și o căutare pentru intrarea rândului este implementată. În acest caz, în interogarea "ca" "%" se află pe ambele părți.

Când convertiți o astfel de interogare în SQL, vedem că numai schimbările de comandă (în valoare există deja două "%").

Luați în considerare detaliile planului de execuție. Aici vedem același index, dar în acest caz nu funcționează eficient.

Faptul este că indicele pe numele cărții de referință, pe care îl considerăm, constă în mai multe domenii.

  • Primul dintre ele este separatorul contabil.
  • Mai mult merge direct câmpul de căutare.

Și, prin urmare, când "căutarea indexului" este afișată în termeni de execuție, înseamnă asta căutarea se face în primul câmp de separator - pe diapozitivul de mai sus puteți vedea asta căutarea în valoarea descrisă dorită nu este absolut utilizată.

Ce să faci în această situație? Am avut foarte des în practică că utilizatorii au interzis utilizarea cererilor de intrare. Și utilizatorii din unele cazuri înșiși nu au folosit această funcție, deoarece timpul de execuție este foarte semnificativ și trebuie să continuați să lucrați. Prin urmare, au trebuit să fie răsucite în alte moduri - au ales în listele, au încercat să găsească pe primele personaje și așa mai departe.

Dar acest lucru duce la nemulțumire față de funcționalitatea și percepția necorespunzătoare a sistemului. Utilizatorul înțelege că sistemul nu poate face față unui lucru și nu funcționează așa cum ar trebui să fie. Nu este corect.

Abordarea nontrivială pentru rezolvarea sarcinii de a găsi un substring

Să luăm în considerare acum abordarea nontrivială pentru rezolvarea acestei sarcini.

Denotă de o serie de toleranțe:

  • În primul rând - de la modern discurile au o dimensiune nelimitată, Să presupunem că spațiul de pe disc pe care îl puteți folosi, aveți destul de mare.
  • Al doilea - utilizatorul caută niciun simboluri, ci pentru un fragment. De exemplu, niciunul dintre noi nu caută "Al" - este o selectivitate prea mică. Căutând o secvență semnificativă de caractere. Aici am ales căutarea a șase simboluri.

Un exemplu de linie dorită "Alexe" a fost înregistrată în formă și ar fi testată cu ea.

  • Să presupunem că avem un domeniu cu numele, numele și patronimic al clientului. Primul pas, am stabilit automat această valoare fragmentelor de șase simboluri cu o schimbare "1"Și obținem o serie de fragmente (vezi mai sus), care aparțin întotdeauna valorii dorite. Avem fragmente care pot intra teoretic la utilizator. Și anume, în trecut, diapozitivul a determinat că căutăm șase caractere. Pot exista cinci dintre ele și patru, doar dimensiunea structurii va fi mai mult.

  • În al doilea pas, noi noi scriem aceste seturi într-o structură separată (Acesta poate fi un tabel, un registru de informații etc.) și obțineți un eșantion în care un anumit fragment aparține valorilor diferite.

  • Și în al treilea pas, noi, atunci când căutăm un substring la proiectarea cererii 1C, adăugați o condiție suplimentară "și", care filtrează numărul de combinații posibile și scoateți din această structură suplimentară (acesta poate fi registrul de informații ) toate elementele la care se găsesc fragmentele necesare.

De exemplu, utilizatorul caută un client cu numele de familie "soldați". Aceasta este opt caractere, înseamnă că vor exista trei fragmente în șase caractere, pe care le căutăm în structura serviciului. Apoi, combinați totul în interogare. Astfel, se obține filtrarea suplimentară.

Ca rezultat, vom scăpa de semnul "%" (adică, în fața acestor fragmente, simbolul de care avem nevoie va fi întotdeauna), iar atunci când efectuați o cerere internă va fi un index caută, pentru care am luptat.

În practică, se pare o poveste foarte interesantă - accelerarea în zeci, sute de ori. Mai mult, toate acestea se pot face cu mijloacele 1C, care este foarte frumos. Nu va trebui să rescrieți logica, utilizatorul se va bucura că interogarea de căutare accelerată. În exemplul, accelerația de la 4 secunde la 0,05 secunde, și dacă inițial am avut o cerere de două minute, ar fi fost executată mai puțin de o secundă.

Mecanismul pe care l-am arătat nu este un exemplu experimental, lucrează deja pentru clienții reali.

Activități pregătitoare

Acum vă voi spune despre activitățile pregătitoare.

  • Primul este necesar să se umple valorile inițiale ale înregistrării.. Pentru a face acest lucru, trebuie să programați fereastra de reglementare.
  • Apoi, trebuie să respectăm consistența datelor - acest lucru înseamnă trebuie să existe un abonament pentru a schimba valoareaAstfel încât aceste fragmente să fie reconstruite automat.
  • Și ultima - adăugați un formular de căutare standard.

Umplerea registrului se poate face atât prin 1c, cât și cu SQL.

Pot spune că umplerea unei astfel de structuri pentru 17 milioane de valori ocupă undeva 20-25 de minute. În mod natural, utilizatorii din acest moment nu ar trebui să schimbe valorile directorului.

Dacă vom calcula pentru un milion de valori de undeva 100 de caractere de 6 în fragment, se va dovedi undeva 4,7 GB. Trebuie să planificați astfel încât locul pe care îl aveți. Dacă aveți în directorul dvs., de exemplu, 100 de milioane de valori, atunci trebuie să programați un loc care va fi disponibil pe disc.

Necesitatea de a ține seama de statisticile privind popularitatea fragmentelor

Această metodă funcționează întotdeauna rapid?

Acest lucru este influențat statistici ale fragmentelor de popularitate.

  • De exemplu, aveți un fragment "Alex", care poate intra în numele lui Alexey, la numele de mijloc Alekseevich, în numele lui Alekseenko, etc. Acest fragment poate fi de 50-100 mii de intrări.
  • Și există fragmente rareori folosite.

Astfel, apar statistici ale popularității în fragmente.

Rețineți că dacă popularitatea fragmentelor este scăzută (100 de elemente), atunci primim accelerație - 0,1 secundă.

Dacă substringul este destul de popular (50 de mii de elemente), atunci obținem degradareaȘi mult mai mare decât dacă nu a existat o optimizare.

În acest fel, este necesar să se facă o schemă îmbunătățită de execuție a interogăriiîn care am fi primit mai întâi valoarea popularității subquerice. Acest lucru se face cu trei cinci linii în 1c. În același timp, știm exact că, dacă șirul este nepopular, atunci merge în prima ramură și, dacă este popular, apoi pe al doilea.

Cum funcționează accelerația? Căutarea căutării de la formular este în curs de desfășurare, apoi facem apel la înregistrarea informațiilor cu statistici, obținem un element și alegem în continuare ce să utilizați este o interogare clasică sau accelerată.

Și acum să ne uităm la modul în care solicitarea SQL este efectuată pe serverul SQL.

Slide prezintă o schemă simplificată:

  • solicitați optimizatorului;
  • ne uităm la statisticile pe teren care sunt utilizate în cerere;
  • alegem ce plan de executare de utilizat, adică selectați strategia de execuție a interogării (de exemplu, ciclul investit).

Care este schema implementată de noi?

  • Am făcut propria ta index. Nu este un indice standard SQL, nu index 1c, ci indexul său necesar pentru a rezolva această problemă;
  • Mai mult, sa ciocnit cu ceea ce are nevoie de propria lor statistici;
  • Și aveți nevoie de propria voastră optimizer.care, conform acestei statistici, decide ce fir să aleagă.

Pe baza acestei logici, se poate spune că acest proces dezvăluie semnificația a ceea ce indicii, statisticile și optimizatorul sunt pentru noi.

Cine nu știa ce să servească statistici în SQL, uită-te la această logică și vei înțelege că, dacă este greșit sau irelevant, atunci vom merge pe o ramură greșită. Interogarea va încetini. Înțelegem cum să servim calitativ și corect statisticile - aceasta afectează productivitatea, pe index.

Dacă nu există index - vom scana toate valorile.

Astfel, am creat cel puțin primitiv, dar optimizatorul tău. Putem spune că au urmărit "pe degete" cum face doamna SQL și alte DBM-uri și creând propriile structuri.

Accelerarea documentelor "mari"

Voi merge la al doilea subiect - accelerarea documentelor mari.

Suntem adesea confruntați cu unele proceduri de reglementare ca: închiderea lunii, raportul agentului, calculul costului. Aceste documente grele și masive sunt efectuate și se completează o cantitate considerabilă de timp. Și când ne uităm la debugger și facem următorul operațiuni, vedem asta Linia 1c introduce valorile într-o anumită masă și timpul principal se datorează acestuia.. Și este imposibil să faci nimic despre asta. Singura recomandare care poate fi oferită este să accelereze discul (eficacitatea acestei soluții este foarte dubioasă și necesită o analiză preliminară).

Propun să mă întorc la poveste și să ia în considerare cum sa făcut în 1c, Începând de la 8,0 la 8,3 - acest lucru a fost făcut după linie. Serverul SQL a analizat cererea de fiecare dată, a procesat-o, a creat planul de execuție, adăugat, a trimis comanda la 1c de succes și a primit următoarea solicitare. Și un astfel de pas cu pas a mers de la serverul de aplicații 1c la MS SQL.

Este clar că, dacă aveți 40 de înregistrări în document, nu ar trebui să existe probleme. Dacă aveți 10 mii și mai multe înregistrări (există organizații în cazul în care în documentele de reglementare, un milion de înregistrări), atunci acest proces durează foarte mult timp. O intrare este procesată foarte repede, dar în document sunt prea multe. Ce sunt deasupra capului? În rețea, pe execuția interogării, la semnalul de returnare, la procesarea acestui semnal în sistemul 1C, suma celor patru etape. Toate etapele sunt rezumate, multiplicate cu un milion de linii, iar așteptările noastre de lungă durată sunt obținute. Este clar că nu este teribil.

În 1c, începând cu 8,3, se fac îmbunătățiri. Acum, cererea de inserare în tabele temporare și în registrele de informații este pregătită pe serverul SQL și execuția sa suplimentară are loc cu ajutorul apelurilor clasice RPC, unde furnizorul de acces 1C în sine (nativ sau Ole DB) înregistrează și le inserează prin Năre (de obicei 100 de linii).

Astfel, o accelerație este realizată de la 30% la 300%. Dar nu este încă suficient, pentru că astăzi aveți 10 mii de linii, mâine este de 20 de mii de linii. Aceasta nu este o soluție fundamentală a problemei, încă o întâlnești, dar doar șase luni / an.

Ce cel mai rapid insetat în serverul SQL și într-adevăr în orice DBMS?

aceasta Inserție în vrac.. În inserția 1C este utilizată, dar pentru alte sarcini. Lucrul cu documentele "mari" ar dori, de asemenea, să accelereze prin consolidarea inserțiilor de inserții și adăugarea de intrări cu o singură matrice în baza de date SQL Server.

Să vedem ce efect este atins. În acest exemplu primit accelerația undeva de 5 ori, dar puteți accelera și de 10 ori. Teoretic, principala problemă, astfel încât accelerează este mult mai puternică - aceasta este viteza discului. Discul poate fi un blocaj.

De asemenea este important să vă amintiți despre un astfel de criteriu ca indexuri.. Dacă am fost introduse de introducerea în vrac în tabel fără a actualiza indexurile, am fi primit o accelerație semnificativă (rezultatul este mai mic de o secundă). Aici obținem 69 de secunde datorită faptului că fiecare inserție din tabel necesită indicele de reîmprospătare.

În orice caz, această metodă permite realizarea unui efect de 5-10 ori.

În plus, astfel de oportunități nu sunt considerate aici ca partiționarea, partiționarea. Ar fi posibil să se îmbunătățească situația dacă am știut că inserția în vrac a fost introdusă în perioada curentă și am scos partiția irelevantă la o altă partiție. Ar fi chiar mai mare efect. Se pare că accelerația este foarte bună.

Opțiunile de optimizare sunt nesfârșite

În acest fel, opțiunile de optimizare sunt nesfârșite. Singurul lucru nu este de a vă implica. Înainte de optimizare, întotdeauna are sens să se calculeze dacă fie efectul dorit va fi fie. De asemenea, aș sfătui în anumite situații de a "ridica" asupra problemei, nu folosesc metode clasice pentru optimizarea cererii și unele complet diferite, care pot aduce un rezultat mai semnificativ.

****************

Acest articol este scris în conformitate cu raportul raportului () Citiți la Conferința comunitară a evenimentului InfoStart 2017.