Автор Тема: Seek Where при выполнении запроса  (Прочитано 907 раз)

0 Пользователей и 1 Гость просматривают эту тему.

akcent87

  • Новичок
  • *
  • Сообщений: 1
Seek Where при выполнении запроса
« : Март 15, 2017, 01:09:13 pm »
Добрый день! Коллеги, не совсем могу понять почему выполняется частичное сканирование таблицы (оператор Where) при выполнении запроса к таблице оборотов. Дано: Регистр накопления ЗаявкиНаВключение - тип Обороты, Состав измерений: Заявка, Сценарий, ЦФО. Делаю следующий запрос:
"ВЫБРАТЬ
    ЗаявкиНаВключениеСуммыВБюджетОбороты.Заявка КАК Заявка
ИЗ
    РегистрНакопления.СГМ_ЗаявкиНаВключениеСуммыВБюджет.Обороты(&Начало, &Конец, , Заявка = &Заявка)) КАК ЗаявкиНаВключениеСуммыВБюджетОбороты
".
Далее смотрю что происходит в Profiler, и вижу что при выполнении запроса MS SQL применяет следующие операторы:
"Clustered Index Seek(OBJECT:([1C_Test].[dbo].[_AccumRgTn33762].[_Accum33762_ByDims_TRRRRRRRRRN] AS [T2]), SEEK:(([T2].[_Period], [T2].[_Fld33751RRef]) >= ([      ЕСЛИ ВЫ ПОДЕЛИЛИСЬ СВОЕЙ ПОЧТОЙ, УДАЛИТЕ СООБЩЕНИЕ НЕМЕДЛЕННО ИЛИ БУДЕТЕ ЗАБАНЕНЫ. ЧИТАЙТЕ ПРАВИЛА!!!     P1], [      ЕСЛИ ВЫ ПОДЕЛИЛИСЬ СВОЕЙ ПОЧТОЙ, УДАЛИТЕ СООБЩЕНИЕ НЕМЕДЛЕННО ИЛИ БУДЕТЕ ЗАБАНЕНЫ. ЧИТАЙТЕ ПРАВИЛА!!!     P3]) AND [T2].[_Period] < [      ЕСЛИ ВЫ ПОДЕЛИЛИСЬ СВОЕЙ ПОЧТОЙ, УДАЛИТЕ СООБЩЕНИЕ НЕМЕДЛЕННО ИЛИ БУДЕТЕ ЗАБАНЕНЫ. ЧИТАЙТЕ ПРАВИЛА!!!     P2]),  WHERE:([1C_Test].[dbo].[_AccumRgTn33762].[_Fld33751RRef] as [T2].[_Fld33751RRef]=[      ЕСЛИ ВЫ ПОДЕЛИЛИСЬ СВОЕЙ ПОЧТОЙ, УДАЛИТЕ СООБЩЕНИЕ НЕМЕДЛЕННО ИЛИ БУДЕТЕ ЗАБАНЕНЫ. ЧИТАЙТЕ ПРАВИЛА!!!     P3])".
Как мне казалось, исходя из строения индексов таблицы Обороты (Период + Измерение1 + ... + ИзмерениеN (Кластерный) + Splitter.), планировщик SQL должен был сделать только поиск (Seek)  без частичного сканирования (WHERE). Данное поведение системы приводит к излишнему блокированию данных в таблице из за чего нарушается параллельность работы пользователей. Коллеги, почему в данном случае применяется оператор Seek WHERE?