ინდექსები 1s შეკითხვებში. შეკითხვის ოპტიმიზაცია. მომხმარებლების დარეგისტრირება მრავალ როლში, თითოეულს აქვს RLS

ინდექსები 1s შეკითხვებში.  შეკითხვის ოპტიმიზაცია.  მომხმარებლების დარეგისტრირება მრავალ როლში, თითოეულს აქვს RLS
ინდექსები 1s შეკითხვებში. შეკითხვის ოპტიმიზაცია. მომხმარებლების დარეგისტრირება მრავალ როლში, თითოეულს აქვს RLS

გაგზავნეთ ეს სტატია ჩემს ელექტრონულ ფოსტაზე

ამ სტატიაში ჩვენ განვიხილავთ, თუ როგორ უნდა მოხდეს ხელფასების ინდექსირება 1C ZUP-ში ორგანიზაციის თანამშრომლებისთვის. ხელმძღვანელობს რუსეთის ფედერაციის შრომის კოდექსის 134-ე მუხლით, სადაც ნათქვამია, რომ დამსაქმებელმა უნდა უზრუნველყოს თანამშრომლებისთვის ხელფასების ზრდა, რადგან საქონლისა და მომსახურების ღირებულება პერიოდულად იზრდება. თუ ორგანიზაცია ფინანსდება ბიუჯეტიდან, მაშინ ინდექსაცია ასევე ხორციელდება რუსეთის ფედერაციის შრომის კოდექსის, სხვადასხვა აქტების ან კოლექტიური ხელშეკრულების შესაბამისად.

ხელფასების ინდექსაციით, უპირველეს ყოვლისა, უნდა გვესმოდეს ტარიფის განაკვეთების ზრდა - ხელფასები, როგორც მთელი საწარმოსთვის, ასევე მისი ცალკეული განყოფილებებისა თუ ფილიალების მიმართ. კოეფიციენტის მნიშვნელობა მომავალში გამოყენებული იქნება შვებულების, მივლინების, საშუალო შემოსავლის და სხვა შემთხვევების გაანგარიშებისას.

1C ZUP-ში ხელფასის ინდექსაციის განსახორციელებლად, თქვენ უნდა შეასრულოთ რამდენიმე ნაბიჯი პროგრამაში. პირველი რაც თქვენ უნდა გააკეთოთ არის შეამოწმოთ, რომ დაყენებულია საჭირო პარამეტრები. "პარამეტრების" განყოფილებაში აირჩიეთ პუნქტი "ხელფასის გაანგარიშება". საჭიროა ჩამრთველი, რომელიც მიუთითებს, რომ შემოსავალი ინდექსირებულია მონაცემთა ბაზაში.

თქვენ ასევე უნდა უზრუნველყოთ პერსონალის ჩანაწერების შენახვა და ისტორიის შენახვა. ამ ვარიანტების ხელმისაწვდომობის შესამოწმებლად, თქვენ უნდა აირჩიოთ "HR" პუნქტი და მიჰყევით ბმულს "პერსონალის ცხრილის დაყენება".

პროგრამაში ინდექსაციისთვის, 3.1.3 გამოშვებიდან დაწყებული, არის სპეციალური დოკუმენტი "საშტატო ცხრილის შეცვლა", რომელიც მდებარეობს "პერსონალის" განყოფილებაში. ჩვენ ვქმნით ახალ დოკუმენტს და ვავსებთ თარიღს, საიდანაც ცვლილებები და ორგანიზაცია ძალაში შევა. ცხრილის შესავსებად. ნაწილები, დააჭირეთ ღილაკს "შეცვლა" და დაამატეთ საჭირო გრაფიკის ერთეულები.

მარჯვენა ღილაკზე „მეტი“ დაწკაპუნებით, „გამოჩენილი ინდიკატორების“ არჩევით, შეგიძლიათ გამოიყენოთ მოსანიშნი ველები ინდიკატორების ხილვადობის გასაკონტროლებლად და აჩვენოთ მხოლოდ ის, რაც საჭიროა დოკუმენტში. შემდეგ დააჭირეთ ღილაკს "ინდიკატორების შევსება" და ფანჯარაში, რომელიც იხსნება, დააყენეთ "ხელფასის" ინდიკატორის კოეფიციენტი 1.1-ზე.

დადასტურების შემდეგ, ყველა ხაზისთვის დოკუმენტში არსებული მნიშვნელობები ხელახლა გამოითვლება ამ კოეფიციენტის გათვალისწინებით. დოკუმენტის ბოლოში „ხელმოწერების“ ბმულზე დაწკაპუნებით, შეგიძლიათ მიუთითოთ ორგანიზაციის ხელმძღვანელი და პერსონალის განყოფილების უფროსი. სამომავლოდ ისინი გამოისახება განრიგის შეცვლის შეკვეთის დაბეჭდილი სახით, რომლის დაბეჭდვა შესაძლებელია ღილაკის „შეკვეთა ცვლილებების შეტანის“ გამოყენებით. შემდეგ ჩვენ ვასრულებთ დოკუმენტს.

თუ თქვენ გაქვთ შეკითხვები ხელფასის ინდექსაციის თემაზე 1C ZUP-ში, დასვით ისინი სტატიის კომენტარებში, ჩვენი სპეციალისტები შეეცდებიან უპასუხონ მათ.

ხელფასების ზრდის ფაქტის ასახვისთვის, თქვენ უნდა შექმნათ დოკუმენტი "გეგმური დარიცხვების ცვლილება", რომელიც მდებარეობს "ხელფასის" განყოფილებაში, პუნქტში "თანამშრომლის ანაზღაურების ცვლილება". ვინაიდან ჩვენს მაგალითში ინახება საშტატო ცხრილის ცვლილებების ისტორია, ზემოაღნიშნული დოკუმენტი შეიძლება შევიდეს შექმნილი დოკუმენტიდან „საშტატო ცხრილის ცვლილება“ შესაბამისი ღილაკის გამოყენებით.

ამის შემდეგ შეიქმნება დასრულებული დოკუმენტი. გთხოვთ, გაითვალისწინოთ, რომ ჩამრთველი უნდა იყოს მონიშნული ველი „მიიჩნიეთ მოგების ინდექსირებად“.

შემდეგ ჩვენ ვასრულებთ დოკუმენტს. მომდევნო თვის ხელფასის გადახდისას ხელფასი დაითვლება ინდექსაციის გათვალისწინებით.

გამოცდილი 1C პროგრამისტების გუნდი:

რეაგირების დრო 5 წუთიდან გადაუდებელ ამოცანებამდე, შაბათ-კვირას და არდადეგებზეც კი.

30+ პროგრამისტი 1C-ში 20 წლამდე გამოცდილებით.

ჩვენ ვაკეთებთ ვიდეო ინსტრუქციებს დასრულებული ამოცანების შესახებ.

ცოცხალი კომუნიკაცია კლიენტისთვის მოსახერხებელი ნებისმიერი მესინჯერის საშუალებით

თქვენი ამოცანების შესრულების მონიტორინგი ჩვენი სპეციალურად შემუშავებული აპლიკაციის საშუალებით

1C კომპანიის ოფიციალური პარტნიორები 2006 წლიდან.

წარმატებული ავტომატიზაციის გამოცდილება მცირე ფირმებიდან დიდ კორპორაციებამდე.

კლიენტების 99% კმაყოფილია შედეგებით

ან

რატომ სჭირდება 1C დეველოპერს ზომებისა და დეტალების „ინდექსირება“?

- კარგი, თხოვნები გაქვს! - თქვა მონაცემთა ბაზამ და ჩამოკიდა...

სათაურის კითხვაზე მოკლე პასუხი არის ის, რომ ეს საშუალებას მისცემს შეკითხვებს სწრაფად გაუშვას და შეამციროს საკეტების უარყოფითი გავლენა .

რა არის ინდექსი?

ინდექსის განთავსების ოპტიმიზაცია

როდესაც ცხრილების მოცულობა არ აძლევს მათ სერვერის RAM-ში „მოთავსების საშუალებას“, დისკის ქვესისტემის (I/O) სიჩქარე პირველ რიგში მოდის. და აქ შეგიძლიათ ყურადღება მიაქციოთ ინდექსების განთავსებას სხვადასხვა მყარ დისკზე მდებარე ცალკეულ ფაილებში.

მოქმედებების დეტალური აღწერა http://technet.მაიკროსოფტი.com/ru-რუ/ბიბლიოთეკა/ქალბატონი175905.aspx
სხვა ფაილური ჯგუფის ინდექსის გამოყენება აუმჯობესებს არაკლასტერული ინდექსების მუშაობას I/O პროცესებსა და თავად ინდექსზე მუშაობას შორის თანხვედრის გამო.
ზომების დასადგენად შეგიძლიათ გამოიყენოთ ზემოთ აღნიშნული დამუშავება.

ინდექსების გავლენა საკეტებზე

მოთხოვნისთვის საჭირო ინდექსის არარსებობა ნიშნავს ცხრილის ყველა ჩანაწერის გამეორებას, რაც თავის მხრივ იწვევს ზედმეტ ჩაკეტვას, ე.ი. არასაჭირო ჩანაწერები დაბლოკილია. გარდა ამისა, რაც უფრო მეტ ხანს დასჭირდება შეკითხვის დასრულებას დაკარგული ინდექსების გამო, მით უფრო გრძელი იქნება დაბლოკვის შეკავების დრო.
საკეტების კიდევ ერთი მიზეზი არის ცხრილებში ჩანაწერების მცირე რაოდენობა. ამასთან დაკავშირებით, SQL Server, შეკითხვის შესრულების გეგმის არჩევისას, არ იყენებს ინდექსებს, არამედ ათვალიერებს მთელ ცხრილს (Table Scan), ბლოკავს მთელ ცხრილს. ასეთი დაბლოკვის თავიდან ასაცილებლად საჭიროა ცხრილებში ჩანაწერების რაოდენობა 1500-2000-მდე გაიზარდოს. ამ შემთხვევაში ცხრილის სკანირება გაძვირდება და SQL Server იწყებს ინდექსების გამოყენებას. რა თქმა უნდა, ეს ყოველთვის არ შეიძლება გაკეთდეს მრავალი დირექტორია, როგორიცაა "ორგანიზაციები", "საწყობები", "განყოფილებები" და ა.შ. ჩვეულებრივ აქვს რამდენიმე ჩანაწერი. ამ შემთხვევებში, ინდექსირება არ გააუმჯობესებს შესრულებას.

ინდექსის შესრულება

ჩვენ უკვე აღვნიშნეთ სტატიის სათაურში, რომ ჩვენ გვაინტერესებს ინდექსების გავლენა მოთხოვნის შესრულებაზე. ასე რომ, ინდექსები ყველაზე შესაფერისია შემდეგი ტიპის ამოცანებისთვის:

  • მოთხოვნები, რომლებიც აკონკრეტებენ ძიების „ვიწრო“ კრიტერიუმებს.ასეთი მოთხოვნები უნდა წაიკითხოს მხოლოდ მცირე რაოდენობის სტრიქონები, რომლებიც აკმაყოფილებენ გარკვეულ კრიტერიუმებს.
  • მოთხოვნები, რომლებიც განსაზღვრავს მნიშვნელობების დიაპაზონს.ამ მოთხოვნებს ასევე სჭირდებათ მწკრივების მცირე რაოდენობის წაკითხვა.
  • ძიება, რომელიც გამოიყენება ოპერაციების დაკავშირებისას.სვეტები, რომლებიც ხშირად გამოიყენება როგორც დამაკავშირებელი გასაღებები, შესანიშნავია ინდექსებისთვის.
  • ძიება, რომელშიც მონაცემები იკითხება კონკრეტული თანმიმდევრობით.თუ შედეგების ნაკრები უნდა იყოს დალაგებული კლასტერული ინდექსის თანმიმდევრობით, მაშინ დახარისხება არ არის საჭირო, რადგან შედეგების ნაკრები უკვე წინასწარ არის დახარისხებული. მაგალითად, თუ კლასტერული ინდექსი იქმნება სვეტებზე გვარი, სახელი და აპლიკაცია მოითხოვს დახარისხებას გვარის მიხედვით და შემდეგ სახელის მიხედვით, მაშინ არ არის საჭირო ORDER BY პუნქტის დამატება.

მართალია, ინდექსების მთელი სარგებლიანობით, არსებობს ერთი ძალიან მნიშვნელოვანი, მაგრამ - ინდექსი უნდა იყოს „ეფექტურად გამოყენებული“ და უნდა დაუშვას მონაცემების პოვნა ნაკლები I/O ოპერაციებისა და სისტემის რესურსების რაოდენობის გამოყენებით. პირიქით, გამოუყენებელი (იშვიათად გამოყენებული) ინდექსები უფრო მეტად ამცირებენ მონაცემთა ჩაწერის შესრულებას (რადგან ყველა ოპერაცია, რომელიც ცვლის მონაცემებს, ასევე უნდა განაახლოს ინდექსის გვერდები) და შექმნას მონაცემთა ბაზის ზედმეტი სივრცე.

დაფარვა(მოცემული მოთხოვნისთვის) ეწოდება ინდექსი, რომელიც შეიცავს ყველა საჭირო ველს ამ მოთხოვნისთვის. მაგალითად, თუ ინდექსი იქმნება a, b და c სვეტებზე და SELECT განცხადება ითხოვს მონაცემებს მხოლოდ ამ სვეტებიდან, მაშინ მხოლოდ ინდექსზე წვდომაა საჭირო.

ინდექსის ეფექტურობის დასადგენად, ჩვენ შეგვიძლია უხეშად შევაფასოთ უფასო ონლაინ სერვისის გამოყენებით, რომელიც აჩვენებს „შეკითხვის შესრულების გეგმას“ და გამოყენებულ ინდექსებს.

ინდექსების სწორად გამოყენებამ შეიძლება დააჩქაროს მოთხოვნები არა მხოლოდ რამდენჯერმე, არამედ ასობით, ზოგჯერ კი ათასობითჯერ.

ამ სახის აჩქარება უბრალოდ ვერ მიიღწევა აპარატურით.ამიტომ ამ თემას დიდი ყურადღება უნდა მიექცეს.

ხშირად, შეკითხვის დაჩქარების მიზნით, თქვენ უნდა შექმნათ თქვენი საკუთარი ინდექსი და ამის გაკეთების რამდენიმე განსხვავებული გზა არსებობს.

ვიდეო გაკვეთილებში განვიხილავთ ინდექსის შექმნის რამდენიმე გზას. ჩვენ ასევე განვიხილავთ სიტუაციას, როდესაც საჭირო კომპოზიციის ინდექსი არ შეიძლება შეიქმნას სტანდარტული პლატფორმის ხელსაწყოების გამოყენებით და უნდა შეიქმნას DBMS-ში.

ინდექსების დაყენება სტანდარტული პლატფორმის ხელსაწყოების გამოყენებით

გაკვეთილი აჩვენებს, თუ რა ინდექსები იქმნება რეალურად ობიექტებისთვის DBMS დონეზე.
ამ თემაში ყველაფერი ისეთი აშკარა არ არის, როგორც ერთი შეხედვით ჩანს. ყოველივე ამის შემდეგ, მთელი რიგი ობიექტებისთვის არის ინდექსების შექმნის მახასიათებლები.
ყველა დეტალს ამ ვიდეოში განვიხილავთ.

ინდექსირება დამატებითი შეკვეთით

ვიდეო გვიჩვენებს განსხვავებას ინდექსის მშენებლობის ვარიანტს შორის ინდექსისაწყისი ინდექსი დამატებით შეკვეთა.
მაგალითი გვიჩვენებს, თუ რა სახის ინდექსს ააშენებს პლატფორმა დამატებითი შეკვეთის გამოყენებისას.

რეესტრის ზომების ინდექსის შექმნა

რეგისტრების პირველი განზომილების ინდექსირებას აქვს რამდენიმე ნიუანსი.
ვიდეოში ნაჩვენებია რა ინდექსები იქმნება რეგისტრის გაზომვებისთვის. ასევე განიხილება პირველი რეგისტრის განზომილების ინდექსირების სიტუაცია.

რუსეთის ფედერაციის შრომის კოდექსის 134-ე მუხლის დებულებების თანახმად, დამსაქმებლებმა უნდა უზრუნველყონ თანამშრომლებისთვის ხელფასის ზრდა საქონელსა და მომსახურებაზე სამომხმარებლო ფასების მატებასთან დაკავშირებით. ინდექსაციის პროცედურა (პროფკავშირის აზრის გათვალისწინებით) გათვალისწინებულია კოლექტიურ ხელშეკრულებაში ან ორგანიზაციის ადგილობრივ მარეგულირებელ აქტში. სტატიაში, 1C ექსპერტები გვიყვებიან, თუ როგორ უნდა დაადგინონ პერსონალის ცხრილი და თანამშრომლების ტარიფების მიმდინარე ტარიფები "1C: ხელფასი და პერსონალის მენეჯმენტი 8" გამოცემა 3 (საშუალო შემოსავლის შემდგომი გადაანგარიშებით).

ინდექსირება „1C: ხელფასი და პერსონალის მენეჯმენტი 8“ (რედ. 3) ჩვეულებრივ ნიშნავს ორ ამოცანას:

  • საშტატო ცხრილის ინდექსაცია - საშტატო ცხრილში ტარიფის განაკვეთების ცალ-ცალკე ცვლილება (თუ ის გამოიყენება პროგრამაში);
  • თანამშრომლების მიმდინარე ტარიფების ინდექსაცია - ტარიფის განაკვეთების ზრდა საშუალო შემოსავლის შემდგომი გადაანგარიშებით.

პერსონალის ცხრილის ინდექსაცია შესაძლებელია, თუ პროგრამა "1C: ხელფასი და პერსონალის მენეჯმენტი 8" გამოცემა 3 ინახავს პერსონალის ცხრილს შენახული ისტორიით (დროშები შეინახეთ პერსონალის ცხრილი და შეინახეთ პერსონალის ცხრილის ცვლილებების ისტორია მენიუში პარამეტრები - პერსონალი ჩანაწერები - შერჩეულია საშტატო ცხრილის დაყენება).

ინდექსაცია ხორციელდება დოკუმენტში პერსონალის შეცვლა. ინდექსირებული პოზიციების შერჩევა ხდება პოზიციის შეცვლა ღილაკის გამოყენებით. დააწკაპუნეთ ინდიკატორების შევსების ღილაკზე, რათა მიუთითოთ ინდიკატორები, რომლებიც მონიშნულია ხელფასის გაანგარიშების პარამეტრებში, როგორც მთლიანი ტარიფის განაკვეთის შემადგენლობის განმსაზღვრელი. ამ მაჩვენებლების მნიშვნელობების ინდექსირება შესაძლებელია მათი ინდექსაციის კოეფიციენტზე გამრავლებით (ნახ. 1).

ბრინჯი. 1. საშტატო ცხრილის ინდექსაცია, რომელზედაც მითითებულია სატარიფო ჯგუფები და კლასები (კატეგორიები), ჯერ უნდა განახორციელოთ სატარიფო ჯგუფის დამტკიცება (მენიუ ხელფასი - დამტკიცება სატარიფო ჯგუფი).

სატარიფო კატეგორიების სატარიფო განაკვეთების ცვლილებების ასახვისთვის საშტატო ჯგუფის დამტკიცების დოკუმენტში, დააწკაპუნეთ ღილაკზე საშტატო ცხრილის შეცვლა. ამ შემთხვევაში ავტომატურად იქმნება დოკუმენტი პერსონალის ცხრილის შეცვლა. პროგრამაში პერსონალის ცხრილის ინდექსაცია ავტომატურად არ იწვევს თანამშრომელთა შემოსავლის ინდექსაციას და არ მოქმედებს საშუალო შემოსავლის გაანგარიშებაზე.

დასაქმებულთა სატარიფო განაკვეთების მიმდინარე ტარიფების ინდექსაცია

3.1.3 ვერსიიდან დაწყებული 1C: ხელფასი და პერსონალის მენეჯმენტი 8 პროგრამა, გამოცემა 3, დასაქმებულთა ტარიფის ტარიფების მიმდინარე ტარიფების ინდექსაცია უბრალოდ არ არის გამოხატული ტარიფის განაკვეთის ზრდით, არამედ შეიძლება გაერთიანდეს სხვა ცვლილებებთან. გადასახადები, რომლებიც განსაზღვრავს მთლიანი სატარიფო განაკვეთის შემადგენლობას. ამ შემთხვევაში, ინდექსაციის კოეფიციენტი არ არის მითითებული, მაგრამ გამოითვლება, როგორც ახალი საერთო სატარიფო განაკვეთის თანაფარდობა წინასთან. თანამშრომელთა ტარიფის განაკვეთების მიმდინარე ტარიფების ინდექსაცია ხორციელდება დოკუმენტის გამოყენებით დაგეგმილი დარიცხვების შეცვლა (მენიუ ხელფასი - თანამშრომლის ანაზღაურების ცვლილება - ღილაკი შექმნა).

იმისათვის, რომ სატარიფო განაკვეთების ზრდა სისტემამ აღიქმებოდეს როგორც ინდექსაცია, ანუ საშუალო შემოსავლის გამოსათვლელად მზარდი კოეფიციენტის მითითება, დაგეგმილი დარიცხვის დოკუმენტში უნდა დაინიშნოს დროშა, როგორც მოგების ინდექსაცია (ნახ. 2).


ბრინჯი. 2. თანამშრომელთა შემოსავლის ინდექსაცია

ეს დროშა ხელმისაწვდომია დოკუმენტში, თუ ხელფასების ინდექსაციის მექანიზმების გამოყენების შესაძლებლობა ჩართულია დროშით თანამშრომლების შემოსავლების ინდექსირება (მენიუ პარამეტრები - სახელფასო). შერჩევის ან შევსების ღილაკების გამოყენებით, თქვენ უნდა შექმნათ თანამშრომლების სია, რომელთა შემოსავალი ექვემდებარება ინდექსირებას. შემდეგი, დოკუმენტში ინდიკატორების შევსების ღილაკზე დაწკაპუნებით, თანამშრომლის ანაზღაურების შეცვლა იხსნება ფანჯარა, სადაც შეგიძლიათ შეიყვანოთ ფიქსირებული მნიშვნელობები (ფიქსირებული მნიშვნელობა - იხილეთ სურათი 2), ან გადათვალოთ წინასწარ შევსებული მათემატიკური ოპერაციების გამოყენებით (დამატება, გამრავლება). , რომელიც მიუთითებს, მაგალითად, კოეფიციენტზე, რომლითაც უნდა გამრავლდეს ხელფასი, საათობრივი განაკვეთი ან სხვა მაჩვენებელი, რომელიც განსაზღვრავს მთლიანი ტარიფის განაკვეთის შემადგენლობას. დააწკაპუნეთ ღილაკზე ორდერი შემოსავლების ინდექსაციის შესახებ, რათა შექმნათ შეკვეთის ბეჭდური ფორმა თანამშრომლების შემოსავლების ინდექსაციის შესახებ.

თუ საწარმო იყენებს სატარიფო ჯგუფებს, მაშინ სატარიფო ჯგუფის დამტკიცების დოკუმენტში ღილაკზე გეგმიური გადასახადების შეცვლა (მენიუ ხელფასი - სატარიფო ჯგუფის დამტკიცება) ღილაკზე გეგმიური გადასახადების შეცვლა შეიძლება შეიქმნას.

ბეჭდვა (Ctrl+P)

მე დავაკოპირე ეს მასალა ITS დისკიდან განსახილველად და შესაძლო განხილვისთვის შეკითხვის ოპტიმიზაციის თემაზე https://its.1c.ru/db/metod8dev#content:5842:hdoc

მე გირჩევთ, რომ ყველა 1C პროგრამისტმა ყურადღებით წაიკითხოს ეს სტატია, რადგან შეკითხვის ენა არის 1C პლატფორმის მთავარი ინსტრუმენტი. სტატიაში მოცემულია მოთხოვნის არაოპტიმალური შესრულების ტიპიური მიზეზები, რომლებიც დიაგნოზირებულია კონფიგურაციის კოდის დონეზე და განიხილავს შეკითხვის ოპტიმიზაციის ტექნიკას.

შეკითხვის არაოპტიმალური შესრულების ძირითადი მიზეზები

1. უერთდება subqueries

ქვემოთხოვნებით შეერთებები არ უნდა იქნას გამოყენებული. მხოლოდ მეტამონაცემების ობიექტები ან დროებითი ცხრილები უნდა იყოს დაკავშირებული ერთმანეთთან. თუ მოთხოვნა იყენებს ქვემოთხოვნებს შეერთებას, მაშინ ის უნდა გადაიწეროს გამოყენებით დროებითი მაგიდები.

არაოპტიმალური სახიფათო მოთხოვნის მაგალითი, რომელიც იყენებს შეერთებას ქვემოთხოვნით შეერთების მარჯვენა მხარეს ქვემოთხოვნის გამოყენებით:

არჩევა . . . FROMდოკუმენტი . საქონლისა და მომსახურების გაყიდვები LEFT CONNECTION ( არჩევა FROMინფორმაციის რეესტრი . ლიმიტები WHERE . . . ჯგუფი BY . . . ) BY . . .

შეკითხვის ოპტიმიზაციისთვის, თქვენ უნდა გაყოთ იგი რამდენიმე ცალკეულ მოთხოვნად (შეერთებებში გამოყენებული ქვემოთხოვნების რაოდენობის მიხედვით). რეკომენდებულია ამ მოთხოვნების განთავსება ერთ პარტიულ მოთხოვნაში.

// შექმენით ცხრილის დროებითი მენეჯერი VT მენეჯერი = ახალიდროის ცხრილის მენეჯერი ; მოთხოვნა = ახალიმოთხოვნა ; მოთხოვნა . დროის ცხრილის მენეჯერი = VT მენეჯერი ; // სურათების მოთხოვნის ტექსტიმოთხოვნა . ტექსტი = " // შეავსეთ დროებითი ცხრილი. მოთხოვნა ლიმიტის რეესტრში. | აირჩიე... | დააყენეთ ლიმიტები | საინფორმაციო რეესტრიდან. ლიმიტები | სად... | ᲘᲗ ᲓᲐᲯᲒᲣᲤᲔᲑᲐ... | ინდექსი...; // შეასრულეთ ძირითადი მოთხოვნა დროებითი ცხრილის გამოყენებით აირჩიე... საქონლისა და მომსახურების გაყიდვების დოკუმენტიდან LEFT Join ლიმიტები მიერ...;" ყურადღება!ამ მაგალითში ძალიან მნიშვნელოვანია შექმნილი დროებითი ცხრილის ინდექსირება. ყველა ველი, რომელიც გამოიყენება შეერთების პირობებში, უნდა იყოს მითითებული, როგორც ინდექსის ველები.

2. უერთდება ვირტუალური ცხრილებით

თუ მოთხოვნა იყენებს კავშირს 1C: Enterprise შეკითხვის ენის ვირტუალურ ცხრილთან (მაგალითად, " RegisterAccumulations.Products.Remains() ”) და მოთხოვნა შესრულებულია არადამაკმაყოფილებელი შესრულებით, რეკომენდებულია ვირტუალური ცხრილის გამოძახება ცალკე მოთხოვნად და შედეგების შენახვა დროებით ცხრილში. ანუ, თქვენ უნდა გამოიყენოთ იგივე რეკომენდაცია, რაც ქვემოთხოვნით შეერთების შემთხვევაში (იხ. პუნქტი 1).

ფაქტია, რომ 1C: Enterprise შეკითხვის ენაში გამოყენებული ვირტუალური ცხრილები შეიძლება გაფართოვდეს ქვემოთხოვნებში SQL-ში თარგმნისას. ეს იმიტომ ხდება, რომ ვირტუალური ცხრილი ხშირად (მაგრამ არა ყოველთვის) იღებს მონაცემებს მრავალი ფიზიკური DBMS ცხრილიდან. თუ იყენებთ შეერთებას ვირტუალურ ცხრილთან, მაშინ SQL დონეზე ის შეიძლება განხორციელდეს ზოგიერთ შემთხვევაში, როგორც შეერთება ქვემოთხოვნით. ამ შემთხვევაში, DBMS ოპტიმიზატორს შეუძლია აირჩიოს არაოპტიმალური გეგმა ისევე, როგორც 1C: Enterprise ენაზე ცალსახად გამოყენებული ქვემოთხოვნასთან მუშაობისას.

3. შეუსაბამობა ინდექსებსა და შეკითხვის პირობებს შორის

პირობები გამოიყენება მოთხოვნის შემდეგ განყოფილებებში:

  • აირჩიეთ... FROM... სად<условие>
  • კავშირი...BY<условие>
  • ᲐᲘᲠᲩᲘᲔ<ВиртуальнаяТаблица>(, <условие>)
  • ქონა<условие>

ყველა ამ პირობისთვის, რომელიც გამოიყენება მოთხოვნაში, უნდა არსებობდეს შესაფერისი ინდექსები, რათა მოხდეს მონაცემების შერჩევის ოპტიმიზაცია. უფრო მეტიც, შესაფერისი ინდექსი არის ის, რომელიც აკმაყოფილებს შემდეგ მოთხოვნებს:

  • მოთხოვნა 1. ინდექსი შეიცავს პირობაში ჩამოთვლილ ყველა ველს;
  • მოთხოვნა 2. ეს ველები არის ინდექსის დასაწყისში;
  • მოთხოვნა 3. ეს ველები ზედიზედ არის, ანუ ველები, რომლებიც არ არის ჩართული მოთხოვნის პირობაში, არ არის „ჩამოკიდებული“ მათ შორის;

1C:Enterprise-ის მიერ შექმნილი ძირითადი ინდექსები:

  • ინდექსი უნიკალური იდენტიფიკატორის მიხედვით(ბმული) ყველა ობიექტისთვის (ცნობარი, დოკუმენტი და ა.შ.);
  • რეგისტრატორის ინდექსი(დოკუმენტის ბმული) რეგისტრატორის დაქვემდებარებული რეესტრის გადაადგილების ცხრილებისთვის;
  • ყველა გაზომვის პერიოდისა და მნიშვნელობების ინდექსიდაგროვების რეგისტრების შემაჯამებელი ცხრილებისათვის;
  • ინდექსის პერიოდი, ანგარიში და ღირებულებებიყველა გაზომვა სააღრიცხვო რეესტრების საბოლოო ცხრილებისთვის.

იმ შემთხვევებში, როდესაც ავტომატურად შექმნილი ინდექსები არ არის საკმარისი, შეგიძლიათ დამატებით ინდექსირება მოახდინოს მეტამონაცემების ობიექტის დეტალებზე კონფიგურატორში. ამასთან, უნდა გავითვალისწინოთ, რომ ინდექსის შექმნა აჩქარებს ინფორმაციის ძიების პროცესს, მაგრამ შეიძლება გარკვეულწილად შეანელოს მომხმარებლის მიერ მისი შეცვლის პროცესი (დამატება, რედაქტირება და წაშლა) 1C საწარმოს გაშვების რეჟიმში. ამიტომ, ინდექსები უნდა შეიქმნას შეგნებულად და მხოლოდ იმ შემთხვევაში, თუ ზუსტად არის ცნობილი შეკითხვა, რომლისთვისაც საჭიროა ასეთი ინდექსი. თქვენ არ უნდა შექმნათ „ყოველ შემთხვევაში“ ინდექსები ან განზრახ ზედმეტი ინდექსები. მაგალითად, თქვენ არასოდეს არ უნდა დაამატოთ რეესტრის პირველი განზომილება, რადგან ჯამების ცხრილის მთავარი ინდექსი, რომელსაც პლატფორმა ავტომატურად შექმნის, შესაფერისია პირველი განზომილების მნიშვნელობით მოსაძიებლად.

კონფიგურაცია აღწერს დაგროვების რეგისტრს პროდუქტები საწყობებში:

ნახ 1. საწყობებში საქონლის დაგროვების რეესტრის სტრუქტურის მაგალითი

1C:Enterprise პლატფორმა ავტომატურად შექმნის ინდექსს ამ რეესტრის ბალანსის ცხრილისთვის პერიოდების მიხედვით და ყველა განზომილებით იმ თანმიმდევრობით, რომლითაც ისინი ჩამოთვლილია კონფიგურატორში.

მოდით გადავხედოთ რამდენიმე მაგალითის მოთხოვნას და გავაანალიზოთ, შესაძლებელია თუ არა მათი ოპტიმალურად შესრულება მონაცემთა ამ სტრუქტურით.

მოთხოვნა 1

მოთხოვნა . ტექსტი = "აირჩიე |საიდან , Nomenclature = &Nomenclature) AS პროდუქტები საწყობებში დარჩენილი";

ამ შემთხვევაში, მოთხოვნა 2 ირღვევა იმ პირობით, რომ არ არის შერჩეული ინდექსის პირველი ველი (საწყობი). ასეთი მოთხოვნა ოპტიმალურად არ შესრულდება. მის შესასრულებლად, DBMS სერვერს მოუწევს ცხრილის ყველა ჩანაწერის გამეორება (სკანირება). ამ ოპერაციის შესრულების დრო პირდაპირ დამოკიდებულია რეესტრის ნაშთების ცხრილში ჩანაწერების რაოდენობაზე და შეიძლება იყოს ძალიან დიდი (და გაიზრდება მონაცემთა რაოდენობის გაზრდით).

ოპტიმიზაციის პარამეტრები:

  • „ნომენკლატურის“ განზომილების ინდექსი
  • განზომილებების სიაში პირველ რიგში მოათავსეთ "ნომენკლატურის" განზომილება. ფრთხილად იყავით ამ მეთოდის გამოყენებისას. შეიძლება იყოს სხვა მოთხოვნები კონფიგურაციაში, რომლებიც შეიძლება შენელდეს ამ გაცვლის შედეგად.

მოთხოვნა 2

მოთხოვნა . ტექსტი = "აირჩიე | საქონელი საწყობებში ნარჩენები.საწყობი, | პროდუქტები საწყობებში ნარჩენების ნომენკლატურაში. | საქონელი საწყობებში რჩება.ხარისხი |საიდან | RegisterAccumulations.GoodsInWarehouses.Remains( | , | ხარისხი = & ხარისხი ;

ამ შემთხვევაში დარღვეულია მოთხოვნა მე-3 რეესტრის სტრუქტურაში „საწყობი“ და „ხარისხი“ განზომილებას შორის არის „ნომენკლატური“, რომელიც არ არის მითითებული მოთხოვნის პირობაში. ეს შეკითხვა ასევე ვერ შეძლებს ოპტიმალურად შესრულებას. შესრულებისას, DBMS მოძებნის ინდექსის პირველ ველს, მაგრამ შემდეგ იძულებული გახდება მისი ზოგიერთი ნაწილის სკანირება. სკანირება გამოიწვევს მოთხოვნის შესრულების დროის გაზრდას და ცხრილში ზედმეტი ჩანაწერების დაბლოკვას, ანუ მთლიანი სისტემის გამტარუნარიანობის შემცირებას.

ოპტიმიზაციის პარამეტრები:

  • დაამატეთ მოთხოვნას "ნომენკლატურის" განზომილების პირობა
  • მოთხოვნიდან ამოიღეთ „ხარისხის“ განზომილების პირობა
  • გადაიტანეთ "ნომენკლატურა" გაზომვებიდან დეტალებზე
  • შეცვალეთ "ნომენკლატურა" და "ხარისხი" ზომები

მოთხოვნა 3

მოთხოვნა . ტექსტი = "აირჩიე | საქონელი საწყობებში ნარჩენები.საწყობი, | პროდუქტები საწყობებში ნარჩენების ნომენკლატურაში. | საქონელი საწყობებში რჩება.ხარისხი, | პროდუქტები საწყობებში დარჩენილი.რაოდენობა დარჩენილი |საიდან | RegisterAccumulations.GoodsInWarehouses.Remains( | , | ნომენკლატურა = &ნომენკლატურა | AND Warehouse = &Warehouse) AS საქონელი საწყობებში დარჩენილი";

ამ შემთხვევაში ინდექსისა და მოთხოვნის შესატყვისი მოთხოვნები არ ირღვევა. ეს მოთხოვნა შესრულდება DBMS-ის მიერ ოპტიმალური გზით. გთხოვთ, გაითვალისწინოთ, რომ მოთხოვნაში პირობების თანმიმდევრობა არ უნდა ემთხვეოდეს ინდექსის ველების თანმიმდევრობას. ეს არ არის პრობლემა და ჩვეულებრივ დამუშავდება DBMS-ის მიერ.

4. ლოგიკური OR-ის გამოყენება პირობებში

4.1 ლოგიკური OR-ის გამოყენება მოთხოვნის WHERE განყოფილებაში

თქვენ არ უნდა გამოიყენოთ OR მოთხოვნის WHERE განყოფილებაში. ამან შეიძლება გამოიწვიოს DBMS-მა ვერ გამოიყენოს ცხრილის ინდექსები და განახორციელოს სკანირება, რაც გაზრდის მოთხოვნის შესრულების დროს და დაბლოკვის ალბათობას. ამის ნაცვლად, თქვენ უნდა გაყოთ ერთი შეკითხვა რამდენიმე ნაწილად და დააკავშიროთ შედეგები.

მაგალითად, მოთხოვნა

აირჩიეთ პროდუქტი . სახელი FROMდირექტორია . პროდუქტები HOW Product WHERE სტატია = "001" ანგამყიდველი კოდი = "002"

უნდა შეიცვალოს მოთხოვნით

აირჩიეთ პროდუქტი . სახელი FROMდირექტორია . პროდუქტები HOW Product WHERE სტატია = "001" |COMBINE ALL |პროდუქტის შერჩევა . სახელი FROMდირექტორია . პროდუქტები HOW Product WHERE სტატია = "002"

4.2. მომხმარებლების დარეგისტრირება მრავალ როლში, თითოეულს აქვს RLS

1 თან RLS (ჩანაწერი დონე უსაფრთხოება) ან უფლებების შეზღუდვა რეკორდულ დონეზე - ეს არის მომხმარებლის უფლებების დაყენება სისტემაში 1 თან, რომელიც საშუალებას გაძლევთ გამოყოთ მომხმარებლებისთვის უფლებები დინამიურად ცვალებადი მონაცემების კონტექსტში.

თუ კონფიგურაცია აღწერს რამდენიმე როლს RLS პირობებით, მაშინ არ უნდა მივანიჭოთ ერთზე მეტი ასეთი როლი ერთ მომხმარებელს. თუ ერთი მომხმარებელი შედის, მაგალითად, ორ როლში RLS-ში - ბუღალტერი და პერსონალის ოფიცერი, მაშინ როდესაც მისი ყველა მოთხოვნა შესრულდება, ორივე RLS-ის პირობები დაემატება მათ პირობებს ლოგიკური OR-ის გამოყენებით. ამ გზით, მაშინაც კი, თუ არ არის OR პირობა თავდაპირველ მოთხოვნაში, ის გამოჩნდება იქ RLS პირობების დამატების შემდეგ. ასეთი მოთხოვნა ასევე შეიძლება შესრულდეს არაოპტიმალურად - ნელა და ზედმეტი ჩაკეტვით.

ამის ნაცვლად, თქვენ უნდა შექმნათ „შერეული“ როლი - „ბუღალტერი-HR ოფიცერი“ და დაარეგისტრიროთ მისი RLS ისე, რომ თავიდან აიცილოთ OR-ის გამოყენება ამ მდგომარეობაში და ჩართოთ მომხმარებელი ამ ერთ როლში.

4.3 OR-ის გამოყენება კავშირის პირობებში

არ არის რეკომენდებული ლოგიკური OR-ის გამოყენება კავშირის პირობებში, ანუ მოთხოვნის პროგრამული უზრუნველყოფის განყოფილებაში. ამან ასევე შეიძლება გამოიწვიოს არაოპტიმალური გეგმის შერჩევა და შეკითხვის ნელი შესრულება. არ არსებობს მარტივი უნივერსალური გზა ასეთი შეკითხვის გადასაწერად OR-ის გამოყენების გარეშე. თქვენ უნდა გააანალიზოთ მოგვარებული პრობლემა და შეეცადოთ იპოვოთ მისი გადაჭრის სხვა ალგორითმი.

5. Subqueries-ის გამოყენება შეერთების მდგომარეობაში

თქვენ არ უნდა გამოიყენოთ ქვემოთხოვნები შეერთების მდგომარეობაში. ამან შეიძლება გამოიწვიოს მოთხოვნის მნიშვნელოვანი შენელება და (ზოგიერთ შემთხვევაში) მისი სრული უმოქმედობა ზოგიერთ DBMS-ზე. შეკითხვის მაგალითი, რომელიც იყენებს ქვემოთხოვნას შეერთების პირობებში:

მოთხოვნა . ტექსტი = "აირჩიე |საიდან | ფასები B პერიოდი. | SELECT MAXIMUM(Prices LastMonth.Period) | სარეგისტრაციო ინფორმაცია ფასი გასული თვის ფასების მიხედვით | WHERE ფასები გასულ თვეში.პერიოდი< НАЧАЛОПЕРИОДА(ОстаткиТоваров.Период, МЕСЯЦ) | და გასული თვის ფასები.ნომენკლატურა = დარჩენილი საქონელი.ნომენკლატურა |) | სად არის დარჩენილი საქონელი.საწყობი = &საწყობი";

ამ შემთხვევაში, ქვემოთხოვნა შეერთების მდგომარეობაში გამოიყენება წინა პერიოდის ბოლოს, თითქოსდა, „უახლესი ნაჭერის“ მისაღებად. უფრო მეტიც, თითოეული ნომენკლატურისთვის პერიოდი შეიძლება განსხვავებული იყოს. რეკომენდებულია ასეთი შეკითხვის გადაწერა დროებითი ცხრილების გამოყენებით. მაგალითად, ეს შეიძლება გაკეთდეს ასე:

მოთხოვნა . ტექსტი = " // ამ ნივთებისთვის წინა პერიოდში ფასების დადგენის მაქსიმალური თარიღები |არჩევა | დარჩენილი პროდუქტების ნომენკლატურა AS ნომენკლატურა, | MAXIMUM(Prices.Period) AS პერიოდი |ადგილის თარიღები ნომენკლატურების მიხედვით |საიდან | RegisterAccumulations.GoodsInWarehouses.Remainings(...) AS RemainingProducts | მარცხნივ კავშირი რეგისტრაციაInformation.Price AS ფასები | პროგრამული უზრუნველყოფის ფასები.ნომენკლატურა = დარჩენილი პროდუქტები.ნომენკლატურა და | ფასები.პერიოდი< НАЧАЛОПЕРИОДА(ОстаткиТоваров.Период, МЕСЯЦ) | ჯგუფი დარჩენილი პროდუქტების მიხედვით.ნომენკლატურა | WHERERemainingItems.Warehouse = &Warehouse; // აირჩიეთ მონაცემები ფასის მიხედვით ნაპოვნი პერიოდისთვის |არჩევა | Dates By Nomenclatures.Nomenclature AS Nomenclature, | ფასები.ფასი გასული თვის ფასი |FROM DateBy ნომენკლატურებიდან | მარცხნივ კავშირი რეგისტრაციაInformation.Price AS ფასები | პროგრამული უზრუნველყოფის ფასები.ნომენკლატურა = დარჩენილი პროდუქტები.ნომენკლატურა და | ფასები.პერიოდი = თარიღები ნომენკლატურების მიხედვით.პერიოდი " ;

6. მონაცემების მიღება წერტილის მეშვეობით კომპოზიტური ტიპის ველებიდან

თუ მოთხოვნა იყენებს წერტილოვან მნიშვნელობას რთული მითითების ტიპის ველიდან, მაშინ ამ მოთხოვნის შესრულებისას შეერთება განხორციელდება ყველა ობიექტის ცხრილთან, რომელიც შედის ამ კომპლექსურ ტიპში. შედეგად, SQL ხდის მოთხოვნის ტექსტს უკიდურესად რთულს და მისი შესრულებისას, DBMS ოპტიმიზატორს შეუძლია აირჩიოს არაოპტიმალური გეგმა. ამან შეიძლება გამოიწვიოს მუშაობის სერიოზული პრობლემები და ზოგიერთ შემთხვევაში შეკითხვის წარუმატებლობაც კი.

კერძოდ, არ არის რეკომენდებული რეესტრის რეგისტრატორის დეტალებზე წვდომა (მაგალითად, „ProductsInWarehouses.Registrar.Date“) და ა.შ. ამ შემთხვევაში არ აქვს მნიშვნელობა მოთხოვნის რომელ ნაწილში იყენებთ წერტილის მეშვეობით მიღებულ ატრიბუტს რთული ტიპის ველიდან - დაბრუნებული ველების სიაში, მდგომარეობაში და ა.შ. ყველა შემთხვევაში, ამ მკურნალობამ შეიძლება გამოიწვიოს მუშაობის პრობლემები.

  • მოერიდეთ ზედმეტობას კომპოზიციური მიმართვის ტიპების ველების შექმნისას. საჭიროებისამებრ მიუთითეთ მოცემული ველისთვის რაც შეიძლება მეტი ტიპი. თქვენ არ უნდა გამოიყენოთ ზედმეტად ტიპები „ნებისმიერი ბმული“ ან „ნებისმიერი დოკუმენტის ბმული“ და ა.შ. ამის ნაცვლად, თქვენ უნდა გაანალიზოთ თქვენი განაცხადის ლოგიკა უფრო ფრთხილად და მიაკუთვნოთ ზუსტად ის შესაძლო მიმართვის ტიპები ველს, რომელიც აუცილებელია პრობლემის გადასაჭრელად.
  • საჭიროების შემთხვევაში, შესწირეთ კომპაქტური საცავი შესრულებისთვის. თუ თქვენს მოთხოვნაში დაგჭირდათ მითითების საშუალებით მიღებული მნიშვნელობა, მაშინ შესაძლოა ეს მნიშვნელობა შეინახოს პირდაპირ ამ ობიექტში. მაგალითად, თუ რეესტრთან მუშაობისას გჭირდებათ ინფორმაცია რეგისტრატორის თარიღის შესახებ, შეგიძლიათ შექმნათ შესაბამისი დეტალები რეესტრში და მიანიჭოთ მას მნიშვნელობა დოკუმენტების განთავსებისას. ეს გამოიწვევს ინფორმაციის დუბლირებას და მისი მოცულობის გარკვეულ (ოდნავ) ზრდას, მაგრამ შეიძლება მნიშვნელოვნად გააუმჯობესოს მოთხოვნის შესრულება და სტაბილურობა.
  • საჭიროების შემთხვევაში, შესწირეთ კოდის კომპაქტურობა და მრავალფეროვნება შესრულებისთვის. როგორც წესი, მოცემულ პირობებში კონკრეტული მოთხოვნის შესასრულებლად არ არის საჭირო მოცემული ბმულის ყველა შესაძლო ტიპი. ამ შემთხვევაში, თქვენ უნდა შეზღუდოთ შესაძლო ტიპების რაოდენობა EXPRESS ფუნქციის გამოყენებით. თუ ეს მოთხოვნა უნივერსალურია და გამოიყენება რამდენიმე განსხვავებულ სიტუაციაში (სადაც ბმულის ტიპები შეიძლება განსხვავებული იყოს), მაშინ თქვენ შეგიძლიათ შექმნათ მოთხოვნა დინამიურად, ჩაანაცვლოთ EXPRESS ფუნქციის ტიპი, რომელიც აუცილებელია ამ პირობებში. ეს გაზრდის წყაროს კოდის ზომას და შესაძლოა მას ნაკლებად უნივერსალურს გახდის, მაგრამ შეიძლება მნიშვნელოვნად გააუმჯობესოს მოთხოვნის შესრულება და სტაბილურობა.

მაგალითი

ეს მოთხოვნა იყენებს წვდომას რეგისტრატორის დეტალებზე. რეგისტრატორი არის კომპოზიციური ტიპის ველი, რომელსაც შეუძლია მიიღოს საცნობარო მნიშვნელობები 56 დოკუმენტიდან ერთ-ერთ ტიპზე.

მოთხოვნა . ტექსტი = "აირჩიე | გაყიდვები.რეგისტრატორი.ნომერი, | გაყიდვები.რეგისტრატორი.თარიღი, | გაყიდვები. | გაყიდვები, რაოდენობა, | გაყიდვები.ღირებულება |საიდან |სად...

ამ მოთხოვნის SQL ტექსტი შეიცავს 56 მარცხენა შეერთებას დოკუმენტის ცხრილებთან. ამან შეიძლება გამოიწვიოს მუშაობის სერიოზული პრობლემები მოთხოვნის გაშვებისას. თუმცა, ამ კონკრეტული პრობლემის გადასაჭრელად არ არის საჭირო 56-ვე ტიპის დოკუმენტთან დაკავშირება. მოთხოვნის პირობები ისეთია, რომ მისი შესრულებისას შეირჩევა მხოლოდ დოკუმენტების მოძრაობა „საქონლისა და მომსახურების გაყიდვები“ და „მყიდველის შეკვეთები“. ამ შემთხვევაში, ჩვენ შეგვიძლია მნიშვნელოვნად დავაჩქაროთ მოთხოვნა EXPRESS() ფუნქციის გამოყენებით კავშირების რაოდენობის შეზღუდვით.

მოთხოვნა . ტექსტი = "აირჩიე | არჩევანი | შემდეგ EXPRESS (გაყიდვები. რეგისტრატორი AS დოკუმენტი. საქონლისა და მომსახურების გაყიდვები). ნომერი | შემდეგ EXPRESS (გაყიდვები. რეგისტრატორი, როგორც დოკუმენტი. მყიდველის შეკვეთა). ნომერი | END SELECTION AS ნომერი, | არჩევანი | საქონლისა და სერვისების გაყიდვების ლინკი | შემდეგ EXPRESS (გაყიდვები. რეგისტრატორი AS დოკუმენტი. საქონლისა და მომსახურების გაყიდვები). თარიღი | WHEN Sales.რეგისტრატორის ლინკი Document.Buyer Order | შემდეგ EXPRESS (გაყიდვები. რეგისტრაცია როგორც დოკუმენტი. მყიდველის შეკვეთა). თარიღი | შერჩევის დასრულება თარიღის მიხედვით, | გაყიდვები. | გაყიდვები, რაოდენობა, | გაყიდვები.ღირებულება |საიდან | RegisterAccumulations.Sales HOW გაყიდვები |სად | გაყიდვები.რეგისტრატორის ლინკი დოკუმენტი.საქონლისა და მომსახურების გაყიდვები | ან გაყიდვები. რეგისტრატორის ბმული დოკუმენტი. მყიდველის შეკვეთები";

ეს მოთხოვნა უფრო შრომატევადი და შესაძლოა ნაკლებად ზოგადია (ის არ იმუშავებს სწორად სხვა სიტუაციებში - სადაც შესაძლებელია სხვა ლოგერის ტიპის მნიშვნელობები). თუმცა, როდესაც შესრულდება, SQL მოთხოვნა წარმოიქმნება, რომელიც შეიცავს მხოლოდ ორ კავშირს დოკუმენტის ცხრილებთან. ასეთი მოთხოვნა იმუშავებს ბევრად უფრო სწრაფად და სტაბილურად, ვიდრე მოთხოვნა თავდაპირველი ფორმით.

7. ვირტუალური ცხრილების გაფილტვრა პარამეტრების გამოყენების გარეშე

შეკითხვებში ვირტუალური ცხრილების გამოყენებისას, ამ ვირტუალურ ცხრილთან დაკავშირებული ყველა პირობა უნდა გადასცეთ ცხრილის პარამეტრებს. არ არის რეკომენდებული ვირტუალური ცხრილების გაფილტვრა პირობების გამოყენებით WHERE განყოფილებაში და ა.შ. ასეთი შეკითხვა დააბრუნებს სწორ (ფუნქციონალური თვალსაზრისით) შედეგს, მაგრამ DBMS-ისთვის გაცილებით რთული იქნება მისი შესრულების ოპტიმალური გეგმის არჩევა. ზოგიერთ შემთხვევაში, ამან შეიძლება გამოიწვიოს შეცდომები DBMS ოპტიმიზატორში და შეკითხვის შესრულების მნიშვნელოვანი შენელება.

მაგალითად, შემდეგი მოთხოვნა იყენებს მოთხოვნის WHERE განყოფილებას ვირტუალური ცხრილიდან ასარჩევად.

მოთხოვნა . ტექსტი = "აირჩიე | ნომენკლატურა |საიდან | RegisterAccumulations.GoodsInWarehouses.Remains() |სად | საწყობი = &საწყობი";

შესაძლებელია, რომ ამ მოთხოვნის შესრულების შედეგად, ჯერ შეირჩეს ვირტუალური ცხრილის ყველა ჩანაწერი, შემდეგ კი მათგან შეირჩეს ის ნაწილი, რომელიც შეესაბამება მითითებულ მდგომარეობას. უმჯობესია შეზღუდოთ ჩანაწერების რაოდენობა, რომლებიც მოტანილია შეკითხვის პროცესში ძალიან ადრე. ამისათვის თქვენ უნდა გადასცეთ პირობები ვირტუალური ცხრილის პარამეტრებს.

მოთხოვნა . ტექსტი = "აირჩიე | ნომენკლატურა |საიდან | RegisterAccumulations.GoodsInWarehouses.Remains(, Warehouse = &Warehouse)";