Sql server: пошук або сканування




SQL Server: пошук або сканування
демонстраційні дані

Демонстраційні дані для статті сформовані за допомогою коду, наведеного нижче.

SQL Server: пошук або сканування
Код для створення тестових даних

Код створює таблицю Orders, що містить 1 000000 замовлень, таблицю Employees, що містить 200 співробітників компанії, з яких 100 займалися обробкою замовлень, і таблицю Customers, що містить 40000 клієнтів, з яких 20000 розміщували замовлення. Для ілюстрації вибору оптимального рішення код створює кілька індексів в таблиці Orders.

Сканування проти пошуку

Відео: VB.NET - How To Search Values From SQL Server Database And Set It Into TextBox In Vb.Net [with code]


Існує багато завдань, що вирішуються із застосуванням окремих груп логіки, яка передбачає аналіз однієї або декількох рядків у кожної групи, наприклад:
• напівз`єднання (наявність) і анти-напівз`єднання (відсутність). Наприклад, висновок працівників компанії, що займалися або які не працювали обробкою замовлень, висновок клієнтів, що розміщували підключити або відключити замовлення.
• Значення min або max для групи. Наприклад, висновок максимального ID замовлення для кожного співробітника компанії / клієнта.
• N верхніх позицій для групи. Наприклад, висновок замовлення з максимальним ID для кожного співробітника компанії або клієнта.

При вирішенні таких завдань корисно застосовувати POC-індекс, побудований для великої таблиці (в нашому випадку Orders). Абревіатура РОС походить від назв елементів, що беруть участь в запиті і фігурують в описі індексу: секціонування (Partitioning), сортування (Ordering) і покриття (Coverage). Наприклад, для завдання «вивести замовлення (orderid, orderdate, empid, custid) з максимальним ID» Р = empid, О = orderid DESC, a C = orderdate, custid. Елементи P і Про складають список ключа індексу, а елемент С - список INCLUDE. Дійсно, один з індексів, що створюються в коді, представленому вище, для демонстрації оптимізації вирішення такого завдання за допомогою POC-індексу, наступний:



CREATE INDEX idx_eid_oid_i_od_cidON dbo.Orders (empid, orderid DESC) INCLUDE (orderdate, custid) -

Що примітно, в залежності від щільності елемента «група або секціонування», перевагу надають різні стратегії оптимізації.

Якщо елемент «секціонування» має велику щільність (мале число значень, кожне з яких зустрічається багато разів), найкращою стратегією буде пошук в індексі по кожному значенню. Наприклад, стовпець empid в таблиці Orders має велику щільність (100 різних ID співробітників компанії). Тому оптимальною стратегією виведення замовлення з максимальним ID буде сканування таблиці Employees і циклічне застосування пошуку в POC-індексі до таблиці Orders для кожного співробітника. З огляду на, що в таблицю Employees внесено 200 працівників компанії, це виллється в 200 операцій пошуку, що означає в сумі кілька сотень операцій читання. Для порівняння, повне сканування POC-індексу виллється в кілька тисяч операцій читання.

З іншого боку, стовпець custid має малу щільність у таблиці Orders (20000 різних ID клієнтів). З огляду на, що таблиця Customers містить 40000 клієнтів, стратегія пошукових проходів буде реалізована ціною сотні тисяч операцій читання, тоді як сканування обійдеться всього в кілька тисяч таких операцій.

SQL Server: пошук або сканування

Відео: SQL Server 2016


Іншими словами, для завдань, які передбачають аналіз за групами, що вимагає перегляду невеликого числа рядків для кожної групи, при малій щільності оптимальним є сканування, тоді як при великій щільності - пошук. Тепер повернемося до розгляду наших прикладів і з`ясуємо, в яких випадках оптимізатор самостійно приходить до найкращої стратегії, а коли йому потрібна допомога.


Завдяки цій статті довели роботу SQL Server до ідеалу і за це отримали пристойну премію від начальства! Тепер ви можете відвідати сторінку https://skymotors.com.ua/auto/lexus/lx (https://skymotors.com.ua/auto/lexus/lx) і придбати машину, про яку ви завжди мріяли, - LEXUS LX . До речі, тільки тут ви зможете зробити таку покупку на максимально вигідних для себе умови.

ІНШЕ

» » Sql server: пошук або сканування