Алексей Селихин
В любом деле всегда есть люди, которые только используют результат, не заботясь о том, как он получен и можно ли получить большего. Но есть и те, кто готов погрузиться с головой в тонкости для того, чтобы получить все возможное! Эта статья именно для таких максималистов, которые выжимают все соки из того, с чем работают.
Платформа предоставляет множество инструментов гибкой настройки источников данных. Сегодня мы поговорим об одном из них, о стратегии фильтрации.
Что такое стратегии фильтрации
Стратегии фильтрации, что же это такое? Это не что иное, как набор параметров, в соответствии с которыми будет формироваться запрос для извлечения данных при построении куба. И, управляя этими параметрами, можно с учетом особенности данных повлиять на скорость их извлечения.
Здорово! Не терпится попробовать? Так в чем дело? Настройки прямо перед нами!
Настройки достаточно просты, ничего лишнего, только то, что действительно нужно. Находятся они на странице «Измерения» мастера редактирования кубов и состоят из трех логических частей:
1. Часть выбора измерения, для которого будет настроена стратегия фильтрации.
2. Выбор метода фильтрации и параметров выбранного метода.
3. Настройка использования временной таблицы.
И если на первой останавливаться смысла нет, то об оставшихся двух частях давайте поговорим подробнее.
Параметры метода фильтрации
Что же это за параметры, и как определиться, какие из них выбрать? Все проще, чем кажется!
Работая с частью диалога «параметры фильтрации», нужно решить, пожалуй, самую сложную задачу, а именно, выбрать метод фильтрации. Метод фильтрации позволяет определить, каким образом будет формироваться та часть запроса, которая отвечает за фильтрацию элементов по измерению.
У нас на выбор всего несколько методов. И выбирать, конечно же, стоит исходя из поставленной задачи и особенностей планируемой работы с данными. Имея одни и те же входные данные, выберем метод фильтрации, основываясь на предполагаемом использовании. А данные у нас будут такие: небольшой куб с территориальным измерением в несколько сотен элементов.
1. В случае если мы заранее знаем, что данные будут использоваться исключительно в разрезе только самых крупных стран, а остальные не будут использоваться вовсе, то, конечно стоит выбрать метод
«Фильтровать по условию IN», который по умолчанию предлагает комплекс. Поскольку отметка всегда будет небольшой, но, вероятно, разрозненной, запрос будет оптимальным и иметь вид:
select a.* from (select a.DATE1,a.DATE2,a.COUNTRY,a.COUNTRYOWNER,a.INDICATOR,a.VALUE from dbo.OBJ20021359DATA a) a where ((a.DATE1 = 1)) and ((a.DATE2 in ({d’2010-01-01′},{d’2011-01-01′},{d’2012-01-01′},{d’2013-01-01′},{d’2014-01-01′},{d’2015-01-01′}))) and ((a.COUNTRY in (1,80, 138, 164))) and ((a.COUNTRYOWNER = 1)) and ((a.INDICATOR = 1)).
Отлично. Но, конечно, чем больше справочник и чем меньше его отметка, тем меньше применим этот метод, и запрос будет расти со всеми накладными расходами.
Также не стоит забывать, что если мы не выбрали метод с условием IN сами, а оставили значение по умолчанию, то в ряде случаев, например, для календарного измерения будет использоваться оператор BETWEEN. А конкретно – для фильтрации элементов различных уровней, если календарное измерение построено с использованием общего первичного ключа (значения всех уровней хранятся в одной таблице), и для фильтрации элементов дневной динамики.
2. Если же в ходе работы планируется, что справочник территорий практически всегда будет выделен полностью, то стоит использовать метод
«Извлекать все записи независимо от отметки». При этом извлекаются все записи независимо от отметки, а затем фильтруются на клиенте. В запросе будут отсутствовать какие-либо операторы, связанные с фильтрацией элементов измерения. Запрос будет выглядеть следующим образом:
select a.* from (select a.DATE1,a.DATE2,a.COUNTRY,a.COUNTRYOWNER,a.INDICATOR,a.VALUE from dbo.OBJ20021359DATA a) a where ((a.DATE1 = 1)) and ((a.DATE2 in ({d’2010-01-01′},{d’2011-01-01′},{d’2012-01-01′},{d’2013-01-01′},{d’2014-01-01′},{d’2015-01-01′})))
and ((a.COUNTRYOWNER = 1)) and ((a.INDICATOR = 1)).
Да, для сравнительно небольших справочников такой вариант хорош, но при более громоздких делать полную выборку нецелесообразно, для этого и используются компромиссные варианты.
3. Так, если мы знаем, что при работе большую часть времени отметка справочника не будет минимальной, и также не будет почти полной, то стоит воспользоваться одним из методов
«Фильтровать в зависимости от количества отмеченных» и
«Фильтровать в зависимости от отметки». По сути это один и тот же метод, с разницей лишь в том, каким образом задать ту границу, на которой будет происходить смена формирования запроса с использования iIN на использование BETWEEN. Задать границу можно либо точным числом элементов в отметке в первом случае, либо же процентом от общего числа элементов во втором.
Запрос формируется по понятным правилам. Если отметка меньше указанной границы, то запрос формируется с использованием оператора IN. Если же она равна границе, то формирование происходит с использованием оператора BETWEEN относительно первого и последнего отмеченных элементов. А в случае, если отметка больше чем заданная граница, то – с использованием оператора BETWEEN относительно всех элементов измерения.
Посмотрим на примере с указанием границы по количеству и выберем в качестве этой границы 10.
В случае, если отмечено меньше 10 элементов:
select a.* from (select a.DATE1,a.DATE2,a.COUNTRY,a.COUNTRYOWNER,a.INDICATOR,a.VALUE from dbo.OBJ20021359DATA a) a where ((a.DATE1 = 1)) and ((a.DATE2 in ({d’2010-01-01′},{d’2011-01-01′},{d’2012-01-01′},{d’2013-01-01′},{d’2014-01-01′},{d’2015-01-01′}))) and ((a.COUNTRY in (1,2,3,4,5,6,7))) and ((a.COUNTRYOWNER = 1)) and ((a.INDICATOR = 1)),
а при более чем 10 уже:
select a.* from (select a.DATE1,a.DATE2,a.COUNTRY,a.COUNTRYOWNER,a.INDICATOR,a.VALUE from dbo.OBJ20021359DATA a) a where ((a.DATE1 = 1)) and ((a.DATE2 in ({d’2010-01-01′},{d’2011-01-01′},{d’2012-01-01′},{d’2013-01-01′},{d’2014-01-01′},{d’2015-01-01′}))) and ((a.COUNTRY between 1 and 16)) and ((a.COUNTRYOWNER = 1)) and ((a.INDICATOR = 1)).
Возникает вопрос, как же выбрать границу? Однозначного ответа тут нет, нужно провести тесты, попробовать с различными величинами границы, смоделировать, какие из отметок будут использоваться чаще, какие реже, и уже на основании этого сделать свой выбор.
И остается только решить, стоит ли использовать временную таблицу?!
И тут вновь нельзя сказать однозначно, использовать или нет, все решается в каждом конкретном случае. Данный флаг становится доступным при выборе метода фильтрации
«Фильтровать в зависимости от отметки» и
«Фильтровать в зависимости от количества отмеченных». Флаг по умолчанию снят. Установка флага позволяет при передаче отметки использовать временную таблицу, что ускоряет процесс формирования IN. Но вместе с тем само использование этой временной таблицы может привести к замедлению работы.
Ну вот и все, что же дальше?
А что же дальше? Дальше можно только получать удовольствие от хорошо сделанной работы. И радоваться, что тот, кто будет использовать данные, будет это делать пусть немного, но быстрее и удобнее.