Microsoft SQL Server 2008

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 01:12, 31 мая 2018.

Microsoft SQL Server — система управления реляционными базами данных (РСУБД), разработанная корпорацией Microsoft. Основной используемый язык запросов — Transact-SQL, создан совместно Microsoft и Sybase. Transact-SQL является реализацией стандарта ANSI/ISO по структурированному языку запросов (SQL) с расширениями. Используется для работы с базами данных размером от персональных до крупных баз данных масштаба предприятия; конкурирует с другими СУБД в этом сегменте рынка.[Источник 1]


Microsoft SQL Server 2008
Sqlserver2008.png
Разработчики: Sybase, Ashton-Tate, Microsoft
Предыдущий выпуск: 10 / 3 августа 2008
Написана на: C, C++, C#
Операционная система: Windows
Размер дистрибутива: 1 Gb
Лицензия: коммерческая, для разработчиков
Веб-сайт www.cogin.com/dboctopus/

История выпусков SQL Server

Версия Год Название Кодовое имя
1.0 (OS/2) 1989 SQL Server 1.0 (16 bit) Filipi
1.1 (OS/2) 1991 SQL Server 1.1 (16 bit) Pietro
4.21 (Windows NT) 1993 SQL Server 4.21 SQLNT
6.0 1995 SQL Server 6.0 SQL95
6.5 1996 SQL Server 6.5 Hydra
7.0 1998 SQL Server 7.0 Sphinx
- 1999 SQL Server 7.0 OLAP Tools Palato mania
8.0 2000 SQL Server 2000 Shiloh
8.0 2003 SQL Server 2000 64-bit Liberty
9.0 2005 SQL Server 2005 Yukon
10.0 2008 SQL Server 2008 Katmai
10.25 2010 Azure SQL DB Cloud Database or CloudDB
10.50 2010 SQL Server 2008 R2 Kilimanjaro (aka KJ)
11.0 2012 SQL Server 2012 Denali
12.0 2014 SQL Server In-Memory OLTP Hekaton
13.0 2016 SQL Server 2016
14.0 2017 SQL Server vNext


Общие сведения

Версия SQL Server, которая должна была заменить SQL Server 2005, получила кодовое имя Katmai. В период активной разработки Microsoft крайне неохотно делилась информацией о новой версии. На презентации SQL Server 2005 Пол Флесснер (на тот момент занимавший пост вице-президента подразделения Microsoft, занимавшегося разработкой SQL Server), уверенно заявил, что выход новой версии состоится не позднее, чем через два года после выхода SQL Server 2005. Однако в апреле 2007 года ещё не было никакой информации о скором выходе продукта, или хотя бы о начале его бета-тестирования. Тем не менее, в австрийском блоге на TechNet была опубликована информация о программе Katmai Technology Adoption Program (сокр. TAP), начало которой было якобы запланировано на июнь 2007 года. Также были упомянуты слухи о том, что новая версия выйдет в 2008 году, но Microsoft на тот момент ни подтверждала, ни отрицала эту информацию. Некоторые источники привязывали выход Katmai к выходу Longhorn Server and Visual Studio Orcas, из-за чего согласно этой информации новая версия должна была выйти в первой половине 2008 года. Microsoft также отказывалась комментировать эту информацию.

Тем не менее, некоторые журналисты, общавшиеся с представителями корпорации, заявляли о том, что слухи о выходе Katmai в 2008 году вполне соответствуют внутренним планам самой Microsoft. А отказ корпорации разглашать какую-либо информацию о новой версии связывался с переходом на новую модель разработки, причём именно из-за этого Katmai вряд ли должен был выйти в начале 2008 года. Также упоминалось о том, что Katmai не получит этапа официального бета-тестирования, а вместо этого публичное тестирование пройдёт в рамках программы Community Technology Preview (сокр. CTP). При этом утверждалось, что некоторые клиенты Microsoft уже в апреле 2007 года имели на тестировании некоторые части Katmai, не имея при этом на руках релиза целиком. Что касается функциональности новой версии, то журналисты писали о том, что Katmai будет представлять собой лишь развитие SQL Server 2005, а не новое поколение продукта, которым в своё время как раз и стал SQL Server 2005.[1]

Установка

Дистрибутив доступен для загрузки на официальной странице Microsoft.



Типы данных

Типы данных, использующиеся в Microsoft SQL Server 2008. [Источник 2]

Строковые

Типы данных Описание
CHAR(size) Строки фиксированной длиной (могут содержать буквы, цифры и специальные символы). Фиксированный размер указан в скобках. Можно записать до 255 символов.
VARCHAR(size) Может хранить не более 255 символов.
TINYTEXT Может хранить не более 255 символов.
TEXT Может хранить не более 65 535 символов.
BLOB Может хранить не более 65 535 символов.
MEDIUMTEXT Может хранить не более 16 777 215 символов.
MEDIUMBLOB Может хранить не более 16 777 215 символов.
LONGTEXT Может хранить не более 4 294 967 295 символов.
LONGBLOB Может хранить не более 4 294 967 295 символов.
ENUM(x,y,z,etc.) Позволяет вводить список допустимых значений. Можно ввести до 65535 значений в SQL Тип данных ENUM список. Если при вставке значения не будет присутствовать в списке ENUM, то мы получим пустое значение.

Ввести возможные значения можно в таком формате: ENUM ( 'X', 'Y', 'Z')

SET SQL Тип данных SET напоминает ENUM за исключением того, что SET может содержать до 64 значений.

С плавающей точкой (дробные числа) и целые числа

Типы данных Описание
TINYINT(size) Может хранить числа от -128 до 127
SMALLINT(size) Диапазон от -32 768 до 32 767
MEDIUMINT(size) Диапазон от -8 388 608 до 8 388 607
INT(size) Диапазон от -2 147 483 648 до 2 147 483 647
BIGINT(size) Диапазон от -9 223 372 036 854 775 808 до 9 223 372 036 854 775 807
FLOAT(size,d) Число с плавающей точкой небольшой точности.
DOUBLE(size,d) Число с плавающей точкой двойной точности.
DECIMAL(size,d) Дробное число, хранящееся в виде строки.

Дата и время

Типы данных Описание
DATE() Дата в формате ГГГГ-ММ-ДД
DATETIME() Дата и время в формате ГГГГ-ММ-ДД ЧЧ:ММ:СС
TIMESTAMP() Дата и время в формате timestamp. Однако при получении значения поля оно отображается не в формате timestamp, а в виде ГГГГ-ММ-ДД ЧЧ:ММ:СС
TIME() Время в формате ЧЧ:ММ:СС
YEAR() Год в двухзначной или в четырехзначном формате.

Наиболее часто встречающиеся виды SQL-запросов

Запрос — команда, которая подается программе базы данных. Запросы это часть языка DML. Все запросы в SQL состоят из одиночной команды. Структура этой команды обманчиво проста, потому что требуется расширять ее так, чтобы выполнить высоко сложные оценки и обработки данных.

Команда SELECT:

SELECT “Выбор” – самая часто используемая команда, с помощью её идет выборка данных из таблицы.

Вид запроса с применением SELECT:

SELECT id, user_name, city, birth_day FROM users_base;

Такой запрос выведет из таблицы users_base все значения столбцов указанных через запятую после команды SELECT. Также, можно выводить все столбцы одним символом, * т.е. SELECT * FROM users_base; - такой запрос выведет все данные из таблицы.

Структура команды SELECT:

SELECT {Имена столбцов через запятую которые необходимо вывести в запросе} FROM {имя таблицы в базе данных} - это простейший вид запроса. Существуют дополнительные команды для удобства извлечения данных (см. далее “Функции”).

DML команды:

Значения могут быть помещены и удалены из полей, тремя командами языка DML (Язык Манипулирования Данными):

INSERT (Вставка) UPDATE (Обновление, модификация), DELETE (Удаление)

Команда INSERT:

INSERT INTO users_base (user_name, city, birth_day) VALUES (‘Иван’, ‘Рига’, ’20.08.2008’);

Команда INSERT идет вместе с приставкой INTO (in to – в), далее в скобках идут имена столбцов, в которые нужно вставить данные, далее идет команда VALUES (значения) и в скобках по очереди идут значения (обязательно нужно соблюдать очередность значений со столбцами, значения должны идти в той же очередности, как и столбцы указанные вами).

Команда UPDATE:

UPDATE users_base SET user_name = ‘Иван’;

Команда UPDATE обновляет значения в таблице. Сначала идет сама команда UPDATE затем имя таблицы, после команда SET (установит) далее имя столбца и его значение в кавычках (кавычки ставятся в том случае если значение имеет string формат, если это числовое значение и столбец не привязан к типу данных vchar и любых других строковых типов, то кавычки не имеют смысла.)


Команда DELETE:

DELETE FROM users_base WHERE user_name = ‘Джимми’;

Команда DELETE удаляет строку целиком, определяет строку по критерию WHERE (Где). В данном случае этот запрос удалил бы все строки, в которых значение столбца user_name было бы Джимми. О критерии WHERE и других ниже в статье.

Критерии, функции, условия и т.п. что помогает в SQL:

WHERE - предложение команды SELECT и других DML команд, которое позволяет устанавливать предикаты, условие которых может быть или верным или неверным для любой строки таблицы. Команда извлекает только те строки из таблицы, для которых такое утверждение верно.

Пример: SELECT id, city, birth_day FROM users_base WHERE user_name = ‘Андрей’; - такой запрос выведет только те строки, которые будут соответствовать условию WHERE, а именно все строки в которых столбец user_name имеет значение Андрей.

ORDER BY - условие для сортировки выбранных строк. Имеет 2 критерия ASC и DESC. ASC (сортировка от А до Я или от 0 до 9)

DESC (противоположно от ASC).

Пример: SELECT id, city, birth_day FROM users_base ORDER BY user_name ASC; - такой запрос выведет значения отсортированные по столбцу user_name от А до Я (A-Z; 0-9)

Также это условие можно использовать совместно с условием WHERE.

Пример: SELECT id, city, birth_day FROM users_base WHERE user_name = ‘Андрей’ ORDER BY id ASC;

DISTINCT (Отличный) — аргумент, который обеспечивает способом устранять двойные значения из предложения SELECT. Т.е. если имеются повторные значения в столбце, допустим, user_name то DISTINCT выведет вам только одно, например в базе есть 2 человека по имени Андрей, то запрос с использованием функции DISTINCT выведет вам только 1 значение, которое встретит первым.

Пример: SELECT DISTINCT user_name FROM users_base; - такой запрос выведет нам значения всех записей в столбце user_name но они не будут повторяться, т.е. если имелось бесконечное число повторяющихся значений, то они показаны не будут.

AND - берет два Буля (в форме A AND B) как аргументы и оценивает их по отношению к истине, верны ли они оба.

Пример: SELECT * FROM users_base WHERE city = ‘Париж’ AND user_name = ‘Михаил’; - выведет все значения из таблицы где в одной строке встречается название города (в данном случае Париж и имя пользователя Михаил.

OR - берет два Буля (в форме A OR B) как аргументы и оценивает на правильность, верен ли один из них.

SELECT * FROM users_base WHERE city = ‘Лондон’ OR user_name = ‘Денис’; - выведет все значения из таблицы где в строке встречается название города Лондон или Имя пользователя Денис.

NOT - берет одиночный Булев (в форме NOT A) как аргументы и заменяет его значение с неверного на верное или верное на неверное.

SELECT * FROM users_base WHERE city = ‘Милан’ OR NOT user_name = ‘Всеволод’; - выведет все значения из таблицы где в одной строке встретится имя города Милан или имя пользователя не будет ровно Всеволод.

IN - определяет набор значений в которое данное значение может или не может быть включено.

SELECT * FROM users_base WHERE city IN ( ‘Владивосток’, ‘Токио’); - такой запрос выведет все значения из таблицы в которых встретятся наименования указанных городов в столбце city.

Between - похож на оператор IN. В отличии от определения по номерам из набора, как это делает IN, BETWEEN определяет диапазон, значения которого должны уменьшаться что делает предикат верным.

SELECT * FROM users_base WHERE id BETWEEN 1 AND 10; - выводит все значения из таблицы которые будут находиться в диапазоне от 1 до 10 в столбце id

COUNT - производит номера строк или не NULL значения полей, которые выбрал запрос. SELECT COUNT (*) FROM users_base ; - выведет количество строк в данной таблице. SELECT COUNT (DISTINCT user_name) FROM users_base ; - выведет кол-во строк с именами пользователей (не повторяющихся)

SUM - производит арифметическую сумму всех выбранных значений данного поля. SELECT SUM (id) FROM users_base ; - выведет сумму значений всех строк столбца id.

AVG - производит усреднение всех выбранных значений данного поля. SELECT AVG (id) FROM users_base ; - выведет среднее значение всех выбранных значений столбца id

MAX - производит наибольшее из всех выбранных значений данного поля.

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


Создание таблиц:

CREATE TABLE users_base (id integer, user_name text, city text, birth_day datetime); - выполнение такой команды приведёт к созданию таблицы. Тут всё просто, пишем команду CREATE TABLE далее имя таблицы, которую хотим создать, далее в скобках через запятую имена столбцов и их тип данных. Это стандартный вид создания таблицы в SQL. Ниже приведен пример создания таблиц в SQL Server 2005:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Price]') AND type in (N'U'))
BEGIN
CREATE TABLE [dbo].[Price](
[ID] [int] IDENTITY(1,1) NOT NULL,
[NameElement] [text] NOT NULL,
[DateAdded] [datetime] NOT NULL,
[Description] [text] NOT NULL,
PRIMARY KEY CLUSTERED 
(
[ID] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
END
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Clients]') AND type in (N'U'))
BEGIN
CREATE TABLE [dbo].[Clients](
[ID] [int] IDENTITY(1,1) NOT NULL,
[FirstName] [text] NULL,
[LastName] [text] NULL,
PRIMARY KEY CLUSTERED 
(
[ID] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
END
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Orders]') AND type in (N'U'))
BEGIN
CREATE TABLE [dbo].[Orders](
[ID] [int] IDENTITY(1,1) NOT NULL,
[IDClient] [int] NULL,
[IDPrice] [int] NULL,
PRIMARY KEY CLUSTERED 
(
[ID] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
END

Основные нововведения и изменения в SQL Server 2008[Источник 3]

Присвоение переменных в одну строку

Теперь вместо:

  DECLARE @myVar intSET @myVar = 5 

Можно писать так:

   DECLARE @myVar int = 5

Математический синтаксис

DECLARE @myVar int = 5 
SET @myVar += 1

Компрессия

a) Можно включить компрессию для таблиц/партиций таблиц, индексов.

b) Уровней компрессий — 2:

  • 1) Строчное,
  • 2) Страничное

c) В страничное сжатие включается строчное. В страничном сжатии есть тип сжатия основанный на «column prefix» matching

d) Бекапы автоматически сжимаются.

В целом сообщается, что нагрузка на процессор может возрасти и использование памяти уменьшится.

Включить сжатие можно через Management Studio:

Сжатие часть 1
Сжатие часть 2
Сжатие часть 3

выбирать партиции таблицы и сгенерированный скрипт сжатия:

USE [test_db]

 ALTER TABLE [dbo].[TestTable] REBUILD PARTITION = ALL 
WITH (DATA_COMPRESSION = PAGE)


Либо такой:

USE [test_db]

CREATE NONCLUSTERED INDEX IX_INDEX ON TestTable (TestTableVarFieldOne) 
WITH ( DATA_COMPRESSION = PAGE ); 

Минусы лицензии: Сжатие доступно только в выпусках SQL Server 2008 Enterprise и Developer.

Появились индексы с фильтрацией

CREATE NONCLUSTERED INDEX IX_TestTable_OneON TestTable(TestTableVarFieldOne) 
WHERE TestTableVarFieldOne = `SampleText`
Индекс фильтрации
Параметры фильтрации

Для чего это нужно:

Например мы знаем что по колонке очень часто идет какой-нибудь текстовый запрос из разряда = ‘SampleText’, ставим этот индекс, и наш план выполнения запроса становится вкусный и быстрый.

В SQL Server 2008 есть автоматический аудит

Вызывается он из Management Studio из группы «Security».

Создадим правило аудита, кстати, параметр «Maximum», идущий после параметра «File Path», означает, сколько файлов будет создаваться в папке.

Теперь ставим аудит на сервер в целом или Базу данных.

Например, нам нужно поставить аудит на то, кто смотрел данные из таблицы «TestTable», обладающий правами «db_datareader»:

Для этого определим тип действия (их, кстати, порядка 30), класс объекта (БД/Схема/Объект), имя объекта и группу прав.

Это же можно сделать и в T-SQL:

USE [test_db] 
GO 

CREATE DATABASE AUDIT SPECIFICATION [TestTableAuditOnView] 
FOR SERVER AUDIT [TestAudit] 
ADD (SELECT ON OBJECT::[dbo].[TestTable] BY [db_datareader])WITH (STATE = OFF)GO

Ну и потом не забудем сделать наш аудит «Enable»

Новый дебаггер

Собственно дебаггер простой напоминает сильно дебаггер в Visual Studio, ходит по точкам, и по Step Into/Step Out, можно ставить Watch, смотреть Call Stack, автоматически заходить в триггеры. В 2005 версии это можно было делать либо из Visual Studio, либо из Business Intelligence Studio и, что не очень удобно, права для разработчиков - «sysadmin»

Прозрачное шифрование БД

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

Замораживание плана запросов (Plan freezing)

SQL Server иногда пытается менять план запроса, в зависимости от того, как поменялись данные (схема БД). Необходимо это для двух вещей:

  1. Для того, чтобы сервер не тратил время, пересчитывая план,
  2. Для того чтобы сервер не «разоптимизировал» план

Это довольно большой объем работы, поэтому лучше воспользоваться Virtual Lab.

Resource Governor (Разделение ресурсов сервера)

В Management Studio пункт меню находится в группе «Management», в окне Object Explorer.

Новые типы данных

  1. DATE – храним только дату
  2. TIME – храним только время
  3. DATETIMEOFFSET – храним дату и время со смещениями «+» или «-»
  4. DATETIME2 – храним дату и время от January 1, 0001 до December 31, 9999
  5. HierarchyId – храним данные иерархий причем дерево иерархий будет довольно компактным.
  6. Geometry и Geography это специальные типы, которые содержат в себе векторные объекты:
    1. Object Descripton
    2. Point A location
    3. MultiPoint A series of points.
    4. LineString A series of zero or more points connected by lines.
    5. MultiLineString A set of linestrings
    6. Polygon A contiguous region described by a set of closed linestrings.
    7. MultiPolygon A set of polygons.
    8. GeometryCollection A collection of geometry types.
  7. FileStream – храним данные в файловой системе

Отличия в том, что расстояния в типе Geography выражены в виде градусах долготы и широты, а Geometry в специфичных Unit.

Table Value Parameters (можно передавать таблицы как параметр)

Для чего может быть нужно передавать таблицу из приложения в Базу Данных?

  1. Для того чтобы уменьшить кол-во INSERT/UPDATE операций,
  2. Для того чтобы некоторые части слоя бизнес-логики перенести на сервер

Плюсы:

  1. Строгая типизация
  2. Сортировка
  3. Мы можем в этих таблицах использовать индексы (первичный ключ)
  4. Удобство

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


Пример SQL кода:

Use testDatabase
GO
CREATE TYPE Customer AS TABLE (id int, CustomerName nvarchar(50), postcode nvarchar(50)); 
GO
CREATE TABLE Customers (id int, CustomerName nvarchar(50)); 
GO
CREATE TABLE CustomerPostCodes(id int, postcode nvarchar(50));
GO
/*
INSERT INTO Customers VALUES (1, `Bob`)
INSERT INTO CustomerPostCodes VALUES (1, `ASD`)
INSERT INTO Customers VALUES (2, `Jack`)
INSERT INTO CustomerPostCodes VALUES (2, `QWE`)
INSERT INTO Customers VALUES (3, `Gill`)
INSERT INTO CustomerPostCodes VALUES (3, `ZXC`)
GO
*/
CREATE Procedure AddCustomers (@customer Customer READONLY) 
AS 
INSERT INTO Customers
SELECT id, CustomerName FROM @customer

INSERT INTO CustomerPostCodes
SELECT id, postcode FROM @customer
GO

DECLARE @myNewCustomer Customer;
INSERT INTO @myNewCustomer VALUES (1, `Harry`, `NEW`)
EXEC AddCustomers @myNewCustomer
GO

SELECT * FROM Customers
SELECT * FROM CustomerPostCodes
GO

Drop table Customers;
go

Drop table CustomerPostCodes;
go

Drop procedure AddCustomers;
go

Drop type Customer;
go

Из C# соответственно передается параметром DataTable.

Новое в Management Studio:

  • IntelliSense
Умная вставка
  • Удобная подсветка (тултипы):

К сожалению «+=» это только математический оператор

  • Она поддерживает Addin-ы.
  • Интегрированы новые фишки сервера и удобства — например, дай мне «только 1000 строк»
Быстрые команды
  • Обновился Activity Monitor.

Проще написать, что тут можно увидеть «картину в целом», хотя все же частные детали лучше смотреть SQL Profiler, он для этого более приспособлен, а счетчики эти частично заимствованы из Windows Server 2008/Vista «Мониторинг производительности». Неплохо сделанный «логгер последних ресурсоемких запросов»: Есть возможность просмотреть сразу план выполнения запроса: Минусы: Нельзя убрать ненужные колонки или менять их местами

  • Мульти-серверные запросы.

Можно выполнить запрос (ы) на группе серверов, для этого нужно открыть пункт меню (View -> Registered Servers -> New Query).

Вывод

В определенный период Microsoft SQL Server 2008 был достаточно хорош, но сейчас Microsoft прекратило его поддержку в пользу более новых версий. Однако для учебных целей он все еще пригоден и относительно активно используется.

Примечания

Источники

  1. История создания Microsoft SQL Server / / Wikipedia. [2004–2018]. Дата обновления: 03.05.2018. URL: https://ru.wikipedia.org/wiki/%D0%98%D1%81%D1%82%D0%BE%D1%80%D0%B8%D1%8F_%D1%81%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D1%8F_Microsoft_SQL_Server (дата обращения: 07.05.2018)
  2. Типы данных Microsoft SQL Server 2008 / / Sql-language. [2007–2018]. Дата обновления: 13.04.2017. URL: https://sql-language.ru/sqldatetype.html (дата обращения: 20.05.2018)
  3. SQL Server 2008: обзор нововведений / / Rusdoc. [1998–2012]. Дата обновления: 15.09.2008. URL: http://www.rusdoc.ru/articles/sql_server_2008_obzor_novovvedenij/17728/print/ (дата обращения: 09.05.2018)

Ссылки