Биты и байты.

Биты и байты.

четверг, 20 марта 2014 г.

Собери свою аналитическую панель с Анаплан.

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

На панель можно опубликовать любой элемент будь то список, график, действия , фильтры или отдельные показатели .
Для модулей доступны например три опции добавить на панель модуль, показатель или  фильтры.
Публикация обычна доступна из меню View.

После добавления можно изменить расположение элементов, войдя в режим редактирования макета панели

Кроме этого для каждого элемента доступны его настройки, в том числе и синхронизация с фильтрами.
Если синхронизация по  измерениям не требуется, заходим в Selection Options и снимаем отключаем  Synchronized Paging у требуемого измерения


Дополнительно доступны действия  в виде кнопок на аналитической панели
Список доступных действий
Processes: Запуск последовательности импортов, экспортов.
Imports: Импорт данных.
Exports: Экспорт данных.
Other Actions: в прочие действия входят Open Dashboard: перейти на панель,
и действия над списками удалить элементы, создать, привязать элементы к списку и скопировать дочерние элементы.

среда, 19 марта 2014 г.

SQL сервер, чего сидим, кого ждем?

Очень часто бывают ситуации, когда сервер очень долго  обрабатывает запросы пользователей.
Никто не хочет ждать, ведь деньги это время)
Чтобы понять в чем причина, можно воспользоваться запросом
позволяющим проанализировать статистику ожиданий и блокировок,
собранной в sys.dm_os_wait_stats и sys.dm_os_latch_stats.


WITH [Waits] AS
    (SELECT
        [wait_type],
        [wait_time_ms] / 1000.0 AS [WaitS],
        ([wait_time_ms] - [signal_wait_time_ms]) / 1000.0 AS [ResourceS],
        [signal_wait_time_ms] / 1000.0 AS [SignalS],
        [waiting_tasks_count] AS [WaitCount],
        100.0 * [wait_time_ms] / SUM ([wait_time_ms]) OVER() AS [Percentage],
        ROW_NUMBER() OVER(ORDER BY [wait_time_ms] DESC) AS [RowNum]
    FROM sys.dm_os_wait_stats
    WHERE [wait_type] NOT IN (
        N'BROKER_EVENTHANDLER',         N'BROKER_RECEIVE_WAITFOR',
        N'BROKER_TASK_STOP',            N'BROKER_TO_FLUSH',
        N'BROKER_TRANSMITTER',          N'CHECKPOINT_QUEUE',
        N'CHKPT',                       N'CLR_AUTO_EVENT',
        N'CLR_MANUAL_EVENT',            N'CLR_SEMAPHORE',
        N'DBMIRROR_DBM_EVENT',          N'DBMIRROR_EVENTS_QUEUE',
        N'DBMIRROR_WORKER_QUEUE',       N'DBMIRRORING_CMD',
        N'DIRTY_PAGE_POLL',             N'DISPATCHER_QUEUE_SEMAPHORE',
        N'EXECSYNC',                    N'FSAGENT',
        N'FT_IFTS_SCHEDULER_IDLE_WAIT', N'FT_IFTSHC_MUTEX',
        N'HADR_CLUSAPI_CALL',           N'HADR_FILESTREAM_IOMGR_IOCOMPLETION',
        N'HADR_LOGCAPTURE_WAIT',        N'HADR_NOTIFICATION_DEQUEUE',
        N'HADR_TIMER_TASK',             N'HADR_WORK_QUEUE',
        N'KSOURCE_WAKEUP',              N'LAZYWRITER_SLEEP',
        N'LOGMGR_QUEUE',                N'ONDEMAND_TASK_QUEUE',
        N'PWAIT_ALL_COMPONENTS_INITIALIZED',
        N'QDS_PERSIST_TASK_MAIN_LOOP_SLEEP',
        N'QDS_CLEANUP_STALE_QUERIES_TASK_MAIN_LOOP_SLEEP',
        N'REQUEST_FOR_DEADLOCK_SEARCH', N'RESOURCE_QUEUE',
        N'SERVER_IDLE_CHECK',           N'SLEEP_BPOOL_FLUSH',
        N'SLEEP_DBSTARTUP',             N'SLEEP_DCOMSTARTUP',
        N'SLEEP_MASTERDBREADY',         N'SLEEP_MASTERMDREADY',
        N'SLEEP_MASTERUPGRADED',        N'SLEEP_MSDBSTARTUP',
        N'SLEEP_SYSTEMTASK',            N'SLEEP_TASK',
        N'SLEEP_TEMPDBSTARTUP',         N'SNI_HTTP_ACCEPT',
        N'SP_SERVER_DIAGNOSTICS_SLEEP', N'SQLTRACE_BUFFER_FLUSH',
        N'SQLTRACE_INCREMENTAL_FLUSH_SLEEP',
        N'SQLTRACE_WAIT_ENTRIES',       N'WAIT_FOR_RESULTS',
        N'WAITFOR',                     N'WAITFOR_TASKSHUTDOWN',
        N'WAIT_XTP_HOST_WAIT',          N'WAIT_XTP_OFFLINE_CKPT_NEW_LOG',
        N'WAIT_XTP_CKPT_CLOSE',         N'XE_DISPATCHER_JOIN',
        N'XE_DISPATCHER_WAIT',          N'XE_TIMER_EVENT')
    )
SELECT
    [W1].[wait_type] AS [WaitType],
    CAST ([W1].[WaitS] AS DECIMAL (16, 2)) AS [Wait_S],
    CAST ([W1].[ResourceS] AS DECIMAL (16, 2)) AS [Resource_S],
    CAST ([W1].[SignalS] AS DECIMAL (16, 2)) AS [Signal_S],
    [W1].[WaitCount] AS [WaitCount],
    CAST ([W1].[Percentage] AS DECIMAL (5, 2)) AS [Percentage],
    CAST (([W1].[WaitS] / [W1].[WaitCount]) AS DECIMAL (16, 4)) AS [AvgWait_S],
    CAST (([W1].[ResourceS] / [W1].[WaitCount]) AS DECIMAL (16, 4)) AS [AvgRes_S],
    CAST (([W1].[SignalS] / [W1].[WaitCount]) AS DECIMAL (16, 4)) AS [AvgSig_S]
FROM [Waits] AS [W1]
INNER JOIN [Waits] AS [W2]
    ON [W2].[RowNum] <= [W1].[RowNum]
GROUP BY [W1].[RowNum], [W1].[wait_type], [W1].[WaitS],
    [W1].[ResourceS], [W1].[SignalS], [W1].[WaitCount], [W1].[Percentage]
HAVING SUM ([W2].[Percentage]) - [W1].[Percentage] < 95; -- percentage threshold
GO

По результату  можно проанализировать  в чем проблема, дисковая подсистема,
большие объемы данных передаваемые по сети,  нехватка оперативной памяти и тд,
хотя это обычно следствие, причиной  тормозов обычно являются sql запросы.
Если с запросами все в порядке, значит сервер не справляется с нагрузкой и нужна тонкая настройка или апгрейд.


понедельник, 17 марта 2014 г.

Расширь возможности своего SQL сервера через OLE !

Что делать когда возможностей  и функционала SQL сервера не хватает ?
Представим что нужно получить размер свободного пространства на всех дисках.
Тогда на помощь придет OLE автоматизация, которая является одной из самых полезных возможностей SQL сервера, доступная еще с 2005 версии.

Как же эти воспользоваться, для начала нужно включить  эту опцию на SQL сервере

--включить интеграцию с OLE
sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
sp_configure 'Ole Automation Procedures', 1;
GO
RECONFIGURE;
GO

Затем воспользоваться следующими процедурами:


При обращении к объекту OLE-автоматизации из Transact-SQL сперва необходимо вызвать системную хранимую процедуру sp_OACreate,
которая создает экземпляр объекта в адресном пространстве экземпляра компонента Компонент Database Engine.

После создания экземпляра объекта можно вызывать следующие хранимые процедуры для работы со свойствами,
методами и получением сведений об ошибках, связанных с созданным объектом.
sp_OAGetProperty  - возвращает значение свойства, sp_OAGetProperty - устанавливает значение свойства, sp_OAMethod  - вызывает метод,
sp_OAGetErrorInfo  - возвращает сведения о последней возникшей ошибке

SSIS. Веб сервисы на практике.

Допустим нужно реализовать приложение которое будет накапливать информацию о курсах валют ежедневно в нашей БД.

Воспользуемся веб сервисом для получения ежедневных данных.

Создаем SSIS пакет и настраиваем получение данных из веб сервиса, для этого:
1.создаем задачу Web Service
2.Настраиваем, соединение с WSDL файлом
3.Создаем локальный WSDL файл  и жмем кнопку DOWNLOAD WSDL


4.Выбираем нужный нам метод
5. Настраиваем файл результатов xml


Итак мы получили данные  от веб сервиса в виде xml файла, теперь немного теории XML
Для правильно чтения XML файла должен быть определен XSD файл, описывающий его структуру.
При использовании XSD файлов XML парсер может проверить не только правильность синтаксиса XML документа, но также его структуру, модель содержания и типы данных.
Схемы бывают внешние и внутренние, т.е которые определены внутри xml файла.
Плюс в документе для схемы могут быть заданы  пространства имен описывающий именованную совокупность имён элементов и атрибутов, служащую для обеспечения их уникальности в XML-документе.
Возьмём, например, простой XML, который содержит ссылки на покупателя и на заказанный продукт. И элементы покупателя, и элементы продукта могут содержать дочерний элемент «ID_number». Ссылки на элемент ID_number будут, таким образом, неоднозначны, у нас будут два одинаковых имени элемента несущих разную смысловую нагрузку и так будет, пока мы не введём пространства имён для их различения.
Пространства имён объявляются с помощью XML атрибута xmlns, значение которого должно быть ссылкой URI.

вторник, 11 марта 2014 г.

Как сэкономить место? Нумерованные списки в Анаплан.

В многомерной модели имеет место  избыточность, т.к для различных измерений составляется многомерная матрица со всевозможными комбинациями.

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

Создаем список, ставим ему опцию нумерованный (Numbered)

Можно добавить элементы через импорт, или вручную нажав кнопку Insert



Создаем модуль для  ввода предположений, скрываем лишние поля.



Со следующими настройками, создаем два скрытых поля  для связи со списками, Product и Organization


Теперь допустим в модуле необходимо получить данные из модуля предположений
Вводим формулу Assumptions Module.Plan[SUM: Assumptions Module.Organization], ключевым здесь является опция SUM:  , которая позволяет получить данные из модуля на нумерованных списках.
Если связь идет не по измерениям используйте конструкцию  Module.Plan[SUM: Assumptions Module.Organization, LOOKUP: список]

Пример для организаций

Пример для продуктов

пятница, 7 марта 2014 г.

Тонкая настройка модуля Анаплан

Для тонкой настройки модулей, в Анаплане предусмотрен режим Blueprint.
Эти настройки придадут вашему модулю желаемый вид и функциональность.
Здесь и настройки функций агрегирования и отображения и тд.


Всего доступно порядка 17 опций


About