Биты и байты.

Биты и байты.

понедельник, 21 сентября 2015 г.

Полезные советы при создании аналитических панелей.

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

Шаг 1.  Создайте образ панели.
 Для начала ответьте себе на вопросы.

- Какую мысль я хочу донести людям, в чем ценность этой панели ? 
(от этого будет зависеть наполнение панели информацией)
- Кто будет пользоваться этой информацией, кто целевая аудитория ? 
(насколько они технически грамотны, знакомы с терминологией  от этого будет зависеть              сложность панели, количество данных и графиков )
- Какой тип панели это будет ?
 (стратегическая, оперативная, в виде истории,  детализация)

Подсказка : представьте вашу панель создайте ее в голове , если есть возможность нарисуйте набросок карандашом.



Шаг 2.  Выберите макет.
От выбора макета зависит количество информации которое можно разместить на панели , следите за тем чтобы было достаточно места между блоками
Иначе возникнет ощущение визуальной перегрузки данных, используйте макеты с большим количеством блоков только в крайнем случае.


Подсказка: В интернете есть разные варианты макетов на выбор, попробуйте создать свой макет в каком-нибудь онлайн дизайнере или используя Gridstack.js

понедельник, 7 сентября 2015 г.

Ассоциативность в Excel

Анализ большого объема данных это всегда проблема особенно если нельзя отловить связи между элементами.
В Excel 2010  появилось понятие срезов, которое будет полезно любому аналитику.
При выборе фильтра в срезе автоматически отображаются связанные значения в других фильтрах среза, по значку фильтра можно определить
Где конкретно установлен фильтр, а где отображаются связанные значения, все значения которые не связаны с данным фильтром будут светлее чем остальные. Видео.
Настройки таблицы всегда можно найти на вкладке конструктор, там можно привести таблицу к классическому виду и отключить промежуточные и общие итоги


В дополнение полезные ссылки

Визуализация данных на 3D-карте с помощью Power Map (GeoFlow) для Excel

5 инструментов в помощь аналитику


пятница, 31 июля 2015 г.

Создание библиотеки в Sharepoint.

Для создания такой библиотеки нужно совсем немного времени.
Сделаем это на Sharepoint 2013.


Для начала устанавливаем себе SharePoint Designer, он облегчит нам некоторые рутинные действия.
Запускаем дизайнер, открываем наш сайт,  
1. Создаем на сайте новую библиотеку документов.

Выставляем для нее необходимые параметры, обязательно ставим опцию, разрешить управление типами контента

2. Создаем тип контента (это набор столбцов и параметров который можно использовать многократно в разных списках), по умолчанию в типе 2 столбца имя и название.
Наследуемся от типа контента документ, можно наследоваться вообще от любого типа SharePoint и это плюс.
3. Далее создаем необходимые столбцы, которые будем использовать в нашем типе контента, доступны следующие типы столбцов.
Переводчики конечно отожгли, вариант тут имеется ввиду выбор.
У столбца так же есть значения по умолчанию, которые при желании можно определить.

среда, 15 июля 2015 г.

Панель, она и в SQL панель!

Для тех кто давно задумывался об удобном инструменте анализа производительности своего SQL сервера, есть хорошая новость!
Кроме стандартных отчетов в SSMS,  оказывается уже есть на базе отчётов SSRS от MS готовый пакет отчетов под шикарным названием «панель» производительности.
Что удобно, для выполнения этих отчетов не нужны права супер одмина.

Если внимательно присмотреться то не всегда этот отчет выдает адекватные цифры, так что будьте готовы к этому. Как говорится доверяй, но проверяй.
Ссылка на отчеты  и горячее видео!

После установки отчеты можно найти здесь


Сама панель выглядит как то так.
Установка проста  на сервер устанавливаем необходимые процедуры из файла setup.sql в базу msdb
В файле найдете все необходимые скрипты которые потом можно использовать по отдельности при желании.
При желании разворачиваем все отчеты на сервере отчетов.
И настраиваем подписки.


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

P\S: Использование скриптов в анализе никто конечно не отменял

Основные сведения о переключении контекста

Как переключать контекст

Контекст выполнения определяет под каким пользователем или именем входа выполняется текущая команда. Детали см. в разделе Основные сведения о контексте выполнения.

Явное переключение контекста


Выполняется через инструкцию EXECUTE AS LOGIN. Олицетворение остается в силе до тех пор, пока не произойдет одно из следующих событий:
Сеанс удаляется.
Контекст переключен на другое имя входа или на другого пользователя.
Контекст восстановлен до контекста предыдущего выполнения.

Для возврата к предыдущему контексту используется инструкция REVERT. Вызывающий инструкцию REVERT должен находиться в базе данных, где произошло олицетворение.

Пример

В следующем примере Питер Коннели, сетевой администратор компании Adventure Works Cycles, хочет создать учетную запись имени входа SQL Server для нового сотрудника Цзинхао Люхаса. У имени входа Питера в SQL Server нет необходимых для создания имен входа SQL Server разрешений уровня сервера, но Питер обладает разрешением IMPERSONATE в adventure-works\dan1, имени входа SQL Server с нужным разрешением уровня сервера. Когда Питер подключается к экземпляру SQL Server, контекст выполнения сеанса образуется из его имени входа в SQL Server. Чтобы создать имя входа SQL Server, Питер временно принимает контекст выполнения adventure-works\dan1. Затем он создает имя входа. Наконец, он освобождает присвоенные разрешения.
-- Switch execution context to the adventure-works\dan1 login account.
EXECUTE AS LOGIN = 'adventure-works\dan1';
-- Create the new login account.
CREATE LOGIN Jinghao1 WITH PASSWORD = '3KHJ6dhx(0xVYsdf';
-- Revert to the previous execution context.
REVERT;


Для переключения контекста выполнения на уровне базы данных используйте инструкцию EXECUTE AS USER = 'user_name'. 

Пример

В следующем примере, Франсуа Аженста, администратор базы данных компании Adventure Works Cycles, хочет выполнить инструкцию DBCC CHECKDB в базе данных AdventureWorksDW, но не имеет для этого разрешений на уровне базы данных. Однако он обладает разрешениями IMPERSONATE пользователя dan1, учетной записи с нужным разрешением.
Когда Франсуа подключается к базе данных AdventureWorksDW, контекст выполнения сопоставляется с его маркером безопасности пользователя. Разрешения на выполнение инструкций проверяются у первичных и вторичных участников в его маркере пользователя. Из-за того, что он не обладает разрешениями, необходимыми для выполнения инструкции DBCC CHECKDB, он выполняет следующие инструкции.
-- EXECUTE AS USER = 'dan1';
-- Create a table in dan1's default schema
CREATE TABLE t_NewTable( data nvarchar(100) );
go
-- Revert to the previous execution context.
REVERT
go;

Неявное переключение контекста

Используется в триггерах, функциях, процедурах также с помощью инструкции  EXECUTE AS при создании объекта.
Определяет чьи разрешения будут использованы для доступа к объектам в теле  процедуры функции. 


Пример

В следующем примере Мэри является владельцем таблицы MyTable. Она хочет, чтобы пользователь Скотт имел возможность усекать таблицы, но у Скотта нет прямого разрешения на работу с таблицами. Поэтому она создает хранимую процедуруdbo.usp_TruncateMyTable и предоставляет Скотту разрешение EXECUTE для этой процедуры. Когда Скотт выполняет эту хранимую процедуру, компонент Database Engine проверяет разрешения на усечение таблицы, как если бы хранимую процедуру выполняла Мэри. Так как она является владельцем таблицы, то инструкция выполнится даже в том случае, если Скотт не обладает прямыми разрешениями на работу с таблицами.
CREATE PROCEDURE dbo.usp_TruncateMyTable
WITH EXECUTE AS SELF
AS TRUNCATE TABLE MyDB..MyTable;

четверг, 9 июля 2015 г.

Раздуло кэш SQL? Лечимся народными средствами.

Если при разработке приложений не пользоваться хранимыми процедурами и параметризованными запросами, чем грешат большинство разработчиков, посылая произвольные (Adhoc) запросы серверу
То рано или поздно можно столкнуться с проблемой раздутого процедурного кэша.
Подробнее о механизмах кэширования тут

1.Проверяем есть ли проблемы с процедурным кэшем.
Чтобы понять есть ли проблема с Adhoc запросами, достаточно запустить следующий запрос
SELECT T.*, cast(T.[Total Plans - USE Count 1]*1.0/nullif(t.[Total Plans],0) *100  AS decimal(5,2)) Percentage
FROM
(
       SELECT objtype AS [CacheType]
                    , count_big(*) AS [Total Plans]
                    , sum(cast(size_in_bytes as decimal(18,2)))/1024/1024 AS [Total MBs]
                    , sum(cast((CASE WHEN usecounts = 1 THEN size_in_bytes ELSE 0 END) as decimal(18,2)))/1024/1024 AS [Total MBs - USE Count 1]
                    , sum(CASE WHEN usecounts = 1 THEN 1 ELSE 0 END) AS [Total Plans - USE Count 1]
       FROM sys.dm_exec_cached_plans cp
       WHERE cp.cacheobjtype = N'Compiled Plan'
       AND cp.objtype IN (N'Adhoc', N'Prepared') -- adhoc (произвольный запрос), prepared (параметризованный)
       GROUP BY objtype
) T
ORDER BY [Total MBs - USE Count 1] DESC
OPTION (RECOMPILE);  --план не будет сохраняться, эту опцию желательно использовать для adhoc запросов

Из результатов запроса понятно что процент  Adhoc  запросов  которые выполнялись только 1 раз очень высокий 82%


среда, 1 июля 2015 г.

Импортируем VM ректально.

Захотелось вот себе виртуалку скопировать, а файла экспорта например под рукой нет.
К счастью существует способ импортировать существующую виртуальную машину без предварительного экспорта.
Это мистика но все работает…
Указываем путь  до  конфигурации xml
Import-VM –Path 'D:\Program Files\Microsoft Learning\20488\Drives\20488B-LON-SP-01\Virtual Machines\8B770C81-CEA8-4AC0-A532-A2FF40C082CD.xml'

Обязательно возникнет ошибка
Import-VM : Unable to import virtual machine due to configuration errors.

Посмотрим детально  в чем же ошибка
$compareResult = Compare-VM –Path 'D:\Program Files\Microsoft Learning\20488\Drives\20488B-LON-SP-01\Virtual Machines\8B770C81-CEA8-4AC0-A532-A2FF40C082CD.xml'

Судя из описания две ошибки 33012, связаны с некорректным сетевым адаптером
Message                                     MessageId Source
-------                                     --------- ------
Could not find Ethernet...                      33012 Microsoft.HyperV.Power...
Could not find Ethernet...                      33012 Microsoft.HyperV.Power...
$compareResult.Incompatibilities[0].Message
Could not find Ethernet switch 'VMs'.
Отключим первый сетевой адаптер
$compareResult.Incompatibilities[0].Source | Disconnect-VMNetworkAdapter

Для второго проставим правильный сетевой интерфейс
$compareResult.Incompatibilities[1].Source | Connect-VMNetworkAdapter -SwitchName "HP Ethernet 1Gb 2-port 332i Adapter #2 - Virtual Switch"

Проверим нашу конфигурацию
compare-VM -CompatibilityReport $compareResult

Теперь импортируем
Import-VM -CompatibilityReport $compareResult

Если не возникло никаких ошибок должна появиться наша виртуалка, и все работает!
А если ничего не помогает спросите у Гугла.


вторник, 23 июня 2015 г.

Подключаемся к Excel

Пример подключения к Excel

Standard (Excel)
Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\MyExcel.xls;
Extended Properties="Excel 8.0;HDR=Yes;IMEX=1";

Полезные Строки подключения всегда можно найти здесь.

Connect SQL Server  |  Oracle  |  MySQL  |  Access  |  Excel

·         Access
·         Active Directory
·         AS/400
·         Caché
·         Composite Information Server
·         ComputerEase
·         DBF / FoxPro
·         DBMaker
·         DSN
·         EffiProz
·         Empress
·         Excel
·         Exchange
·         Filemaker
·         Firebird
·         HTML Table
·         IBM DB2
·         Index Server
·         Informix
·         Ingres
·         Integration Services
·         Interbase
·         Intuit QuickBase
·         Lightbase
·         Lotus Notes
·         Mimer SQL
·         MS Project
·         MySQL
·         Netezza DBMS
·         OData
·         OLAP, Analysis Services
·         OpenOffice SpreadSheet
·         Oracle
·         Paradox
·         Pervasive
·         PostgreSQL
·         Progress
·         RSS / Atom
·         SAS
·         SharePoint
·         SQL Azure
·         SQL Server
·         SQL Server Compact
·         SQLBase
·         SQLite
·         Sybase Adaptive
·         Sybase Advantage
·         Teradata
·         Textfile
·         UDL
·         UniData
·         UniVerse
·         Valentina
·         Vertica
·         VistaDB
·         Visual FoxPro
·         Windows Azure Storage
·         ZIM

пятница, 22 мая 2015 г.

Подключение к списку sharepoint из SSRS

Как подключить список Sharepoint к отчету SSRS?
Вариант 1. Создать dataset c подключением к sharepoint


<RSSharePointList xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <ListName>График отпусков</ListName>
      <Query>
        <Where>
        </Where>
      </Query>
    </RSSharePointList>


Привязать использую функцию lookup и lookupset

Вариант 2.
Подключить на уровне процедуры через базу sharepoint

ALTER PROCEDURE [dbo].[GetVacationsSharepoint] (@DATEFROM DATETIME = NULL,@DATEEND DATETIME =NULL )

AS
BEGIN

SET NOCOUNT OFF

SET LANGUAGE Russian;

--DECLARE @DATEFROM DATETIME
--DECLARE @DATEEND DATETIME

SET @DATEFROM =  ISNULL(@DATEFROM,DATEADD(month, DATEDIFF(month, 0, GETDATE()), 0) )
SET @DATEEND = ISNULL(@DATEEND,DATEADD(d, -1, DATEADD(m, DATEDIFF(m, 0, GETDATE()) + 1, 0)))

SET @DATEEND = DATEADD(d, -1, DATEADD(m, DATEDIFF(m, 0,@DATEEND) + 1, 0))
SELECT  D.DATA , t.[Login]  , t.[Имя пользователя] COLLATE Cyrillic_General_CI_AS as Username ,  DATENAME(dw,D.DATA) WeekDay, DATEPART(weekday,D.DATA) WeekDayNumber, DATEPART(wk,D.DATA) WeekNumber, DATENAME(month,D.DATA) Monthname ,DATEPART(month,D.DATA) MonthNumber , DATEName(yyyy,D.DATA) YEARNAME ,
DATEPART(dayofyear,D.DATA) DayOfyearNumber,
DATEPART (day, D.DATA) DayOfMnth ,
(CASE WHEN DATEPART(weekday,D.DATA) = 1 THEN 'Пн'
       WHEN DATEPART(weekday,D.DATA) = 2 THEN 'Вт'
       WHEN DATEPART(weekday,D.DATA) = 3 THEN 'Ср'
       WHEN DATEPART(weekday,D.DATA) = 4 THEN 'Чт'
       WHEN DATEPART(weekday,D.DATA) = 5 THEN 'Пт'
       WHEN DATEPART(weekday,D.DATA) = 6 THEN 'Сб'
       WHEN DATEPART(weekday,D.DATA) = 7 THEN 'Вс' ELSE DATENAME(dw,D.DATA) END) WeekDayShort,
(CASE WHEN  D.DATA >=t.DateFrom  AND D.DATA <= t.DateTo     THEN 1 ELSE NULL END) IsVacation,
(CASE WHEN  D.DATA >=t.DateFrom  AND D.DATA <= t.DateTo     THEN t.VacationType ELSE NULL END) VacationType,
(CASE WHEN  D.DATA >=t.DateFrom  AND D.DATA <= t.DateTo     THEN t.id ELSE NULL END) id,
(CASE WHEN  D.DATA >=t.DateFrom  AND D.DATA <= t.DateTo     THEN t.Comment ELSE NULL END) Comment
FROM (SELECT DATA
      FROM dbo.DatesBetween(@DATEFROM, @DATEEND)) D ,
            (
                           SELECT dat.nvarchar3 VacationType, dat.datetime1 DateFrom, dat.[datetime2] DateTo, dat.int1 USERID, u.tp_Login [Login], u.tp_Title [Имя пользователя], dat.tp_ID ID, dat.nvarchar1 Comment
                             FROM [Wss_content_80_portal2010].[dbo].[AllUserData] DAT (NOLOCK)
                           LEFT JOIN    [Wss_content_80_portal2010].[dbo].[UserInfo] u (NOLOCK) ON u.tp_ID = dat.int1
                           WHERE dat.tp_ListId = '055C8B06-6C99-4F4F-BAF2-ED809CA2CD42'
                           --(SELECT TOP 1 LIST.tp_ID FROM [Wss_content_80_portal2010].dbo.alllists LIST(NOLOCK)
                           --WHERE  LOWER(LIST.tp_Title)  = 'график отпусков' AND list.tp_DeleteTransactionId = 0x)
                             AND (dat.[tp_RowOrdinal] = 0)
                             AND (dat.tp_Level = 1)
                             AND (dat.[tp_IsCurrentVersion] = CONVERT(BIT, 1))
                             AND (dat.[tp_CalculatedVersion] = 0)
                             AND (dat.[tp_DeleteTransactionId] = 0x)
                             AND (dat.tp_SiteId = '5929DACB-CEDE-4564-9EDF-80B572A032AE')
                             AND dat.tp_ContentTypeId =  0x0100A3B1A57EC7FEE84593355BC92E45F9D5
             )  T

END

About