«Форсайт. Аналитическая платформа»: cтратегии фильтрации

Блог Форсайт
Алексей Селихин
В любом деле всегда есть люди, которые только используют результат, не заботясь о том, как он получен и можно ли получить большего. Но есть и те, кто готов погрузиться с головой в тонкости для того, чтобы получить все возможное! Эта статья именно для таких максималистов, которые выжимают все соки из того, с чем работают. Платформа предоставляет множество инструментов гибкой настройки источников данных. Сегодня мы поговорим об одном из них, о стратегии фильтрации.

Что такое стратегии фильтрации

Стратегии фильтрации, что же это такое? Это не что иное, как набор параметров, в соответствии с которыми будет формироваться запрос для извлечения данных при построении куба. И, управляя этими параметрами, можно с учетом особенности данных повлиять на скорость их извлечения. Здорово! Не терпится попробовать? Так в чем дело? Настройки прямо перед нами! Настройки достаточно просты, ничего лишнего, только то, что действительно нужно. Находятся они на странице «Измерения» мастера редактирования кубов и состоят из трех логических частей: 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. Но вместе с тем само использование этой временной таблицы может привести к замедлению работы.

Ну вот и все, что же дальше?

А что же дальше? Дальше можно только получать удовольствие от хорошо сделанной работы. И радоваться, что тот, кто будет использовать данные, будет это делать пусть немного, но быстрее и удобнее.

Комментарии

Email не будет опубликован.
Подробнее о политике использования персональных данных