Часть вторая. Демонстрация независимости от фрагментации
Исходные данные - БД в 1НФ
Выполнить горизонтальную фрагментацию БД (SQL-скрипт) по некоторому критерию;
Критерий: телефоны, оканчивающиеся на четную цифру будут хранится на ноутбуке, нечетную – на нетбуке.
Создать таблицу на ноутбуке tels1
/* Создаём таблицу */
CREATE TABLE tels1 (tel CHAR(8) NOT NULL PRIMARY KEY,typ CHAR(1) NOT NULL,postcode INT,place VARCHAR(64), street VARCHAR(64), house VARCHAR(16), flatroom INT,own VARCHAR(96));
/* Помещаем в неё строки с номерами телефонов, оканчивающимися на чётную цифру */
INSERT INTO tels1 SELECT * FROM NETBOOK.stasya.dbo.tels WHERE tel LIKE '%[02468]';
На нетбуке tels2
/* Создаём таблицу с номерами телефонов */
CREATE TABLE tels2 (tel CHAR(8) NOT NULL PRIMARY KEY,typ CHAR(1) NOT NULL,postcode INT,place VARCHAR(64), street VARCHAR(64), house VARCHAR(16), flatroom INT,own VARCHAR(96)); /* Создаём таблицу номеров телефонов */
/* Помещаем в таблицу номера телефонов, оканчивающиеся на нечётную цифру */
INSERT INTO tels2 SELECT * FROM tels WHERE tel LIKE '%[1359]';
Создать синонимы для таблицы нетбука
/* Создаём синоним */
CREATE SYNONYM tels2 FOR NETBOOK.stasya.dbo.tels2;
Создать синонимы для таблицы ноутбука
/* Создаём синоним */
CREATE SYNONYM tels1 FOR NOTEBOOK.stasya.dbo.tels1;
Создать скрипт выборки данных
/* Тестовый скрипт выборки данных - выбирает информацию о случайном номере телефона из БД */
DECLARE @tel VARCHAR(8); /* Переменная - случайный номер телефона */
DECLARE @i INTEGER; /* Переменная - итерация */
/* Переменная - временная таблица. Без неё MS SQL останавливает выборку данных... */
DECLARE @t TABLE(tel CHAR(8) NOT NULL,typ CHAR(1) NOT NULL,postcode INT,place VARCHAR(64), street VARCHAR(64), house VARCHAR(16), flatroom INT,own VARCHAR(96));
SET @i=0; /* устанавливаем счётчик итераций в 0 */
WHILE (@i<10000) /* пока счётчик меньше 10000 выполняем выборку информации */
BEGIN
/* Получаем случайный номер телефона */
SET @tel=CAST(round(RAND()*14+21,0) AS VARCHAR(2))+'-'+CAST(round(RAND()*89+10,0) AS VARCHAR(2))+'-'+CAST(round(RAND()*89+10,0) AS VARCHAR(2));
/* Делаем выборку данных из распределённой БД и вставку во временную таблицу строки с информацией о номере телефона */
INSERT INTO @t SELECT * FROM tels1 WHERE tel=@tel UNION SELECT * FROM tels2 WHERE tel=@tel;
/* Удаляем строку из временной таблицы */
DELETE FROM @t;
/* Увеличиваем номер итерации на 1 */
SET @i=@i+1;
END;
1 узел (ноутбук) |
2 узел (нетбук) |
2 мин 22 сек |
2 мин 42 сек |
2 мин 17 сек |
2 мин 29 сек |
2 мин 20 сек |
2 мин 28 сек |
2 мин 22 сек |
2 мин 30 сек |
Среднее время выполнения: | |
2 мин 2 сек |
2 мин 3 сек |
Время выполнения скрипта на компьютерах почти равное, так как объем передаваемых данных по сети примерно одинаковый.
Выполнить вертикальную фрагментацию БД (SQL-скрипт) по некоторому критерию
Расположение столбцов таблицы
Нетбук |
Ноутбук |
Номер телефона - tel Номер дома - houses Номер квартиры - flatroom Город - place Улица - street |
Номер телефона - tel Тип - typ Индекс - postcode Владелец - own |
Создание и заполнение таблиц
На ноутбуке
/* Создаём таблицу с номерами телефонов: тип абонента, почтовый код, владелец */
CREATE TABLE tels_left (tel CHAR(8) NOT NULL PRIMARY KEY,typ CHAR(1) NOT NULL,postcode INT,own VARCHAR(96));
/* Заполняем таблицу */
INSERT INTO tels_left SELECT tel,typ,postcode,own FROM NETBOOK.stasya.dbo.tels;
На нетбуке
/*Создаём таблицу номеров телефонов с городом, улицей, номером дома и квартирой */
CREATE TABLE tels_right (tel CHAR(8) NOT NULL PRIMARY KEY,place VARCHAR(64), street VARCHAR(64), house VARCHAR(16), flatroom INT);
/* Заполняем созданную таблицу */
INSERT INTO tels_right SELECT tel,place,street,house,flatroom FROM tels;
Создать синонимы
На ноутбуке
/* Создаём синонимы */
CREATE SYNONYM tels_right FOR NETBOOK.stasya.dbo.tels_right;
На нетбуке
/* Создаём синонимы */
CREATE SYNONYM tels_left FOR NOTEBOOK.stasya.dbo.tels_left;
Скрипт выборки данных
/* Тестовый скрипт выборки данных - выбирает информацию о слуайном номере телефона из БД */
DECLARE @tel VARCHAR(8); /* Переменная - случайный номер телефона */
DECLARE @i INTEGER; /* Переменная - итерация */
/* Переменная - временная таблица. Без неё MS SQL останавливает выборку данных... */
DECLARE @t TABLE(tel CHAR(8) NOT NULL,typ CHAR(1) NOT NULL,postcode INT,place VARCHAR(64), street VARCHAR(64), house VARCHAR(16), flatroom INT,own VARCHAR(96));
SET @i=0; /* устанавливаем счётчик итераций в 0 */
WHILE (@i<10000) /* пока счётчик меньше 10000 выполняем выборку информации */
BEGIN
/* Получаем случайный номер телефона */
SET @tel=CAST(round(RAND()*14+21,0) AS VARCHAR(2))+'-'+CAST(round(RAND()*89+10,0) AS VARCHAR(2))+'-'+CAST(round(RAND()*89+10,0) AS VARCHAR(2));
/* Делаем выборку данных из распределённой БД и вставку во временную таблицу строки с информацией о номере телефона */
INSERT INTO @t SELECT tels_left.tel,typ,postcode,place,street,house,flatroom,own FROM tels_left INNER JOIN tels_right ON tels_left.tel=tels_right.tel WHERE tels_left.tel=@tel;
/* Удаляем строку из временной таблицы */
DELETE FROM @t;
/* Увеличиваем номер итерации на 1 */
SET @i=@i+1;
END;
1 узел (ноутбук) |
2 узел (нетбук) |
2 мин 16 сек |
2 мин 38 сек |
2 мин 15 сек |
2 мин 21 сек |
2 мин 9 сек |
2 мин 28 сек |
2 мин 13 сек |
2 мин 25 сек |
Среднее время выполнения: | |
2 мин 13 сек |
2 мин 28 сек |
Время выполнения не сильно отличается, так как столбцы разделены так, чтобы объем передаваемых данных по сети был примерно одинаковый.