Subscribe Twitter

Настройка Performance Data Collector для мониторинга тяжелых запросов (MS SQL Server 2008)

Для мониторинга производительности  SQL Server одним из полезных
инструментов является Data Collector , который был введен начиная с 2008
версии. Data Collector позволяет собирать разного рода информацию о производительности системы из разных источников в единое хранилище данных. Такими источниками могут быть SQLTrace, счетчики Performance Monitor  и т.д. Например, можно ловить долго выполнявшиеся  запросы при помощи SQLTrace и сохранять эту информацию в БД.  Далее для анализа  и наглядного представления можно строить различные отчеты, например в Reporting Serviсes:

Could not load package "" because of error 0xC0014062. The LoadFromSQLServer method has encountered OLE DB error code 0x80004005 (Login timeout expired).

   Несколько раз встречалась ошибка - валилось задание AGENT  SQL Server с ошибкой ,
при попытке запустить пакет SSIS package из шага задания-
Could not load package "" because of error 0xC0014062. The LoadFromSQLServer method has encountered OLE DB error code 0x80004005 (Login timeout expired).

   На форуме Microsoft в таких случаях советуют запускать пакет несколько раз, ну чтож... будем знать :)


In my case the solution is to configure a Retry when the job fails :
-Job\Properties\Steps\select Step\Edit\Advanced
-Retry Attempt = 4 (for example)
-Retry Interval (minutes) = 11 (for example)


Как тип данных NCLOB на Oracle корректно преобразовать в VARCHAR


Сегодня при выгрузке таблицы AX_RCONTRACTTABLE из Oracle в MSSQL Server столкнулась со следующей проблемой: не получалось корректно выгрузить поле RCONTRACTSUBJECT с типом данных  NCLOB в поле с типом данных VARCHAR(200) .

Решение:
Необходимо преобразовать в тип данных VARCHAR и обрезать до 200 символов
Т.е добавить в запрос к Oracle преобразование следующего вида:
select
    CAST(DBMS_LOB.SUBSTR (RCONTRACTSUBJECT, 200, 1) as VARCHAR2(200)) RCONTRACTSUBJECT
from AX9WORK.RContractTable

Тип данных float и MS SQL


Все мы знаем, что тип float является приблизительным числовым типом в SQL, но что бы настолько... Запустите
select cast(1.01 as float)+2.02-3.03
и удивитесь: 4,44089209850063E-16. А вот Oracle, напротив, очень точен в своих вычислениях и показывает единственно правильный 0! Осторожнее с вычислениями...

SSAS: как может повлиять MeasureExpression на содержимое группы мер


Ситуация такая. В группе мер ГМ1 есть мера M1 для которой указан MeasureExpression M1=M2*100, где M2 - мера из другой группы мер, назовем её ГM2. То есть мера одной группы мер зависит от меры из другой группы мер. Так вот, если группа мер ГМ2 будет пустой, то и группа мер ГМ1 в кубе окажется пустой. При расчете куба происходит inner join между ГМ1 и ГМ2 по ключам общих измерений.

Решение1:
Предусмотреть наличие в ГМ2 всех ключевых записей из ГМ1 по ключам общих измерений

Решение2:
Выделить меру М1 из группы мер ГM1 в отдельную группу мер. Тогда другие меры из ГМ1 не пострадают

Подсветка синтаксиса кода в блоге


При написании предыдущего поста понадобилось подсветить синтаксис вставленных кусков кода T-SQL. Погуглив, быстро нашел подходящий онлайн-сервис http://highlight.hohli.com/. Возможностей настройки не много, зато он делает свою работу качественно и знает кучу языков:

UPD! Нашел способ лучше - подключил к блогу js-библиотеку. Теперь, что бы блог автоматом подсветил кусок кода, нужно его поместить в тег <pre class="brush: sql"> Код на SQL </pre>.

Пример:
select "Здорова, дивный новый мир!" 

Помимо Sql библиотека поддерживает кучу других языков и тем. О том какие и как их подключить здесь: http://alexgorbatchev.com/SyntaxHighlighter/

Учим SQL Server забирать данные с веб-сервисов (REST и SOAP)


Появилась у нас задача забирать данные через SOAP из 1C, а потом и через простой REST из Яндекс-Метрики и Google-Analitycs. Путей решения наметилось три:
  1. Написать .NET-приложение или скрипт PowerShell/JS/VBS, который бы забирал XML с сервиса, парсил и сохранял в таблицу SQL, либо просто в файл
  2. Написать CLR-процедуру, которая бы возвращала XML с сервиса
  3. Обойтись средствами SQL, используя готовую COM-библиотеку MSXML2.ServerXMLHTTP через процедуры sys.sp_OA*
Победил третий вариант, как наиболее гибкий. 

В итоге получение данных с REST-вебсервиса через HTTP-GET выглядит так (голый код, без мишуры вроде обработки ошибок и логирования, на примере Яндекс-Метрики http://api.yandex.ru/metrika/):
-- Начальные данные: URL

declare 
    @OLE int,
    @URL nvarchar(max)='http://api-metrika.yandex.ru/counters?oauth_token=05dd3dd84ff948fdae2bc4fb91f13e22'

-- Выполняем запрос с помощью MSXML2.ServerXMLHTTP

exec sys.sp_OACreate 'MSXML2.ServerXMLHTTP',@OLE out 
exec sys.sp_OAMethod @OLE,'open',NULL,'GET',@URL,'false' 
exec sys.sp_OAMethod @OLE,'send' 

-- Получаем данные которые вернул сервер

declare @r table (r nvarchar(max)) 
insert @r exec sys.sp_OAGetProperty @OLE,'responsetext' 

-- Удаляем объект

exec sys.sp_OADestroy @OLE
Для SOAP чуть посложнее, но смысл тот же (на примере простого запроса к demo-серверу http://www.guru4.net/):
-- Начальные данные: namespace, URL, заголовок и тело метода

declare @URL nvarchar(max),@Header XML,@Body XML
;with xmlnamespaces (default 'http://www.guru4.net')
select
    @URL='http://www.guru4.net/articoli/javascript-soap-client/demo/webservicedemo.asmx',
    @Body=(select '' for xml path('HelloWorld'),type)

-- Строим запрос

declare @SOAPAction nvarchar(max),@OLE Int,@Request xml
;with xmlnamespaces ('http://www.w3.org/2001/XMLSchema-instance' as [xsi],'http://www.w3.org/2001/XMLSchema' as [xsd],'http://schemas.xmlsoap.org/soap/envelope/' as [soap])
select
    @SOAPAction=@Body.value('namespace-uri(/*[1])','SysName')+'/'+@Body.value('local-name(/*[1])','SysName'),
    @Request=(select @Header as [soap:Header],@Body as [soap:Body] for xml path('soap:Envelope'),type)

-- Выполняем запрос с помощью MSXML2.ServerXMLHTTP

exec sys.sp_OACreate 'MSXML2.ServerXMLHTTP',@OLE OUT
exec sys.sp_OAMethod @OLE,'open',NULL,'POST',@URL,'false'
exec sys.sp_OAMethod @OLE,'setRequestHeader',NULL,'Content-Type','text/xml; charset=utf-8'
exec sys.sp_OAMethod @OLE,'setRequestHeader',NULL,'SOAPAction',@SOAPAction
exec sys.sp_OAMethod @OLE,'send',NULL,@Request

-- Результат запроса

declare @r table (r nvarchar(max))
insert @r exec sys.sp_OAGetProperty @OLE,'responsetext'

-- Удаляем объект

exec sys.sp_OADestroy @OLE

Вариант хорош тем, что понятен любому SQL-разработчику и не требует дополнительных знаний .NET

UPD 13/05/2014

Если SOAP-метод веб-сервиса требует параметры, они передаются в запросе:
@Body=(select 'Значение1' as Param1,'Значение2' as Param2 for xml path('HelloWorld'),type)
Важно! Имена параметров чувствительны к регистру

UPD 16/04/2015

Если на веб-сервисе включена аутентификация (Basic или Integrated Windows), то в методе Open можно передать логин и пароль:
exec sys.sp_OAMethod @OLE,'open',NULL,'POST',@URL,'false','LOGIN','PASSWORD'