Abfrageoptimierung. Abfrageoptimierung. Einrichten von Indizes mithilfe von Standardplattformtools

Senden Sie diesen Artikel an meine E-Mail

In diesem Artikel schauen wir uns an, wie man Gehälter in 1C ZUP für Mitarbeiter einer Organisation indexiert. Geleitet von Artikel 134 des Arbeitsgesetzbuchs der Russischen Föderation, der besagt, dass der Arbeitgeber den Arbeitnehmern eine Gehaltserhöhung gewähren muss, da die Kosten für Waren und Dienstleistungen regelmäßig steigen. Wenn die Organisation aus dem Haushalt finanziert wird, erfolgt die Indexierung auch gemäß dem Arbeitsgesetzbuch der Russischen Föderation, verschiedenen Gesetzen oder einem Tarifvertrag.

Unter Lohnindexierung ist zunächst eine Erhöhung der Tarifsätze zu verstehen – Gehälter, sowohl für das gesamte Unternehmen als auch für seine einzelnen Abteilungen oder Zweigstellen. Der Wert des Koeffizienten wird künftig bei der Berechnung von Urlaub, Geschäftsreisen, Durchschnittsverdienst und anderen Fällen verwendet.

Um die Gehaltsindexierung in 1C ZUP durchzuführen, müssen Sie eine Reihe von Schritten im Programm ausführen. Als Erstes müssen Sie überprüfen, ob die erforderlichen Einstellungen vorgenommen wurden. Wählen Sie im Bereich „Einstellungen“ den Punkt „Gehaltsabrechnung“ aus. Es ist ein Kontrollkästchen erforderlich, das angibt, dass die Einnahmen in der Datenbank indexiert werden.

Sie sollten außerdem sicherstellen, dass Personalunterlagen geführt und die Historie gepflegt werden. Um die Verfügbarkeit dieser Optionen zu prüfen, müssen Sie den Punkt „Personalabrechnung“ auswählen und dem Link „Besetzungstabelle einrichten“ folgen.

Zur Indexierung im Programm gibt es ab Release 3.1.3 ein spezielles Dokument „Änderung der Besetzungstabelle“, das sich im Abschnitt „Personal“ befindet. Wir erstellen ein neues Dokument und tragen das Datum ein, ab dem die Änderungen und die Organisation wirksam werden. Um die Tabelle auszufüllen. Klicken Sie auf die Schaltfläche „Ändern“ und fügen Sie die erforderlichen Zeitplaneinheiten hinzu.

Wenn Sie rechts auf die Schaltfläche „Mehr“ klicken und „Angezeigte Indikatoren“ auswählen, können Sie mithilfe von Kontrollkästchen die Sichtbarkeit von Indikatoren steuern und nur diejenigen anzeigen, die im Dokument erforderlich sind. Klicken Sie anschließend auf die Schaltfläche „Indikatoren ausfüllen“ und stellen Sie im sich öffnenden Fenster den Koeffizienten für den Indikator „Gehalt“ auf 1,1 ein.

Nach der Bestätigung werden die Werte im Dokument für alle Zeilen unter Berücksichtigung dieses Koeffizienten neu berechnet. Durch Klicken auf den Link „Unterschriften“ am Ende des Dokuments können Sie den Leiter der Organisation und den Leiter der Personalabteilung angeben. Sie werden künftig in gedruckter Form einer Fahrplanänderungsanordnung angezeigt, die über die Schaltfläche „Änderungsanordnung anordnen“ ausgedruckt werden kann. Dann führen wir das Dokument durch.

Wenn Sie Fragen zum Thema Gehaltsindexierung in 1C ZUP haben, stellen Sie diese in den Kommentaren unter dem Artikel, unsere Spezialisten werden versuchen, sie zu beantworten.

Um die Tatsache einer Lohnerhöhung widerzuspiegeln, müssen Sie ein Dokument „Änderung der geplanten Rückstellungen“ erstellen, das sich im Abschnitt „Gehalt“ im Punkt „Änderung des Arbeitnehmerentgelts“ befindet. Da in unserem Beispiel die Änderungshistorie der Besetzungstabelle geführt wird, kann aus dem erstellten Dokument „Änderung der Besetzungstabelle“ über die entsprechende Schaltfläche das oben genannte Dokument erfasst werden.

Anschließend wird ein fertiges Dokument erstellt. Bitte beachten Sie, dass das Kontrollkästchen „Als Verdienstindexierung berücksichtigen“ aktiviert sein muss.

Dann führen wir das Dokument durch. Bei der Auszahlung des Gehalts für den nächsten Monat wird das Gehalt unter Berücksichtigung der Indexierung berechnet.

Team erfahrener 1C-Programmierer:

Von 5 Minuten Reaktionszeit bis hin zu dringenden Aufgaben, auch an Wochenenden und Feiertagen.

Über 30 Programmierer mit bis zu 20 Jahren Erfahrung in 1C.

Wir erstellen Videoanleitungen zu erledigten Aufgaben.

Live-Kommunikation über alle für den Kunden geeigneten Messenger

Überwachung der Erledigung Ihrer Aufgaben durch unsere speziell entwickelte Anwendung

Offizielle Partner der Firma 1C seit 2006.

Erfahrung mit erfolgreicher Automatisierung von Kleinbetrieben bis hin zu Großkonzernen.

99 % der Kunden sind mit den Ergebnissen zufrieden

Durch die richtige Verwendung von Indizes können Abfragen nicht nur um ein Vielfaches, sondern um das Hundertfache, manchmal sogar um das Tausendefache beschleunigt werden.

Eine solche Beschleunigung ist mit Hardware einfach nicht zu erreichen. Daher muss diesem Thema besondere Aufmerksamkeit gewidmet werden.

Um eine Abfrage zu beschleunigen, müssen Sie häufig einen eigenen Index erstellen. Dafür gibt es verschiedene Möglichkeiten.

In den Video-Tutorials werden wir uns verschiedene Möglichkeiten zum Erstellen eines Index ansehen. Wir werden auch eine Situation betrachten, in der ein Index der erforderlichen Zusammensetzung nicht mit Standard-Plattformtools erstellt werden kann und im DBMS erstellt werden muss.

Einrichten von Indizes mit Standard-Plattformtools

Die Lektion zeigt, welche Indizes tatsächlich für Objekte auf DBMS-Ebene erstellt werden.
Nicht alles in diesem Thema ist so offensichtlich, wie es auf den ersten Blick erscheinen mag. Schließlich gibt es für eine Reihe von Objekten Funktionen zum Erstellen von Indizes.
Alle Details schauen wir uns in diesem Video an.

Indizierung mit zusätzlicher Reihenfolge

Das Video zeigt den Unterschied zwischen der Indexkonstruktionsoption Index aus Index mit Zusatz Bestellung.
Das Beispiel zeigt, welche Art von Index die Plattform erstellt, wenn zusätzliche Reihenfolge verwendet wird.

Erstellen eines Index für Registerdimensionen

Die Indizierung der ersten Dimension von Registern weist mehrere Nuancen auf.
Das Video zeigt, welche Indizes für Registerdimensionen erstellt werden. Die Situation der Indizierung der ersten Registerdimension wird ebenfalls berücksichtigt.

Drucken (Strg+P)

„Ich habe dieses Material zur Prüfung und möglichen Diskussion zum Thema Abfrageoptimierung von der ITS-Festplatte kopiert https://its.1c.ru/db/metod8dev#content:5842:hdoc

Ich empfehle allen 1C-Programmierern, diesen Artikel sorgfältig zu lesen, da die Abfragesprache das Hauptwerkzeug der 1C-Plattform ist. Der Artikel liefert typische Gründe für eine suboptimale Abfrageleistung, die auf der Ebene des Konfigurationscodes diagnostiziert wird, und erörtert Techniken zur Abfrageoptimierung.

Die Hauptgründe für eine suboptimale Abfrageleistung

1. Verknüpfung mit Unterabfragen

Joins mit Unterabfragen sollten nicht verwendet werden. Es sollten nur Metadatenobjekte oder temporäre Tabellen miteinander verbunden werden. Wenn eine Abfrage Verknüpfungen mit Unterabfragen verwendet, sollte sie mithilfe von neu geschrieben werden temporäre Tabellen.

Ein Beispiel für eine suboptimale gefährliche Abfrage unter Verwendung eines Joins mit einer Unterabfrage auf der rechten Seite des Joins unter Verwendung einer Unterabfrage:

WÄHLEN . . . AUS Dokumentieren . Verkauf von Waren und Dienstleistungen LINKE VERBINDUNG ( WÄHLEN AUS Informationsregister . Grenzen WO . . . GRUPPE VON . . . ) VON . . .

Um eine Abfrage zu optimieren, sollten Sie sie in mehrere separate Abfragen aufteilen (entsprechend der Anzahl der in den Joins verwendeten Unterabfragen). Es wird empfohlen, diese Anfragen in einer Batch-Anfrage zu platzieren.

// Erstellen Sie einen temporären Tabellenmanager VT-Manager = Neu Stundenplan-Manager ; Anfrage = Neu Anfrage ; Anfrage . Stundenplan-Manager = VT-Manager ; // Batch-Anfragetext Anfrage . Text = " // Füllen Sie die temporäre Tabelle. Abfrage an das Limitregister. | WÄHLEN... | PUT-Limits | VON Informationsregister.Limits | WO... | GRUPPE NACH... | INDEX NACH...; // Führen Sie die Hauptabfrage mithilfe einer temporären Tabelle aus WÄHLEN... VON Dokument. Verkauf von Waren und Dienstleistungen LEFT JOIN-Grenzwerte VON...;" Aufmerksamkeit! In diesem Beispiel ist es sehr wichtig, die erstellte temporäre Tabelle zu indizieren.

Alle Felder, die in der Join-Bedingung verwendet werden, sollten als Indexfelder angegeben werden.

2. Verknüpfung mit virtuellen Tabellen Wenn die Abfrage eine Verbindung zu einer virtuellen Tabelle der 1C:Enterprise-Abfragesprache verwendet (z. B. „ RegisterAccumulations.Products.Remains()

„) und die Abfrage mit unbefriedigender Leistung ausgeführt wird, wird empfohlen, den Aufruf der virtuellen Tabelle in einer separaten Abfrage durchzuführen und die Ergebnisse in einer temporären Tabelle zu speichern. Das heißt, Sie sollten die gleiche Empfehlung verwenden wie beim Join mit einer Unterabfrage (siehe Punkt 1).

Tatsache ist, dass virtuelle Tabellen, die in der 1C:Enterprise-Abfragesprache verwendet werden, bei der Übersetzung in SQL in Unterabfragen erweitert werden können. Dies liegt daran, dass eine virtuelle Tabelle häufig (aber nicht immer) Daten von mehreren physischen DBMS-Tabellen empfängt. Wenn Sie einen Join mit einer virtuellen Tabelle verwenden, kann dieser auf SQL-Ebene in einigen Fällen als Join mit einer Unterabfrage implementiert werden. In diesem Fall kann der DBMS-Optimierer einen nicht optimalen Plan auswählen, genauso wie bei der Arbeit mit einer Unterabfrage, die explizit in der Sprache 1C:Enterprise verwendet wird.

3. Nichtübereinstimmung zwischen Indizes und Abfragebedingungen

  • Bedingungen werden in den folgenden Abschnitten der Anfrage verwendet:<условие>
  • WÄHLEN... VON... WO<условие>
  • VERBINDUNG...VON<ВиртуальнаяТаблица>(, <условие>)
  • AUSWÄHLEN... VON<условие>

HABEN

  • Für alle diese in der Abfrage verwendeten Bedingungen müssen geeignete Indizes vorhanden sein, um die Auswahl der Daten nach Bedingung zu optimieren. Darüber hinaus ist ein Index geeignet, der die folgenden Anforderungen erfüllt: Anforderung 1
  • . Der Index enthält alle in der Bedingung aufgeführten Felder; Erfordernis
  • 2. Diese Felder stehen ganz am Anfang des Index; Anforderung 3

. Diese Felder liegen in einer Reihe, d. h. Felder, die nicht an der Anforderungsbedingung beteiligt sind, werden nicht zwischen ihnen „eingeklemmt“.

  • Die wichtigsten von 1C:Enterprise erstellten Indizes: Index nach eindeutiger Kennung
  • (Link) für alle Objektentitäten (Verzeichnisse, Dokumente usw.); Registrarindex
  • (Link zum Dokument) für Tabellen der dem Standesbeamten unterstellten Registerbewegungen; Index zum Zeitraum und den Werten aller Messungen
  • für Übersichtstabellen von Akkumulationsregistern;, Indexzeitraum Konto und Werte

In Fällen, in denen automatisch erstellte Indizes nicht ausreichen, können Sie im Konfigurator zusätzlich die Details des Metadatenobjekts indizieren. Es ist jedoch zu bedenken, dass die Erstellung eines Index die Suche nach Informationen beschleunigt, den Prozess der Änderung durch den Benutzer (Hinzufügen, Bearbeiten und Löschen) im 1C-Enterprise-Startmodus jedoch etwas verlangsamen kann. Daher sollten Indizes bewusst und nur dann erstellt werden, wenn die Abfrage, für die ein solcher Index benötigt wird, genau bekannt ist. Sie sollten keine „nur für den Fall“-Indizes oder absichtlich redundante Indizes erstellen. Beispielsweise sollten Sie niemals zusätzlich die erste Dimension eines Registers indizieren, da der Hauptindex der Summentabelle, den die Plattform automatisch erstellt, für die Suche nach dem Wert der ersten Dimension geeignet ist.

Die Konfiguration beschreibt das Akkumulationsregister Produkte in Lagern:

Abb. 1. Beispiel für die Struktur des Warenansammlungsregisters in Lagerhäusern

Die 1C:Enterprise-Plattform erstellt automatisch einen Index für die Bilanztabelle dieses Registers nach Zeitraum und allen Dimensionen in der Reihenfolge, in der sie im Konfigurator aufgeführt sind.

Schauen wir uns einige Beispielabfragen an und analysieren, ob diese mit dieser Datenstruktur optimal ausgeführt werden können.

Anfrage 1

Anfrage . Text = "WÄHLEN |VON , Nomenklatur = &Nomenklatur) AS-Produkte in Lagern verbleibend“;

In diesem Fall ist Anforderung 2 verletzt. In der Bedingung erfolgt keine Selektion durch das erste Feld des Index (Warehouse). Eine solche Anfrage wird nicht optimal ausgeführt. Um es auszuführen, muss der DBMS-Server alle Datensätze in der Tabelle iterieren (scannen). Die Ausführungszeit dieser Operation hängt direkt von der Anzahl der Einträge in der Registerresttabelle ab und kann sehr lang sein (und erhöht sich mit zunehmender Datenmenge).

Optimierungsmöglichkeiten:

  • Indexieren Sie die Dimension „Nomenklatur“.
  • Platzieren Sie die Dimension „Nomenklatur“ an erster Stelle in der Dimensionsliste. Seien Sie vorsichtig, wenn Sie diese Methode verwenden. Möglicherweise gibt es andere Anforderungen in der Konfiguration, die durch diesen Austausch möglicherweise verlangsamt werden.

Anfrage 2

Anfrage . Text = "WÄHLEN | GoodsInWarehousesRemains.Warehouse, | Produkte im Lager Restbestand Nomenklatur, | ProdukteIm LagerBleibt.Qualität |VON | RegisterAccumulations.GoodsInWarehouses.Remains( | , | Qualität = &Qualität ;

In diesem Fall liegt ein Verstoß gegen die Anforderung 3 vor. Zwischen den Dimensionen „Lager“ und „Qualität“ in der Registerstruktur gibt es eine Dimension „Nomenklatur“, die in der Anforderungsbedingung nicht angegeben ist. Auch diese Abfrage kann nicht optimal ausgeführt werden. Bei der Ausführung durchsucht das DBMS das erste Feld des Index, ist dann aber gezwungen, einen Teil davon zu scannen. Das Scannen führt zu einer Verlängerung der Abfrageausführungszeit und zur Blockierung redundanter Datensätze in der Tabelle, d. h. zu einer Verringerung des gesamten Systemdurchsatzes.

Optimierungsmöglichkeiten:

  • Fügen Sie der Anfrage eine Bedingung für die Dimension „Nomenklatur“ hinzu
  • Entfernen Sie die Bedingung für die Dimension „Qualität“ aus der Anfrage
  • Übertragen Sie die „Nomenklatur“ von Maßen auf Details
  • Tauschen Sie die Dimensionen „Nomenklatur“ und „Qualität“ aus

Anfrage 3

Anfrage . Text = "WÄHLEN | GoodsInWarehousesRemains.Warehouse, | Produkte im Lager Restbestand Nomenklatur, | GoodsInWarehousesRemains.Quality, | ProdukteIn LagernRemaining.QuantityRemaining |VON | RegisterAccumulations.GoodsInWarehouses.Remains( | , | Nomenklatur = &Nomenklatur | AND Warehouse = &Warehouse) AS GoodsInWarehousesRemaining";

In diesem Fall werden die Index- und Abfrageabgleichsanforderungen nicht verletzt. Diese Anfrage wird vom DBMS optimal ausgeführt. Bitte beachten Sie, dass die Reihenfolge der Bedingungen in der Abfrage nicht mit der Reihenfolge der Felder im Index übereinstimmen muss. Dies stellt kein Problem dar und wird vom DBMS normal verarbeitet.

4. Verwendung von logischem ODER in Bedingungen

4.1 Verwendung von logischem ODER im WHERE-Abschnitt einer Abfrage

Sie sollten OR nicht im WHERE-Abschnitt einer Abfrage verwenden. Dies kann dazu führen, dass das DBMS keine Tabellenindizes verwenden kann und Scans durchführt, was die Ausführungszeit der Abfrage und die Wahrscheinlichkeit einer Sperrung erhöht. Stattdessen sollten Sie eine Abfrage in mehrere aufteilen und die Ergebnisse kombinieren.

Zum Beispiel Anfrage

Produkt auswählen . Name AUS Verzeichnis . Produkte WIE Produkt WO Artikel = "001" ODER Artikel = "002"

sollte durch eine Anfrage ersetzt werden

Produkt auswählen . Name AUS Verzeichnis . Produkte WIE Produkt WO Artikel = "001" |Alle KOMBINIEREN |Produkt AUSWÄHLEN . Name AUS Verzeichnis . Produkte WIE Produkt WO Artikel = "002"

4.2. Registrieren von Benutzern in mehreren Rollen, jeweils mit RLS

1 MIT RLS (Aufzeichnen Ebene Sicherheit) oder Einschränkung von Rechten auf Datensatzebene – dies ist die Einstellung von Benutzerrechten im System 1 MIT, wodurch Sie die Rechte für Benutzer im Kontext sich dynamisch ändernder Daten trennen können.

Wenn die Konfiguration mehrere Rollen mit RLS-Bedingungen beschreibt, sollten Sie einem Benutzer nicht mehr als eine solche Rolle zuweisen. Wenn ein Benutzer beispielsweise in zwei Rollen bei RLS enthalten ist – ein Buchhalter und ein Personalreferent –, werden bei der Ausführung aller seiner Anforderungen die Bedingungen beider RLS zu ihren Bedingungen durch logisches ODER addiert. Selbst wenn in der ursprünglichen Abfrage keine OR-Bedingung vorhanden ist, wird sie auf diese Weise dort angezeigt, sobald die RLS-Bedingungen hinzugefügt werden. Eine solche Anfrage kann auch suboptimal ausgeführt werden – langsam und mit übermäßigen Sperren.

Stattdessen sollten Sie eine „gemischte“ Rolle erstellen – „Buchhalter-Personalbeauftragter“ und deren RLS so registrieren, dass die Verwendung von OR in der Bedingung vermieden wird, und den Benutzer in diese eine Rolle einbeziehen.

4.3 Verwendung von OR in Verbindungsbedingungen

Es wird nicht empfohlen, logisches ODER in Verbindungsbedingungen, also im Abschnitt zur Anforderungssoftware, zu verwenden. Dies kann auch zur Auswahl eines suboptimalen Plans und einer langsamen Abfrageleistung führen. Es gibt keine einfache, universelle Möglichkeit, eine solche Abfrage ohne die Verwendung von OR umzuschreiben. Sie sollten das zu lösende Problem analysieren und versuchen, einen anderen Algorithmus zu seiner Lösung zu finden.

5. Unterabfragen in einer Join-Bedingung verwenden

Sie sollten in einer Join-Bedingung keine Unterabfragen verwenden. Dies kann zu einer erheblichen Verlangsamung der Abfrage und (in einigen Fällen) zu ihrer völligen Funktionsunfähigkeit auf einigen DBMS führen. Ein Beispiel für eine Abfrage, die eine Unterabfrage in einer Join-Bedingung verwendet:

Anfrage . Text = "WÄHLEN |VON | Preise. Periode B ( | SELECT MAXIMUM(PricesLastMonth.Period) | AUS Registerinformationen. Preis ALS PREISE DES LETZTEN MONATS | WHERE PricesLastMonth.Period< НАЧАЛОПЕРИОДА(ОстаткиТоваров.Период, МЕСЯЦ) | Und Preise des letzten Monats.Nomenklatur = Verbleibende Waren.Nomenklatur |) | WO sind die restlichen Produkte.Warehouse = &Warehouse";

In diesem Fall wird die Unterabfrage in der Join-Bedingung verwendet, um sozusagen ein „Slice of the Latest“ am Ende der vorherigen Periode zu erhalten. Darüber hinaus kann der Zeitraum für jede Nomenklatur unterschiedlich sein. Es wird empfohlen, eine solche Abfrage mithilfe temporärer Tabellen neu zu schreiben. Dies kann beispielsweise so erfolgen:

Anfrage . Text = " // Maximale Termine für die Festlegung der Preise in der Vorperiode für diese Artikel |AUSWÄHLEN | Übrige Produkte. Nomenklatur AS-Nomenklatur, | MAXIMUM(Preise.Zeitraum) AS-Zeitraum |ORT-Termine nach Nomenklaturen |VON | RegisterAccumulations.GoodsInWarehouses.Remainings(...) AS RemainingProducts | LINKE VERBINDUNG RegisterInformation.Price AS Preise | Softwarepreise.Nomenklatur = Verbleibende Produkte.Nomenklatur UND | Preise.Zeitraum< НАЧАЛОПЕРИОДА(ОстаткиТоваров.Период, МЕСЯЦ) | GRUPPE NACH Übrige Produkte.Nomenklatur | WO sind noch Waren übrig.Warehouse = &Warehouse; // Daten nach Preis für den gefundenen Zeitraum auswählen |AUSWÄHLEN | DatesBy Nomenclatures.Nomenclature AS Nomenclature, | Preise. Preis wie der Preis des letzten Monats |FROM DateBy-Nomenklaturen | LINKE VERBINDUNG RegisterInformation.Price AS Preise | Softwarepreise.Nomenklatur = Verbleibende Produkte.Nomenklatur UND | Prices.Period = DatesByNomenclatures.Period " ;

6.Empfangen von Daten über einen Punkt aus Feldern eines zusammengesetzten Typs

Wenn die Abfrage einen Punktwert aus einem Feld eines komplexen Referenztyps verwendet, wird beim Ausführen dieser Abfrage ein Join für alle in diesem komplexen Typ enthaltenen Objekttabellen durchgeführt. Dadurch wird der Abfragetext durch SQL extrem komplex und bei der Ausführung wählt der DBMS-Optimierer möglicherweise einen suboptimalen Plan aus. Dies kann zu schwerwiegenden Leistungsproblemen und in einigen Fällen sogar zu Abfragefehlern führen.

Insbesondere wird nicht empfohlen, auf die Details des Registerregistrators zuzugreifen (z. B. „ProductsInWarehouses.Registrar.Date“) usw. In diesem Fall spielt es keine Rolle, in welchem ​​Teil der Anfrage Sie das durch einen Punkt aus einem Feld eines komplexen Typs empfangene Attribut verwenden – in der Liste der zurückgegebenen Felder, in einer Bedingung usw. In allen Fällen kann diese Behandlung zu Leistungsproblemen führen.

  • Vermeiden Sie Redundanz beim Erstellen von Feldern mit zusammengesetzten Referenztypen. Geben Sie so viele mögliche Typen wie nötig für ein bestimmtes Feld an. Sie sollten die Typen „beliebiger Link“ oder „Link zu irgendeinem Dokument“ usw. nicht unnötig verwenden. Stattdessen sollten Sie Ihre Anwendungslogik genauer analysieren und dem Feld genau die möglichen Referenztypen zuordnen, die zur Lösung des Problems notwendig sind.
  • Verzichten Sie bei Bedarf auf kompakten Speicher zugunsten der Leistung. Wenn Sie in Ihrer Anfrage einen durch eine Referenz erhaltenen Wert benötigen, kann dieser Wert möglicherweise direkt in diesem Objekt gespeichert werden. Wenn Sie beispielsweise bei der Arbeit mit einem Register Informationen über das Datum des Standesbeamten benötigen, können Sie die entsprechenden Angaben im Register anlegen und diesen beim Buchen von Dokumenten einen Wert zuweisen. Dies führt zu einer Duplizierung von Informationen und einer (leichten) Vergrößerung ihres Umfangs, kann jedoch die Leistung und Stabilität der Abfrage erheblich verbessern.
  • Wenn nötig, opfern Sie die Kompaktheit und Vielseitigkeit des Codes zugunsten der Leistung. In der Regel werden nicht alle möglichen Arten eines bestimmten Links benötigt, um eine bestimmte Anfrage unter bestimmten Bedingungen zu erfüllen. In diesem Fall sollten Sie die Anzahl der möglichen Typen mithilfe der EXPRESS-Funktion einschränken. Wenn diese Abfrage universell ist und in verschiedenen Situationen verwendet wird (wo die Linktypen unterschiedlich sein können), können Sie die Abfrage dynamisch generieren, indem Sie in der EXPRESS-Funktion den Typ ersetzen, der unter diesen Bedingungen erforderlich ist. Dadurch wird der Quellcode größer und möglicherweise weniger universell, kann jedoch die Leistung und Stabilität der Abfrage erheblich verbessern.

Beispiel

Diese Anfrage nutzt einen Zugriff auf die Daten des Registrars. Registrar ist ein zusammengesetztes Typfeld, das Referenzwerte zu einem von 56 Dokumenttypen akzeptieren kann.

Anfrage . Text = "WÄHLEN | Verkaufsregisternummer, | Verkauf.Registrar.Datum, | Verkäufe. | Umsatz.Menge, | Umsatz.Kosten |VON |WO...

Der SQL-Text dieser Abfrage enthält 56 Linksverknüpfungen zu den Dokumenttabellen. Dies kann beim Ausführen der Abfrage zu schwerwiegenden Leistungsproblemen führen. Um dieses spezielle Problem zu lösen, ist es jedoch nicht erforderlich, eine Verbindung zu allen 56 Dokumenttypen herzustellen. Die Bedingungen der Anfrage sind so, dass bei ihrer Ausführung nur die Bewegungen der Dokumente „Verkäufe von Waren und Dienstleistungen“ und „Bestellungen des Käufers“ ausgewählt werden. In diesem Fall können wir die Abfrage erheblich beschleunigen, indem wir die Anzahl der Verbindungen mithilfe der Funktion EXPRESS() begrenzen.

Anfrage . Text = "WÄHLEN | AUSWAHL | THEN EXPRESS(Sales.Registrar AS Document.Sales of Goods and Services).Nummer | THEN EXPRESS(Sales.Registrar AS Document.Buyer Order).Number | ENDE AUSWAHL ALS Zahl, | AUSWAHL | WANN Verkäufe. Registrar-LINK-Dokument | THEN EXPRESS(Sales.Registrar AS Document.Sales of Goods and Services).Datum | WANN Sales.Registrar LINK Document.Buyer Order | THEN EXPRESS(Sales.Registrar AS Document.Buyer Order).Date | AUSWAHL ENDE ALS Datum, | Verkäufe. | Umsatz.Menge, | Umsatz.Kosten |VON | RegistrierenAkkumulationen.Verkäufe WIE Verkäufe |WO | Verkäufe.Registrar-LINK-Dokument.Verkäufe von Waren und Dienstleistungen | ODER „Sales.Registrar LINK Document.Buyer Orders“;

Diese Abfrage ist umständlicher und möglicherweise weniger allgemein (in anderen Situationen, in denen andere Logger-Typwerte möglich sind, funktioniert sie nicht ordnungsgemäß). Bei der Ausführung wird jedoch eine SQL-Abfrage generiert, die nur zwei Verbindungen zu Dokumenttabellen enthält. Eine solche Anfrage wird viel schneller und stabiler funktionieren als die Anfrage in ihrer ursprünglichen Form.

7. Filtern virtueller Tabellen ohne Verwendung von Parametern

Wenn Sie virtuelle Tabellen in Abfragen verwenden, sollten Sie alle Bedingungen, die sich auf diese virtuelle Tabelle beziehen, an die Tabellenparameter übergeben. Es wird nicht empfohlen, virtuelle Tabellen mithilfe von Bedingungen im WHERE-Abschnitt usw. zu filtern. Eine solche Abfrage liefert das (aus funktionaler Sicht) korrekte Ergebnis, es wird für das DBMS jedoch viel schwieriger sein, den optimalen Plan für die Ausführung auszuwählen. In einigen Fällen kann dies zu Fehlern im DBMS-Optimierer und einer erheblichen Verlangsamung der Abfrageleistung führen.

Die folgende Abfrage verwendet beispielsweise den WHERE-Abschnitt der Abfrage, um aus einer virtuellen Tabelle auszuwählen.

Anfrage . Text = "WÄHLEN | Nomenklatur |VON | RegisterAccumulations.GoodsInWarehouses.Remains() |WO | Lager = &Lager";

Es ist möglich, dass als Ergebnis der Ausführung dieser Abfrage zunächst alle Datensätze der virtuellen Tabelle ausgewählt werden und dann der Teil daraus ausgewählt wird, der der angegebenen Bedingung entspricht. Es wäre am besten, die Anzahl der abgerufenen Datensätze sehr früh im Abfrageprozess zu begrenzen. Dazu müssen Sie die Bedingungen an die Parameter der virtuellen Tabelle übergeben.

Anfrage . Text = "WÄHLEN | Nomenklatur |VON | RegisterAccumulations.GoodsInWarehouses.Remains(, Warehouse = &Warehouse)";

Gemäß den Bestimmungen von Artikel 134 des Arbeitsgesetzbuchs der Russischen Föderation müssen Arbeitgeber ihren Arbeitnehmern im Zusammenhang mit steigenden Verbraucherpreisen für Waren und Dienstleistungen eine Lohnerhöhung gewähren. Das Indexierungsverfahren (unter Berücksichtigung der Meinung der Gewerkschaft) ist im Tarifvertrag oder im örtlichen Regulierungsgesetz der Organisation vorgeschrieben. In dem Artikel erklären 1C-Experten, wie die Personaltabelle und die aktuellen Tarife der Arbeitnehmer in „1C: Gehalts- und Personalmanagement 8“, Ausgabe 3, indexiert werden (mit weiterer Neuberechnung des Durchschnittsverdienstes).

Die Indexierung in „1C: Gehälter und Personalmanagement 8“ (Hrsg. 3) bedeutet normalerweise zwei Aufgaben:

  • Indexierung der Besetzungstabelle – eine schrittweise Änderung der Tarifsätze in der Besetzungstabelle (sofern diese im Programm verwendet wird);
  • Indexierung der aktuellen Tarife der Arbeitnehmertarife – eine Erhöhung der Tarife mit weiterer Neuberechnung des Durchschnittsverdienstes.

Eine Indizierung der Besetzungstabelle ist möglich, wenn das Programm „1C: Gehälter und Personalmanagement 8“ Edition 3 eine Besetzungstabelle mit gespeicherter Historie führt (die Flags „Besetzung pflegen“ und „Änderungshistorie der Besetzungstabelle pflegen“ in den Einstellungen – Personalakten – Die Markierungen für die Einrichtung der Besetzungstabelle sind ausgewählt).

Die Indexierung erfolgt im Dokument Personalwechsel. Die Auswahl der indizierten Positionen erfolgt über die Schaltfläche Position ändern. Klicken Sie auf die Schaltfläche „Indikatoren ausfüllen“, um die Indikatoren anzugeben, die in den Gehaltsberechnungseinstellungen als bestimmend für die Zusammensetzung des Gesamttarifs markiert sind. Die Werte dieser Indikatoren können durch Multiplikation mit dem Indexierungskoeffizienten indexiert werden (Abb. 1).

Reis. 1. Indexierung der Besetzungstabelle, für die Tarifgruppen und Besoldungsgruppen (Kategorien) angegeben sind, müssen Sie zunächst die Genehmigung der Tarifgruppe durchführen (Menü Gehalt - Genehmigung der Tarifgruppe).

Um Änderungen der Tarifsätze für Tarifkategorien in der Besetzungstabelle im Tarifgruppengenehmigungsdokument widerzuspiegeln, klicken Sie auf die Schaltfläche Besetzungstabelle ändern. In diesem Fall wird das Dokument Besetzungstabellenänderung automatisch erstellt. Die Indexierung der Besetzungstabelle im Programm führt nicht automatisch zu einer Indexierung des Arbeitnehmerverdienstes und hat keinen Einfluss auf die Berechnung des Durchschnittsverdienstes.

Indexierung der aktuellen Tarife der Arbeitnehmertarife

Ab Version 3.1.3 im Programm 1C: Gehalts- und Personalmanagement 8, Edition 3 drückt sich die Indexierung der aktuellen Tarife der Arbeitnehmertarife nicht einfach in einer Erhöhung des Tarifsatzes aus, sondern kann mit Änderungen in anderen kombiniert werden Gebühren, die die Zusammensetzung des Gesamttarifs bestimmen. In diesem Fall wird der Indexierungskoeffizient nicht angegeben, sondern als Verhältnis des neuen Gesamtzollsatzes zum vorherigen berechnet. Die Indexierung der aktuellen Tarife der Arbeitnehmertarife erfolgt über das Dokument Änderung geplanter Rückstellungen (Menü Gehalt – Änderung Arbeitnehmerentgelt – Schaltfläche Erstellen).

Damit die Erhöhung der Tarifsätze vom System als Indexierung wahrgenommen wird, d. h. um einen steigenden Koeffizienten für die Berechnung des Durchschnittsverdienstes anzugeben, muss im Dokument „Änderung der geplanten Rückstellungen“ das Kennzeichen „Als Verdienstindexierung berücksichtigen“ gesetzt werden (Abb. 2).


Reis. 2. Indexierung des Arbeitnehmereinkommens

Dieses Flag ist im Dokument verfügbar, wenn die Möglichkeit zur Verwendung von Gehaltsindexierungsmechanismen durch das Flag „Mitarbeiterverdienste werden indexiert“ aktiviert ist (Menü Einstellungen – Gehaltsabrechnung). Mithilfe der Schaltflächen „Auswahl“ oder „Ausfüllen“ müssen Sie eine Liste der Mitarbeiter erstellen, deren Verdienst der Indexierung unterliegt. Wenn Sie anschließend im Dokument „Änderung des Mitarbeitergehalts“ auf die Schaltfläche „Indikatoren ausfüllen“ klicken, wird ein Fenster geöffnet, in dem Sie feste Werte eingeben können (Festwert – siehe Abbildung 2) oder vorab ausgefüllte Werte mithilfe mathematischer Operationen (Addieren, Multiplizieren mit) neu berechnen können. , die beispielsweise den Koeffizienten angibt, mit dem das Gehalt, der Stundensatz oder ein anderer Indikator, der die Zusammensetzung des Gesamttarifs bestimmt, multipliziert werden sollen. Klicken Sie auf die Schaltfläche „Anordnung zur Indexierung des Verdienstes“, um ein gedrucktes Formular der Anordnung zur Indexierung des Arbeitnehmerverdienstes zu erstellen.

Wenn das Unternehmen Tarifgruppen verwendet, kann das Dokument „Änderung geplanter Gebühren“ durch Klicken auf die Schaltfläche „Änderung geplanter Gebühren“ im Dokument „Genehmigung einer Tarifgruppe“ (Menü „Gehalt – Genehmigung einer Tarifgruppe“) erstellt werden.

oder

Warum muss ein 1C-Entwickler Registerabmessungen und -details „indizieren“?

- Nun, Sie haben Wünsche! - sagte die Datenbank und hing...

Die kurze Antwort auf die Titelfrage lautet: Dadurch können Abfragen schneller ausgeführt werden und die negativen Auswirkungen von Sperren werden verringert.

Was ist ein Index?

Optimierung der Indexplatzierung

Wenn das Volumen der Tabellen es nicht zulässt, dass sie in den RAM des Servers „passen“, steht die Geschwindigkeit des Festplattensubsystems (I/O) an erster Stelle. Und hier können Sie auf die Möglichkeit achten, Indizes in separaten Dateien auf verschiedenen Festplatten zu platzieren.

Detaillierte Beschreibung der Aktionen http://technet.Microsoft.com/ru-ru/Bibliothek/MS175905.aspx
Die Verwendung eines Index aus einer anderen Dateigruppe verbessert die Leistung nicht gruppierter Indizes aufgrund der Parallelität von E/A-Prozessen und der Arbeit am Index selbst.
Zur Ermittlung der Abmessungen kann die oben genannte Verarbeitung genutzt werden.

Einfluss von Indizes auf Sperren

Das Fehlen des notwendigen Indexes für eine Abfrage bedeutet ein Durchlaufen aller Tabellendatensätze, was wiederum zu redundanten Sperren führt, d. h. unnötige Datensätze werden blockiert. Darüber hinaus ist die Haltezeit der Sperre umso länger, je länger die Ausführung einer Abfrage aufgrund fehlender Indizes dauert.
Ein weiterer Grund für Sperren ist eine geringe Anzahl von Datensätzen in Tabellen. In diesem Zusammenhang verwendet SQL Server bei der Auswahl eines Abfrageausführungsplans keine Indizes, sondern durchsucht die gesamte Tabelle (Table Scan) und blockiert so die gesamte Tabelle. Um eine solche Blockierung zu vermeiden, ist es notwendig, die Anzahl der Datensätze in den Tabellen auf 1500-2000 zu erhöhen. In diesem Fall wird das Scannen der Tabelle teurer und SQL Server beginnt mit der Verwendung von Indizes. Dies ist natürlich nicht immer möglich; eine Reihe von Verzeichnissen wie „Organisationen“, „Lager“, „Abteilungen“ usw. haben normalerweise nur wenige Einträge. In diesen Fällen führt die Indizierung nicht zu einer Leistungsverbesserung.

Indexleistung

Wir haben bereits im Titel des Artikels darauf hingewiesen, dass wir an der Auswirkung von Indizes auf die Abfrageleistung interessiert sind. Daher eignen sich Indizes am besten für die folgenden Aufgabentypen:

  • Abfragen, die „enge“ Suchkriterien angeben. Solche Abfragen dürfen nur eine kleine Anzahl von Zeilen lesen, die bestimmte Kriterien erfüllen.
  • Abfragen, die einen Wertebereich angeben. Diese Abfragen müssen auch eine kleine Anzahl von Zeilen lesen.
  • Eine Suche, die bei Verknüpfungsvorgängen verwendet wird. Spalten, die häufig als Bindeschlüssel verwendet werden, eignen sich hervorragend für Indizes.
  • Eine Suche, bei der Daten in einer bestimmten Reihenfolge gelesen werden. Wenn die Ergebnismenge in der Clustered-Index-Reihenfolge sortiert werden soll, ist keine Sortierung erforderlich, da die Ergebnismenge bereits vorsortiert ist. Wenn beispielsweise ein Clustered-Index für die Spalten „Nachname“ und „Vorname“ erstellt wird und die Anwendung eine Sortierung nach Nachname und dann nach Vorname erfordert, muss keine ORDER BY-Klausel hinzugefügt werden.

Bei aller Nützlichkeit von Indizes gibt es zwar ein sehr wichtiges ABER: Der Index muss „effizient genutzt“ werden und das Auffinden von Daten mit weniger E/A-Vorgängen und weniger Systemressourcen ermöglichen. Umgekehrt ist es wahrscheinlicher, dass ungenutzte (selten verwendete) Indizes die Datenschreibleistung verschlechtern (da jeder Vorgang, der die Daten ändert, auch die Indexseiten aktualisieren muss) und überschüssigen Datenbankspeicherplatz erzeugen.

Abdeckung(für eine bestimmte Anfrage) wird ein Index genannt, der alle notwendigen Felder für diese Anfrage enthält. Wenn beispielsweise ein Index für die Spalten a, b und c erstellt wird und die SELECT-Anweisung nur Daten aus diesen Spalten abfragt, ist nur Zugriff auf den Index erforderlich.

Um die Wirksamkeit eines Index zu ermitteln, können wir mithilfe eines kostenlosen Onlinedienstes grob abschätzen, der den „Abfrageausführungsplan“ und die verwendeten Indizes anzeigt.



Aktie