Welcome to TechNet Blogs Sign in | Join | Help

Стратегия заливки данных для сценариев типа: Data Warehouse

Немного саморекламыJ  

На сайте SQLCAT.COM опубликована статья «Bulk Loading Data into a Table with Concurrent Queries»

Документ описывает некоторые интересные наблюдения, связанные с использованием хинта TABLOCK и Read Committed Snapshot Isolation в сценариях Data Warehouse ( особенность этого сценария – большое количество конкурентных чтений)

Posted by MOCKAlb | 0 Comments

Передача параметров в Execute Task или как мы до этого доехали.

<Disclaimer: вероятно этот пост будет в последующем редактироваться.  Пока публикуется так, как он есть>

 

Как это полагается в старинных былинах, начну издалека..

 

Подготовка эксперимента, постановка задачи и т.д.

Экспериментируя с разными задачами, вдруг наткнулся на интересную идею – надо бы организовать параллельную выкачку данных из таблицы в одном ресурсе в таблицу на другом.  Фактически, это ситуация, которая достаточно часто встречается в разного рода проектах:  есть временная «куча», куда данные заливаются, их надо перенести в «постоянную таблицу» . Потому «куча» будет просто «обнулена».. Целевая таблица  может иметь, допустим,  кластерный индекс на ней.

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

Как уже упоминал, изначальная таблица – куча. Для простоты объяснения ситуации, предположим, что таблица у нас типа:

USE Sample

CREATE TABLE SourceTable (Range int, Value int)

 

В реальной жизни же, конечно, такими простыми таблицами не отделаешься, но на данный момент не это важно. Важно, чтобы у нас была возможность разбить  таблицу на равные диапазоны. В данном примере роль диапазонов играет столбец  Range, где у нас «забиты» диапазоны от 0 до 1000, 1001 до 2000, и т.д. до 10 000.

 Поле  Value пусть будет хранить какие-нибудь числа. Это сейчас не так важно.

Итак, SSIS пакет запустится, начнет «вытаскивать» данные из таблицы и…  Вообще-то идеально было бы иметь один пакет, который можно запустить несколько раз,  или несколько одинаковых пакетов, но чтобы они крутились параллельно и «читали таблицу.  То есть им надо каким-то образом указать, какие данные надо выкачать. Для этой цели была сделана еще одна служебная таблица  [dbo].[work_queue],  которая выглядит приблизительно вот так:

 

work_id

group

assignment

is_active

is_done

1

SSISLoad

1000

0

0

2

SSISLoad

2000

0

0

3

SSISLoad

3000

0

0

4

SSISLoad

4000

0

0

5

SSISLoad

5000

0

0

6

SSISLoad

6000

0

0

7

SSISLoad

7000

0

0

8

SSISLoad

8000

0

0

9

SSISLoad

9000

0

0

 

 

То есть, мы задаем идентификатор «работы»  (work_id) и диапазон, который должен будет сканироваться (assignment). Для случая. Когда несколько разных типов «работ» будет существовать, можно прописать , какой группе они принадлежат. В данном примере ограничимся одной группой.

Далее, как только диапазон взят «в оборот», поле is_active  должно смениться с 0 на 1. Ну и по окончании работы поле is_done тоже сменится с 0 на 1.

Работу по изменению этих полей передадим процедуре:

 

CREATE PROCEDURE [dbo].[sp_get_work]

      @group NVARCHAR(128) = NULL /* The group to get*/

      , @work_id INT = NULL OUTPUT /* the work_id assigned */

      , @assignment NVARCHAR(MAX) = NULL OUTPUT /* The description of the work to do */

Как видно из кода, процедура возвращает @assignment, т.е. диапазон, который надо «вытащить» из таблицы. Что нам пригодиться потом в SSIS пакетах.

Для того, чтобы данные «дообработать», можно создать некоторое количество таблиц ( по количеству пакетов  SSIS, которые будет обрабатывать таблицу).

Собственно, вступительная часть закончена.. Тепрь приступаем к той части, ради которой весь сыр-бор.

Передача переменной внутри SSIS пакета.

 Для начала  создаем новый проект, в нем новый SSIS пакет. Допустим, так как LoadStaiging1.dstx.

Далее определяем в Control Flow последовательность выполнения задач. Певрое, что мы сделаем – убедимся, что временная таблица, куда мы перетягиваем данные - пуста .

 

Рис.1 «Обнуление» данных в таблице

 

Как видно в строке SQLStatement можно прописать совершенно спокойно обычный T-SQL запрос. Чем мы и воспользуемся.

Далее,  если еще кто-то помнит, что было во вступительной части – мы создали процедуру, которая фактически возвращает диапазон, который «можно» выкачивать из таблицы и, как –только мы начинаем с диапазоном работать, помечает его как is_active.  Так вот для этих целей в пакете можно описать переменные, действующие на протяжении всего пакета. Некоторым из них можно присвоить значения, которые будут использоваться по умолчанию каждый раз, когда пакет запускается.

  

 

Рис.2  Опеределение переменных.

 

Следующей задачей в пакете будет как раз выяснение того, какой диапазон у нас сейчас «свободен». Для этого я взял опять Execute SQL Task.

Рис 3. Execute Task - выяснение, какой диапазон еще не в работе 

 

Как видно из меню, я выбрал в Connection Type ADO.NET соединение. Прелесть именно этого типа, что с ним удобней работать с переменными.  Удобность вот в чем:

Вот наш запрос из SQL Statement

 

EXEC  [Sample].[dbo].[sp_get_work]  @group, @work_id, @assignment OUTPUT

Достаточно читабельный код, не так ли?  В случае OLE DB аналогичный код выглядел бы вот так:

EXEC  [Sample].[dbo].[sp_get_work]  ?,  ?, ? OUTPUT

Меня такой код немного смущает.

Теперь, надо сопоставить переменные внутри этой задачи с теми, что мы определили на уровне пакета.

Рис.4  "Связывание" переменных  и параметров

То есть: User::work_id  соответствует параметру @work_id,

 User::group соответствует параметру @group,

User::assignment соответствует параметру @assignment.

User::assignment  в поле Direction указано Output, что достаточно логично указывает на то, что этот параметр будет передан дальше.

«Дальше» означает следующий Execute SQL Task, где в поле SQLStatement будет прописан следующий код:

INSERT INTO Staging1  ([RANGE], [VALUE]) SELECT ST.[RANGE], ST.[VALUE] from Sample.dbo.SourceTable ST where ST.[Range] = @assignment

Где @assignment  опять сопоставляется с переменной User::assignment

 

Вот собственно и все.

Точнее почти все. Я рассказал о том, как параметр передается между Execute SQL Task.

Далее, результат выполнения последнего запроса передается на вход Document Flow.

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

Это было сделано с помощью достаточно простых манипуляций, которые в SSIS выглядят приблизительно вот так:

 

 

Posted by MOCKAlb | 0 Comments

вышел SQL Server 2008 CTP6.

Вышел СТР6 SQL Server 2008. Что можно сказать интересного?  В принципе, вся основная функциональность, которая должна будет присутствовать в финальной версии – уже представлена в СТР. Т.е. по хорошему, можно уже тестировать с прикидкой на то, как продукт «впишется» в  работающую уже схему/решение.

Ах да,  еще важно, что этот СТР на днях можно будет посмотреть и на русском языке.

В двух словах о том, что добавлено из функционала:

1)      iFTS – новых поисковый движок. Очень интересно будет посмотреть, как он работает с русским языком. Если кто-то чего-то нароет – пишитеJ

2)      Filtered Index -  тут все понятно: оптимизация для некластерного индекса.

3)      Sparse columns – оптимизация пространства, используемого таблицей. Интересный механизм. Фактически, составляет таблицу, где указывается только ячейки, содержащие данные. NULL’ы не хранятся в таблице.

4)      Data compression – сжатие данных. Помогает более эффективно использовать хранилище и оптимизировать IO

5)      Много дополнений в Reporting Services. Одно из самых востребованных – поддержка рендеринга Microsf Word при  составлении отчетов

Posted by MOCKAlb | 1 Comments

SQL Server 2005: масштабируемость решений с помощью контентно-зависимой маршрутизации.

SQL 2005: масштабируемость  решений с  помощью  контентно-зависимой маршрутизации.

 

Начну сей творческий труд с пары оговорок:

1) Оригинальная тема, возможно, называется несколько иначе. Английское название технологии звучит так: Scaling out with Data Dependant routing. Термин “Scale Out” сам по себе является достаточно интересным событием: исходя из перевода, это должно означать что-то типа уменьшения масштаба. Ну, когда, все вещи становятся меньше, так сказать, видны с высоты птичьего полета. По сути, никто, конечно серверы уменьшать не будет.  Касаемо  Data Dependant Routing -  возьму на себя смелость объявить это как «контентно- или контекстно-зависимой маршрутизацией». Потом объясню почему.

2) Пример архитектуры, который я собираюсь описать, вообще-то не зависит от версии SQL Server. SQL Server 2005 был разработан с учетом пожеланий клиентов в этом направлении. По сути,  тех же самых результатов, но с большими затратами ресурсов можно было достигнуть и в более ранних версиях.

Итак, начнем-с.

Всякая компания рано или поздно мечтает стать большой, солидной организацией. Чтобы все с уважением относились к имени компании, чтобы клиентов было много.   Отделы ИТ тоже мечтают, чтобы их компании росли. Только вот, сам по себе рост, с точки зрения ИТ подразделения, приносит и головную боль: растут базы клиентов-то! Растет, понимаешь, объем документов на серверах! Вводятся, всякие там, ERP, CRM и т.д.

На первых порах этот рост, достаточно успешно, можно контролировать покупкой новых, более мощных серверов. Затем, у всякого архитектора, либо же начальника ИТ подразделения возникает дилемма: с одной стороны – здоровенный парк еще пока актуального железа, с другой – можно купить ОДИН СУПЕР БОЛЬШОЙ и водрузить все на него. «Хорошо, а если и этот СУПЕР БОЛЬШОЙ вдруг упрется в пределы производительности, как я потом нашему директору (финансисту, хозяину компании, вице-президенту,_вставь свое название должности_) объясню, что давеча вот, потратили деньги – а нужно еще и больше?»- думает человек. В какой-то момент, стоимость лишнего гигагерца и мегабайта становятся просто-таки золотыми.

Итого, получаем практически всем известную картину: «Но вчера были раки!!! Но большие!! Но по пять.. А сегодня – маленькие.. Но по три». Что делать-то? Выбивать деньги или есть еще какие-то варианты? Есть. Этим вариантом, собственно и является scale out решение, построенное на том, что система будет иметь возможность «жить» не на одном БОЛЬШОМ сервере, а будет состоять из данных, распределенных грамотным образом по разным серверам  плюс приложение, которое будет знать, как их собрать. Тем самым можно достигнуть теоретически неограниченной возможности роста приложения без грандиознейших затрат.

 Контекстно-зависимая маршрутизация

Итак, вроде принято решение использовать  scale-out решение, контекстно-зависимую маршрутизацию, что делать дальше?  Дальше надо думать, как использование этого подхода отразится на работе приложения.  То есть, что останется, а что придется переписывать, так как на приложение ложится задача знать, куда, на какой сервер  отправить запрос. При контесктно-зависимой маршрутизации запроса не используются представления, объединяющие данные с нескольких серверов. Как раз наоборот, каждый сервер становится независимым ( за исключением одного сервера, который хранит схему. Приложение же должно хранить схему того, как данные разбиты и куда отправлять запросы.

Как следить за тем, где живут записи? Допустим, у нас есть приложение для дистрибьюторской компании, и база данных для этого приложения находится на той же машине, что и Web-приложение, через которое клиенты работают с нашей базой. Все данные разбиты на куски по  клиентским ID, соответственно нужно создать таблицу соответствия ID  номеру секции

 Получится что-то типа:

Customer ID

Partition ID

10015

1 (Data 1)

10016

2 (Data 2)

10017

1

10018

3 (Data 3)

 

 

Более наглядно схему работы решения можно представить следующим образом:

 

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

Что происходит дальше?

Клиентское приложение шлет запрос  «покажите все транзакции клиента 10015»,  жёлтый сервер сам определяет , куда этот запрос отправить дальше, а именно – на сервер Data1.В данной ситуации нет абсолютно никакой необходимости привлекать серверы Data 2 и Data3.

Теперь мы решили провести инвентаризацию всех продуктов.  Т.е надо построить отчет по всем Product ID. Данные у нас разбиты по Customer ID. Скорее всего , на каждом сервере найдутся записи с Product ID, соответственно и «допрашивать» придется всех. Что будет делать приложение? Правильно – опрашивать все серверы и строить общий отчет, на базе данных, что будут получен с каждого сервера. Выглядит, как очень трудоемкий процесс с подключением  большого количества ресурсов. Так оно, собственно и есть, поэтому такого рода задачи необходимо запускать как «фоновые» и в то время, когда это наименьшим образом повлияет на клиентов или пользователей.

 

«Узкие места» или чем это все грозит?

Достоинство системы, построенной  на базе контекстно-зависимой маршрутизации очевидно: при появлении новых пользователей, мы просто добавляем еще один сервер, потом еще и т.д. Не надо тратиться на дорогущий сервер с огромным дисковым пространством. Но, как известно, бесплатный сыр бывает только в мышеловке, поэтому за любыми достоинствами скрываются какие-то ограничения.

 

В данной ситуации придется считаться со следующими вещами:

1) Управление  и администрирование. Чем больше решение растет « в ширь», тем  большим количеством серверов придется заниматься, выполняя как рутинные задачи, так те, что будут «сваливаться» в процессе эксплуатации.  Т.е установка фиксов, обновлений, резервное копирование – все это будет умножено на количество поддерживаемых серверов. Хотя, с другой стороны, добавление еще одно сервера будет менее болезненной процедурой.

2) Разбиение ( группирование) данных. Это одна из основных «головных болей». Правильность выбора критерия разбиения данных будет означать, насколько легко  и безболезненно  будет расти решение.  Если параметр разбиения будет задан неверно, то это может потянуть за собой огромный список неприятностей. Необходимо очень хорошо понимать бизнес-логику и возможности  ее модификации, чтобы минимизировать проблемы при росте приложения.

3) Изменение бизнес логики приложения. Со временем правила , по которым работает компания, могут видоизменяться, соответственно это накладывает ограничение на приложение среднего уровня, которое в свою очередь, отвечает за знание куда отправить запрос. Что будет , если нужно ввести новые элементы логики? Переписывать все полностью? Что  будет, если добавится новый тип данных? ( В принципе, этот пункт тесно связан с предыдущим)

4) Доступность данных. Еще один узкий момент, где нужно своевременное правильное решение может избавить от кучи проблем – что произойдет с работой всего решения, если один из серверов данный просто упадет? А если «умрет» сервер, где хостится приложение?

 

Все эти вопросы были очень удачно освещены в решении, разработанном для  MSN Communication Services Platform, описанием которого я и займусь немного позже.

 

 

Posted by MOCKAlb | 2 Comments

Вышел СТР4 SQL Server 2008, он же CTP July

Для желающих ознакомиться ссылка:

https://connect.microsoft.com/SQLServer/content/content.aspx?ContentID=5395

(Не забудьте зарегистрироваться, если еще этого не сделали :)

А так же, грядут презентации по новым и не сильно возможностям продукта.

 

LiveMeeting EventEnterprise Scale Reporting Engine 08/15/07  
LiveMeeting EventAS Time Series Stability 08/17/07
LiveMeeting EventNew Datetime Data Type 08/21/07
LiveMeeting EventDatabase Mirroring Enhancements 08/24/07
LiveMeeting EventOrdpath For SQL Server 08/28/07

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

Буду разбираться, напишу о полученном опыте :)

Posted by MOCKAlb | 1 Comments

CTP3: DMF. Продолжаем изучение. Группы политик и дачный сезон

Продолжение изысканий.

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

Принцип работы политик и групп примерно такой: мы на даче. У всех «правильных» садоводов- любителей на даче водятся всякие гвозди, шурупы, лопаты, молотки, топоры, веревки для подвязки,  шланги, семена и т.д. Ну не валяется же это все по территории?

 У хорошего дачника есть банка с гвоздями ( где только гвозди, но правда, разных размеров), банка с шурупами, коробка с мелким инструментом и уголок для садового инвентаря. Так вот эти банки, коробки  и уголок – это наши группы. Если дачник хочет прибить гвоздь в бане, чтоб тот поработал как вешалка, то товарищ к объекту  [баня]  применяет политику [гвоздь] из группы [банка с гвоздями]. Если я не ошибаюсь, то facet ( он же аспект) в данном случае – «работа вешалкой».

[Гвоздь] может принадлежать только [банке с гвоздями]. Он не может в тоже самое время принадлежать группе [садовый инвентарь] или [банка с шурупами]. Попробуйте положить гвоздь в три разные банки одновреммено? Зато разные по размеру гвозди могут лежать в одной и той же банке. А группы [банка с шурупами] и [банка с гвоздями], в свою очередь,  можно применять к объектам [баня], [дача] ( ну там, ремонт мелкий), стена и т.д.

 Политики [лопата] и [шланг], по аналогии с примером выше, могут применяться к объекту [грядка] и принадлежать группе [угол].

Фух.. Уже кажется достаточно примеров. Я сам все понял.

Теперь перейдем  к практике.

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

 

Для этого для начала создадим условие ( в примере с дачником условием может быть - жена запилила:  « вещи в бане  валяются на полу. Перед людьми стыдно!». Вообще это одно из самых универсальных условий типа «жена»).

Имя: File Path Condition

Facet: Database Facet

Expression:

‘PrimaryFilePath’ NOT LIKE ‘ c:\SQL\MyDB%’

Далее, опишем политику:

Name: File Path Policy

Enabled – ставим галочку.

Condition: File Path Condition

Group: DB Group ( эту группу я просто только что создал, сказав 'New')

В поле «Applies to:» выбираем Server/Database

И говорим, что мы хотим следить за изменениями ( Check on changes)

 

Дело сделано. Осталось только проверить. Создаем базу DBtest_3где яростно нарушаем правило нами же созданное:

 

create database DBtest_3 on

(

Name = TheDB_Test3,

Filename ='c:\sql\thisisthe_test3.mdf'

)

 

И  “Command(s) completed successfully”!!

Что случилось? Можно было не копать грядку и не забивать гвоздь? Ничего не работает?

Обновим-ка в обозревателе картиночку.

И что видим?

 

 

 

Заметно красный крестик? Смотрим что там:

 

 

 Итого: то, что мы злостно нарушили, не осталось не замеченным. Процесс создания базы не является «обратимым»  - его нельзя откатить назад. Поэтому и команда выполнилась успешно и никаких разверзшихся небес. Отрадно, что появилось визуальной отображение конфликта того, что было сделано  с заданной политикой.

Пока я играл с политиками и группами, я заметил следующий эффект: подписать под группы можно все базы, кроме системных. Т.е получается, что на системные базы распространяются все политики , приписанные  к группе «по умолчанию».  В то время как все остальные базы могут быть подписаны как на группу по умолчанию, так и на определенные пользователем.

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

Posted by MOCKAlb | 3 Comments
Filed under:

Еще один обзор DMF. На этот раз от Николая Денищенко

Достаточно красочно и понятно и абсолютно академично Николай Денищенко описал результаты своих исследований DMF.

Наслаждайтесь :)

Приятно, что ширится круг людей, начинающих разбираться с SQL 2008

Posted by MOCKAlb | 0 Comments
Filed under:

СТР 3: Declarative Management framework. Пример

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

Для этого необходимо создать  условие, которое будет проверять: имя таблицы не равно  «Test%».

Для этого в Management Studio:

1. Идем  в  Policy Management, правой кнопкой кликаем на Conditions и говорим: New Condition.

2. В открывшемся окне  Create New Condition в поле Name говорим: Table Name Condition .

3. В поле Facet выбираем Multipart Name Facet.

4.  В поле задания условия (Expression) в Field выбираем: Name;

В поле Operator:  NOT Like;  в поле Value пишем Test%

В поле описания можно сказать: The table name should not start with Test

Далее необходимо создать политику:

1.       В обозревателе  Object Explorer кликаем правой кнопкой на Policies и выбираем New Policy.

2.       В окне Create New Policy выбираем имя для политики, типа: Table Name Policy,

3.       Ставим галочку  на «Enabled»

4.        В поле Condition box выбираем Table Name Condition.

5.       Группу можно оставить Default”.

6.       В поле Applies to: выбрать из всего списка Server/Database/Table.

7.       В описании режима исполнения: Enforce

 

Теперь  в  QA создаем запрос:

create table Test (Name nvarchar (10))

 

Policy 'Table Name Policy' has been violated by 'Server/Database[@Name='master']/Table[@Name='Test' and @Schema='dbo']'. This transaction will be rolled back.

Msg 3609, Level 16, State 1, Procedure sp_syspolicy_dispatch_event, Line 88

The transaction ended in the trigger. The batch has been aborted.

 

Что и требовалось доказать.

Создание же таблиц с другими процедурами проходит нормально.

P.S прежде чем попробовать DMF обратите внимание: был найден  баг в СТР, который может свести на нет все попытки запуска примера. Как это дело обойти описано тут:

http://sqlserver-qa.net/blogs/sql2008/archive/2007/06/10/653.aspx

 

Posted by MOCKAlb | 0 Comments
Filed under:

CTP3: Declarative Management Framework. Введение

Declarative Management Framework

Управление сервером баз данных можно разбить на два типа «жизненных циклов»:  управление сервером  и управление приложениями.  Управление  приложениями включает в себя все, что необходимо для поддержки работы приложений и сохранности и актуальности данных, хранимых на сервере.

Можно попробовать описать это следующими картинками:

 

SQL Server

Дистрибутив/
Upgrade/
фиксы

SQL Server Instance

 

Операционная система.

Настройка

Поддержка

 

Установка

Контроль

Управление сервером

Рис.1 Жизненный цикл: управление сервером

 

 

 

Рис 2.Цикл: приложение.

 

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

Что это значит для администратора? Это означает, что он ежедневно должен управлять экземплярами сервера и некоторым количеством приложений, установленными на этом сервере. Это и называется цели управления (management target). Администратор  обычно должен следить за тем, чтобы все находилось в состоянии или функционировало в  соответствии с какими-то известными требованиями .  Допустим, база должна быть восстанавливаема на случай если вдруг что-то завалится и данные должны быть не старше какого-то периода (неделя/день/час/минуты) . Эти требования можно назвать политиками управления (management policy).

На данный момент, это достигается достаточно низкоуровневыми действиями, связанными с настройкой системы и требует хорошего знания SQL Server, семантики установленного приложения и т.д. Требует различных механизмов уведомления ( ну, если администратор вдруг смог что-то автоматизировать). Самая большая проблема, что много действий приходится повторять  в случае, если администратор работает с некоторым количеством серверов.

 Это и есть базовая идея Declarative Management – абстрагировать управление сервером до уровня концепций, который сервером же и поддерживаются. Концептуальные действия позволяют определять (что идет от “declare” в названии технологии) политики управления и применения их к некоторым целевым объектам ( целям). Политики же будут «переводить» концепции в более низкоуровневые шаги по управлению серверами, наблюдению за ними и отчетам о состоянии серверов или объектов.

Политики можно описать в в следующих терминах: «Эта база данных должна восстанавливаться за 30 минут». И это в противоположность нынешнему: «создать job резервного копированияс 30 минутным графиком» 

Все основные операции по администрированию политик должны производиться через SQL Server Management Studio.  DMF управляет «сущностями» - логическими элементами, объектами, которыми, собственно, можно управлять. Сущностью являются объекты типа: экземпляр SQL Server, база данных, или другие объекты SQL Server.

Основные компоненты DMF:

-          Управление политиками  (Администратор политик создает их)

-          Явное администрирование ( Explicit administration) ( Администратор  выбирает несколько объектов и сам следит за соответствиями этих объектов политикам или «руками» приводит их в соответствие)

-          Автоматизированное администрирование

Администраторы политик  «включают» автоматизированное исполнение политик:

-  Принудительно, используя DDL триггеры, чтобы предотвратить нарушения политик.

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

- Проверка по графику, используя SQL Agent, чтобы периодически «прошерстить» сервер и поглядеть – может там кто-то чего-то..

Какие же основные термины, на которые опирается DMF?

 

Управляемая Declarative Management Framework цель (managed target):

Это сущности, которые управляются DMF, такие как: экземпляр SQL Server Database, база данных, таблица,  индекс.  Или иначе - это физические или логические объекты SQL Server. Можно создать набор целей, который будет состоять из различных целей, которые в свою очередь будут удовлетворять определенным признакам. Набор целей будет выбираться  путем применения фильтра (набора признаков) ко всей иерархии целей на экземпляре SQL Server. Например: все таблицы базы данных, которые принадлежат  схеме HumanResources.

Аспект (или особенность) управления Declarative Management Framework

Принимаю предложения по терминологии. Оригинальное название: management facet.  Это набор логических свойств, которые описывают модель поведения  или свойств т набора целей. Возьмем для примера построение индексированного представления. Это одна логическая концепция, которая , однако, подразумевает конфигурацию семи физических параметров.

Так вот аспект, фактически, будет описывать те «кнопки» которые должны быть нажаты. На примере индексированного  представления: сказал – хочу представление, тогда аспект должен будет хранить модель описания того, какие настройки (ограничения) должны быть выполнены.

Набор свойств,  встроенных в аспект управления,  может изменяться только автором.  К одной цели может быть применено несколько аспектов.  Один тип целей (или целевой тип) может устанавливать несколько аспектов управления ( т.е. типов  «реагирования» или поведения) и, с другой стороны, аспект управления может быть установлен несколькими типами целей.

Т.е по сути, у аспекта есть несколько свойств. Пример:  сервисная запись SQL Server – ей свойственны параметры  <имя пользователя> и <пароль>. Соответственно, есть смысл эти оба свойства использовать как часть одного аспекта. 

Примеры аспектов, которые идут с СТР3

 

Условие Declarative Management Framework

Это просто логическое  выражение, которое устанавливает набор разрешенных состояний  цели по отношению к аспекту.

 

Политика Declarative Management Framework

Это условие и ожидаемое поведение. Пример: режим исполнения, фильтр целей и график. Политика может содержать только одно условие и может находиться во включенном или выключенном состоянии.

 

 

Группа политик Declarative Management Framework

Это определенная пользователем группа, которая должна помочь управлять политиками.  Пользователь может определить политики в разные группы.  Каждая политика в свою очередь может принадлежать только одной группе. «Хозяин» базы данных может решить, под какие группы подписаться (т.е какие из политик должны быть применимы к его базе). Соответственно, только те группы, на которые администратор подпишет базу, будут определять  правила управления базой.  Например: подпишется под политику,  запрещающую создания таблиц с дополнительными полями – никто не сможет добавить поля.  Все базы по умолчанию подписаны на группу Default.

Режим исполнения Declarative Management Framework

Описывает, как политика будет выполнена. Режимы спонтанного  исполнения - Check и Configure. Режимы «автоматизированного исполнения»  Check on Schedule, Check on Changes и Enforce.

 

Эффективная  политика

Эффективные политики цели – это политики, которые применены к цели и управляют ею в данный момент. Политика только тогда может быть эффективной по отношению к цели, если:

-  Политика «включена».

-  Цель принадлежит группе целей,  которым  эта политика «предписана».

-  Цель или предок цели (речь идет о иерархии ж ведь) подписан под группу политик, куда данная политика входит

 

 

 

 

 

Posted by MOCKAlb | 1 Comments

Что же вышло с СТР3 SQL Server 2008.

Стали приходить вопросы, что же вышло с СТР3, где то, сё.

Попробую тут коротко рассказать.

Change Data Capture (CDC)
Это компонент, который асинхронно следит за изменениями в базе данных ( за всякими Insert, Update, Delete) и по требованию предоставляет информацию об изменениях в достаточно «удобоваримом» виде – в виде таблиц, где эти изменения отражены.

Презентации на эту тему: Live Meeting 13.06.2007
Change Data Capture. 

 

MERGERSQL
Новая для
T-SQL команда, которая выполняет операции Insert, Update, Delete на целевой  таблице, основываясь на результатах объединения (JOIN) этой таблицы с базовой таблицей или представлением. Синтаксис позволяет сначала объединить базовый ресурс с данными и результирующую таблицу или представление и потом выполнять различные операции над результатом объединения. Очень серьезное послабление для разработчиков больших хранилищ данных, которым приходилось отслеживать изменения в базовой  целевой таблицы, что никак не назвать тривиальной задачей.

 

Презентацию на эту тему можно посмотреть здесь: Live Meeting on 29.062007

Пример:

SE AdventureWorks;

GO

MERGE Production.ProductInventory AS pi

USING (SELECT ProductID, SUM(OrderQty) FROM Sales.SalesOrderDetail sod

    JOIN Sales.SalesOrderHeader soh

    ON sod.SalesOrderID = soh.SalesOrderID

    AND soh.OrderDate = GETDATE()

    GROUP BY ProductID) AS src (ProductID, OrderQty)

ON (pi.ProductID = src.ProductID)

WHEN MATCHED AND pi.Quantity - src.OrderQty <> 0

    THEN UPDATE SET pi.Quantity = pi.Quantity - src.OrderQty

WHEN MATCHED AND pi.Quantity - src.OrderQty = 0

    THEN DELETE;

 

 

Star Join Query Optimizations
Еще один типичный пример из области хранилищ данных.  
Star Join Query позволяет улучшить производительность путем уменьшения времени выполнения запроса. Это достигается тем, что оптимизатор может динамически  применять «маски» фильтров в параллельных планах запросов. Это дает то, что, допустим, «не квалифицированные» строки таблицы будут «вынесены» оптимизатором из таблицы фактов в самом начале плана.


Презентация: Live Meeting 19.062007 Star Join Query Optimizations.  

 

Table Value параметры и Table type переменные
Во многих реальных имплементациях требуется передать фактически несколько строк таблицы хранимой процедуре. Для решения такого типа задач была введена в T-SQL возможность задавать новый тип переменной: табличный. Этот тип поддерживает представление структуры таблицы как параметра в хранимой процедуре или функции. Ну а Table-Valued параметр позволяет осуществить передачу нескольких строк процедуре или функции.

Презентация на эту тему: Live Meeting 22.06.2007
Table Value Parameters.  

 

Declarative Management
Новый инструмент для управления SQL Server Database Engine, основанный на политиках. Некоторые примеры того, что этот инструмент дает:

- Фактически автоматическое слежение за соответствием требованиям к системной конфигурации. (Допустим, при поднятии нового сервера – он автоматически получит «одинаковые» настройки с другими)

- Запрещение и отслеживание изменений в изменениях конфигураций.

Звучит достаточно страшно, но на практике выглядит все красиво. Нам показывали такой пример: задается политика, на то, какая структура разрешена в базе.

Типа: Sales, Product Name, Purchase Data.

Заетм человек идет и созадет запрос о типа CREATE TABLE, но добавляет туда столбец Product ID. И смело жмет GO.

И тут же получает ответ красными буквами через весь экран – не могу, типа. Полиси не разрешает.

Очень полезна штука.

Презентация:Live Meeting  26.06.2007
Declarative Management Framework.  

 

 

Posted by MOCKAlb | 0 Comments

Информация по SQL 2008 (web cast)

О том, что нового будет в SQL 2008 можно будет посмотреть тут:

 

SQL Server 2008 Livemeeting Schedule

Analysis Services - Dimension Design

           06/12/07

          11:00 am PDT

Change Data Capture

           06/13/07

          11:00 am PDT

Star Join Query Optimizations

           06/19/07

          11:00 am PDT

Table Valued Parameters

           06/22/07

          11:00 am PDT

Declarative Management Framework

           06/26/07

          11:00 am PDT

MERGESQL Statement

           06/29/07

          11:00 am PDT

Posted by MOCKAlb | 0 Comments

Новое имя: SQL Server 2008 и выпуск CTP3

Ну, теперь оно случилось официально:  следующая версия SQL Server, известная под кодовым именем Kатмаи, будет официально называться SQL Server 2008, что и будет  объявлено на TecEd 4 июня.

Одновременно с этим объявлением вышла первая версия "на посмотреть", она же СТР3.

Ссылка тут:http://www.microsoft.com/sql/prodinfo/futureversion/default.mspx

Рекомендую посмотреть вебкаст:

TechNet Webcast: The Next Release of Microsoft SQL Server: Overview (Level 200)

Monday, June 4, 2007

12:00 P.M. - 1:15 P.M. Pacific Time

Заодно было объявлено о покупке Dundas Data Visualization Inc, что само по себе обещает существенные изменения в Reporting Server'e

 

Posted by MOCKAlb | 1 Comments

Обновленный BOL на русском языке доступен тут:

http://www.microsoft.com/downloads/details.aspx?displaylang=ru&FamilyID=BE6A2C5D-00DF-4220-B133-29C1E0B6585F

Если идти по этой ссылке: http://www.microsoft.com/technet/prodtechnol/sql/2005/downloads/books.mspx , то там написано, что версия Апрельская. Скорее всего - просто не успели обновить сайт.

А так - качайте и наслаждайтесь. Если есть отзывы - не забывайте присылать

 

Posted by MOCKAlb | 0 Comments

Ошибка: обратитесь к документации!

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

Проблема:

SQL Server 2005, установлен SP2 и , при обращении через ODBC, начинают вылетает ошибка со следующим описанием:

 

ConnectionRead(recv()).

Общая ошибка сети. Обратитесь к документации по сети.

 

Или англоязычный вариант:

 

ConnectionRead(recv())

General network error. Check your network documentation.

 

И еще куча ошибок, которые скорее всего являются второстепенными.

Обращаться к документации не стал (кто же сразу начинает с документации?), а просто полез в «интеллектуальные закрома» , благо их тут навалом. Закромов.

Поиск решения не дал, зато навел на факт – ошибка действительно встречается часто. Были даже упоминания Analysis Services с аналогичными проблемами, но решения  - нет.

Пришлось обратиться к поискам вне – и вот те на:

 

http://blogs.msdn.com/sql_protocols/archive/2006/04/12/574608.aspx

 

Статья: More GNE (General Network Error) messages when running SQL Server after installing service pack 1 for Windows Server 2003 and TCP registry key SynAttackProtect

 

Все понятно и даже с описанием решения!

 

P.S.  SP2 тут не сильно виноват - такое поведение наблюдалось на разных конфигурациях.

Posted by MOCKAlb | 2 Comments

Сервисы офф-лайн синхронизации с SQL Server. Хотите потестировать и пообщаться с разработчиками?

 

Вышла тестовая версия Microsoft Synchronization Services for ADO.NET http://www.microsoft.com/downloads/details.aspx?FamilyId=75FEF59F-1B5E-49BC-A21A-9EF4F34DE6FC&displaylang=en

Смысл данной функциональности в двух словах можно описать следующими примерами:

«Мобильный пользователь»:

·         «Я хочу, чтобы мое приложение, работающее с базой данных, одинаково работало в независимости от того, подключен я к сети или нет»

Разработчик:

·         «Я хотел бы иметь возможность более просто разрабатывать «офф-лайн» приложения»;

·         «Я хотел бы с помощью несложной  разработки на базе ADO.NET создать приложение, которое сможет работать «офф-лайн», без подключения к серверу базы данных, вместо того, чтоб заниматься настройкой сложных способов репликации»

·         «Я хотел бы, чтоб мое приложение, работающее с базой данных, имело код, который не зависит от того, подключен клиент к серверу или нет»

 

Ну и со стороны других участников процесса:

 

·         «Хотелось бы, чтобы это решение не стоило нам дополнительных ресурсов по администрированию»

·         «Хотелось бы, чтобы мобильное приложение не влияло на других подключенных пользователей (невидимое отслеживание изменений)

·         «Хотелось бы, чтобы приложение, подключаемое периодически, управлялось очень просто, когда нужно сделать какие-то изменения в данных или способе работы этого приложения.»

 

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

Posted by MOCKAlb | 2 Comments
More Posts Next page »
 
Page view tracker