Отримання даних через точку від полів складеного типу в запиті

Друзі, добрий день! Сьогодні ми поговоримо з вами про таку чудову явище як отримання даних через точку від полів складеного типу в запиті. Звичайно ж, всі ми знаємо, що так робити не можна :). Але багато хто не знає, а що ж насправді відбувається і чому не можна.

Ось живий приклад: надійшло звернення про повільне виконання простого дії – відкриття форми вибору від 2-х секунд до 2-х хвилин. Коли я відкрив запит, я очікував побачити онучу на кілька сторінок, але побачив це:

Найпростіший запит, в якому немає нічого цікавого на перший погляд. Крім цього:

Заходимо в конфігуратор і дивимося, який же тип у цього загадкового об’єкта:

Все скромно :). На практиці ж, у даного поля складовою тип з усіх довідників і всіх документів. Разом: 657 штук!

Так ось, в MSSQL немає такого поняття як складової тип даних. Тобто таке поле 1С в БД складається з 2-х полів. Власне ідентифікатор посилання і тип даних.

І коли ми хочемо щось витягнути з такого об’єкта, то системі доводиться шукати цей об’єкт за всіма можливими типами, що тут і сталося.

У Profiler`е це виглядало приблизно так:

Величезна кількість читань з диска, високе завантаження ЦП і тривалість виконання цього запиту майже 3 секунди. І це на базі з демонстраційними даними.

Текст отриманого SQL запиту приводити немає сенсу. використовується 657 (!) лівих з’єднань. Відповідно, ні про яку роботу оптимізатора не йде і мови, тому що СУБД вважає, що придумувати оптимізацію цього пекла довше, ніж просто виконати його.

План запиту Profiler не зміг відобразити.

У даній ситуації отримання посилання надлишково, тому що саме поле і є та сама посилання. Переписавши запит нижче ми отримаємо наступне:

І результати в Profiler`е:

План запиту:

Запит виконується миттєво. Таким чином, намагайтеся уникати отримання даних через точку від полів складеного типу.

Якщо ж це неможливо, то постарайтеся обмежити кількість типів в запиті.

Наприклад, в ситуації вище нам треба було б витягнути поле «організація». Але ми знаємо за умовою задачі, що типи можливі тільки «Надходження товарів і послуг»І«Реалізація товарів і послуг».

Ссылка на основную публикацию