Биты и байты.

Биты и байты.

четверг, 26 декабря 2013 г.

Новые фичи SQL SERVER 2012 (обрывок 1)

Жизнь не стоит на месте, чтобы быть конкурентным нужно быть постоянно в движении,

видимо этому правилу и придерживаются разработчики SQL Server, посмотрим чем нас хотят удивить в  SQL SERVER 2012

и что из этого может реально принести какую-то пользу.

 

 

1. Индексы ColumnStore

Отличительная особенность колоночных индексов в том, что они основаны на колоночном хранении данных.
 
Под построчным хранением данных обычно понимается физическое хранение всей строки таблицы в виде одной записи, в которой поля идут последовательно одно за другим, а за последним полем записи в общем случае идет первое следующей записи. Приблизительно так: 
[A1, B1, C1], [A2, B2, C2], [A3, B3, C3]…
где A, B и С — это поля (столбцы), а 1,2 и 3 — номер записи (строки). 

Колоночное хранение - с точки зрения SQL-клиента данные представлены как обычно в виде таблиц, но физически эти таблицы являются совокупностью колонок, каждая из которых, по сути, представляет собой таблицу из одного поля. При этом физически на диске значения одного поля хранятся последовательно друг за другом — приблизительно так: 
[A1, A2, A3], [B1, B2, B3], [C1, C2, C3] и т.д. 
Создается как обычный индекс в SSMS или через SQL CREATE NONCLUSTERED COLUMNSTORE INDEX
Есть конечно свои  плюсы и минусы этой технологии, что не порадовало  после создания такого индекса в таблицу напрямую не внести изменения.
Операторы INSERT,UPDATE, DELETE и MERGE не поддерживаются, для обновления данных приходится пользоваться всякими извращениями . Подробно

2. Наконец-то появились последовательности SEQUENCE, тем кто  знаком с ORACLE знают какая это полезная штука.  
Например если каждый год нужно  заново нумеровать документы.

create sequence MySeq as int
       start with -- Start with value 1
       increment by 1-- Increment with value 1
       minvalue 0 -- Minimum value to start is zero
       maxvalue 100 -- Maximum it can go to 100
       no cycle -- Do not go above 100
       cache 50 -- Increment 50 values in memory rather than incrementing from

SELECT NEXT VALUE FOR dbo.MySequence AS seq_no;

3. Разбивка выборки на страницы.  OFFSET и FETCH для ограничения числа возвращаемых строк  
Если выборку необходимо вернуть порциями эта фича будет очень кстати.
Обязательно задаем порядок ORDER, смещение от начала OFFSETFETCH сколько строк нам требуется. Почитать тут.

USE AdventureWorks2012;
GO
-- Specifying variables for OFFSET and FETCH values 
DECLARE @StartingRowNumber tinyint = 1
      , @FetchRows tinyint = 8;
SELECT DepartmentID, Name, GroupName
FROM HumanResources.Department
ORDER BY DepartmentID ASC
    OFFSET @StartingRowNumber ROWS
    FETCH NEXT @FetchRows ROWS ONLY;


4. Добавились новые аналитические функции и снова привет от ORACLE ))
Все функции оконные, т.е выполняются внутри какого-то  набора строк (окна), через конструкцию  OVER (PARTITION BY... ORDER BY) 

Function
MSDN
CUME_DIST
FIRST_VALUE
LAST_VALUE
LEAD
LAG
PERCENTILE_CONT
PERCENTILE_DISC
PERCENT_RANK

5. Автономные базы данных. Contained Database.  
Обычная база данных, привязана к экземпляру, через словарь метаданных  (база master) , логины которые есть на сервере и другие серверные объекты.
Автономная база данных позволяет создать изолированную от других базу данных и от экземпляра SQL Server, на котором размещена эта база данных. SQL Server 2012.
Теперь можно легко переносить одну базу между различными серверами. Настраивается за 3 шага. Подробно смотри видео.

Сразу бы хотелось отметить плюсы и минусы такой автономии
+Не нужно копировать вместе с базой серверные объекты
+Не требуется согласовывать настройки с администратором сервера

-Нет единого списка имен входа
-ПАРОЛЬНЫЕ ХЕШИ ПОПАДАЮТ В РЕЗЕРВНУЮ КОПИЮ

Шаг 1: - Для начала для экземпляра необходимо включить опцию "Enabled Contained Database" to "true".
То же самое можно сделать через SQL
sp_configure 'show advanced options',1
GO
RECONFIGURE WITH OVERRIDE
GO
sp_configure 'contained database authentication', 1
GO
RECONFIGURE WITH OVERRIDE
GO
Шаг 2 – Разрешить автономную базу  на уровне БД выставить параметр "Containment type" в значение  partial.
Тоже самое можно сделать через SQL.
CREATE DATABASE [MyDb]
CONTAINMENT = PARTIAL
ON PRIMARY
( NAME = N'My', FILENAME = N'C:\My.mdf')
LOG ON
( NAME = N'My_log', FILENAME =N'C:\My_log.ldf')
шаг 3: - Создать пользователя в БД для проверки работоспособности автономной базы.
Или с помощью скрипта
CREATE USER MyUser
WITH PASSWORD = 'pass@123';
GO
Теперь если соединяться с экземпляром под эти логином выдаст нам ошибку
Для того чтобы соединиться с  автономной базой нужно в опции Connect to database  написать имя своей базы
6. Обработка ошибок THROW на замену RAISERROR.  
Если у вас есть опыт программирования на .net то конструкция вида try/catch/throw будет вам очень знакомой

DECLARE @a INT

BEGIN TRY
    SET @a = 10 / 0
END TRY
BEGIN CATCH
    PRINT 'In catch block.';
    THROW 51000, 'The record does not exist.', 1;
END CATCH;

6. Появилось 14 новых функций.  

Функции преобразования:

PARSE
TRY_CONVERT
TRY_PARSE

Функции даты и времени:

DATEFROMPARTS
DATETIME2FROMPARTS
DATETIMEFROMPARTS
DATETIMEOFFSETFROMPARTS
EOMONTH
SMALLDATETIMEFROMPARTS
TIMEFROMPARTS

Логические функции:

CHOOSE
IIF

Строковые функции:

CONCAT
FORMAT

Причем
IIF реально полезна, для сокращения записи вместо  CASE WHEN  (@a > @b) THEN 'TRUE' ELSE 'FALSE' END

теперь можно написать:
 IIF ( @a > @b, 'TRUE', 'FALSE' )

Ну и  под занавес….

Вбегает в магазин маньяк и кричит: - Сейчас кого-нибудь изнасилую! Девушка как вас зовут? - Зина. - Нет, Вас не буду насиловать. Мою мать тоже зовут Зина. А тебя мужик как зовут? - Ну, вообще-то, Николай, но друзья зовут меня Зиной...


About