Ivan Kosyakov — FastTrack DW

advertisement
FastTrack Data Warehouse
Особая благодарность
Алексею Халяко из SQLCAT
Иван Косяков
Technology Architect, MTC Moscow
i-ivanko@microsoft.com
Что такое FastTrack Data Warehouse?
 Метод построения эффективной по затратам, сбалансированной
системы для загрузки, типично для хранилищ данных
 Эталонные аппаратные конфигурации разработаны с
поставщиками оборудования
 Рекомендации размещения, загрузки и управления данными
Используется только для реляционных хранилищ –
не для SSAS, IS, RS
Темы
 Сбалансированная архитектура, как подход к
построению DW
 Примеры справочных архитектур FastTrack DW
 Оптимизация хранилищ, загрузки и поддержка
 Примеры внедрений
 Выводы
SQL Server
Windows Server OS
Storage Interconnect
Архитектура компонентов FastTrack DW
Storage
Processor
Disk Array
Host Storage Adaptor
Server
Storage Enclosure
CPU Feed Rate
FC
HBA
SQL Server
Read Ahead Rate
A
B
A
B
HBA Port Rate
DISK
A
B
STORAGE
CONTROLLER
CACHE
FC
HBA
FC SWITCH
CACHE
SQL SERVER
WINDOWS
CPU CORES
SERVER
Потенциальные узкие места в системе
DISK
A
LUN
A
B
DISK
DISK
B
LUN
Switch Port Rate
SP Port Rate
LUN Read Rate
Disk Feed Rate
Сбалансированная архитектура
Компонент
Сбалансирован для …
CPU
Максимальное потребление данных из кэша для
определенных наборов запросов (на следующих
слайдах)
Controller (Service
Пропускной канал для поставки данных ядрам CPU
(базируется на наборе запросов)
Processor)
HBA
(Host Bus Adapter)
Агрегирует потоки данных, поставляемые контроллером
Switch
Выровнен с пропускной способностью HBA и
оптимизирован для последовательного ввода-вывода
Disks
Агрегирует потоки данных с контроллера /емкость
хранилища
Cбалансированная система





Построить систему, состоящую из сервера и хранилища, в которых
пропускная способность ввода-вывода может достаточно загрузить SQL
Relational DW
Избегайте разделения хранилища с другими серверами
Избегайте избыточного инвестирования в диски
 Обращайте внимание на производительность scan операций, а не IOPS
Располагайте данные так, чтобы максимально использовать сканирование
диапазонов
Минимизировать фрагментацию данных
Характеристики нагрузок хранилищ данных
 Интенсивные
сканирования
 Hash Joins
 Агрегации
SELECT
L_RETURNFLAG, L_LINESTATUS, SUM(L_QUANTITY) AS SUM_QTY,
SUM(L_EXTENDEDPRICE) AS SUM_BASE_PRICE,
SUM(L_EXTENDEDPRICE*(1-L_DISCOUNT)) AS
SUM_DISC_PRICE,
SUM(L_EXTENDEDPRICE*(1-L_DISCOUNT)*(1+L_TAX))
AS SUM_CHARGE,
AVG(L_QUANTITY) AS AVG_QTY,
AVG(L_EXTENDEDPRICE) AS AVG_PRICE,
AVG(L_DISCOUNT) AS AVG_DISC,
COUNT(*) AS COUNT_ORDER
FROM
LINEITEM
GROUP
BY
L_RETURNFLAG,
L_LINESTATUS
ORDER
BY
L_RETURNFLAG,
L_LINESTATUS
Проверка системы
 Для подтверждения корректной настройки
 Фазы тестирования:
 Синтетические тесты ввода-вывода
 Проверка системы хранения, сети, операционной системы
 SQLIO для генерации операций ввода-вывода
 Perfmon – для мониторинга
 Тестирование SQL Server
 Проверка производительности стека SQL Server
 Maximum Consumption Rate (MCR) – данные из памяти для
обработки запроса процессором
 Benchmark Consumption Rate (BCR) – данные с диска для
обработки типичной нагрузки процессором
 Финальный шаг процесса внедрения
Демонстрация
тестирования ввода-вывода
Сбалансированная система - CPU
 Определить объем потребления данных на ядро процессора для
набора запросов


Пример: Предположим TPC-H запрос 2 – типичная загрузка для
системы
Выполнить запрос на тестовом сервере с данными полностью
загруженными в кэш
 Запрос выполняется параллельно с MAXDOP 4
 Убедиться в загрузке 100% CPU на 4 ядрах
 Засечь время выполнения и определить количество прочитанных
#страниц
 (Set Statistics IO on; Set Statistics Time on)
 Расчет нагрузки на ядро = (# Logical Reads * 8K)/(CPU Time)
Можно сделать еще корректнее
 В принципе, запросы, которые выполняют
достаточно сложные вычисления,
форматирование, объединения измерений –
потребляют больше CPU
 Сложные запросы будут «медленней» потреблять
мощность ядер, чем простые
 Измерить потребление данных на ядро для
разных запросов и вычислить «средний вес»
 Стандартный подход при расчете вычислительной
емкости системы
Или давайте это сделаем мы…
 Мы протестировали набор TPCH запросов,
которые соответствуют «типовой» загрузке для
Data Warehouse
 Сделали вывод, что SQL Sever 2008 на нынешней
x64 ядерной платформе потребляет ~200 MB/Sec
на ядро в среднем для такого типа загрузки
 Использовали эти выводы как базу для
опубликованной «эталонной» архитектуры
 Однако, Ваша нагрузка может отличаться!
 Для точного выбора архитектуры и объемов используйте
свои измерения
Примеры загрузки CPU
Пример 1:
Характеристики запроса: Сканирование одного кластерного индекса, hash
match, агрегации по 8 столбцам
Statistics IO: logical reads 3361015, physical reads 0, Readahead reads 0
Statistics Time: CPU time = 144690 ms
Нагрузка на ядро: (3361015 * 8K) / (144690) = 185 MB/s per core
Пример 2:
Характеристики запроса: 3 объединения таблиц, одна агрегация,
множественные hash joins, агрегация по одному столбцу
Statistics IO:
logical reads (total all tables) 2078006, physical reads 0, Readahead reads 0
Statistics Time: CPU time = 121167 ms
Нагрузка на ядро: (2078006 * 8K) / (121167) = 137 MB/s per core
Quad Core AMD
Opteron 2384 (Shanghai)
Fast Track калькулятор
 Определив типы запросов к системе
используйте калькулятор:
User Variable Input
Anticipated total number of users expected on
the system
Estimated percent of actual query concurrency
Fast Track DW CPU max core consumption rate
(MCR) in MB/s of page compressed data per core
Estimated compression ratio (default = 2.5:1)
Estimated drive serial throughput speed in
compressed MB/s
Number of data drives in single storage array
Usable capacity per drive
Space Reserved for TempDB
Adjust for
workload mix
3.000 us e rs
1% concurre ncy
200 MB/s
2,5 :1
Estimated %
Estimated % of data found in
workload
SQL Server
cache
Estimated Query
Desired Query
Data
Estimated Disk
Response Time
Scan Volume
Scan volume MB
(seconds)
MB
(Uncompressed)
(under load)
(Uncompressed)
Si mpl e
70%
10%
8.000
25
7.200
Ave ra ge
20%
0%
75.000
180
75.000
Compl e x
10%
0%
450.000
1.200
450.000
100%
100 MB/s
8 dri ve s
272 GB
26%
Calculations and Results
% of core
consumption
rate achieved
Simple
Average
Complex
100%
50%
25%
Expected per
CPU core
consumption
rate (MB/s)
200
100
50
Calculated
Single Query
Scan Volume in
MB
(compressed)
2.880
30.000
180.000
Calculated
Target
Concurrent
Queries
Estimated
Target
Queries per
Hour
Required IO
Throughput in
MB/s
Estimated
Estimated Single
Number of
Query Run Time
Cores Required
(seconds)
21
6
3
3.024
120
9
2.419
1.000
450
12,10
10,00
9,00
30
3.153
3.869
32,00
0,5
9,4
112,5
Сбалансированная система - хранилище
 Количество ядер CPU и пропускная способность
загрузки помогут определить количество
контроллеров и «корзин» для представления
суммарной нагрузки
 # контроллеров определит минимальное
количество дисков для предоставления пропускной
способности сканирования
 Определить требуемую емкость / # дисков исходя
из ожидаемого объема дискового пространства

Оставить достаточно пространства для TempDB или особенно
большим таблицам в системе (для административных задач)
Сбалансированная система - IO
 Используем для начала
2-x четырех ядерных
сервера
 Убедиться, что скорость
потребления данных на
ядро может быть
предоставлена всеми
компонентами в стеке
ввода-вывода
Максимальная теоретическая пропускная
способность IO стека оптимизированного для 8
ядерной Fast Track архитектуры ( предполагая
200 MB/s на ядро)
CPU Socket
(4 Core)
CPU Socket
(4 Core)
Сбалансированная система –
хранилище (2) Наблюдаемая пропускная способность
 Теоретические
максимумы - всегда
только теоретические
 Тесты для получения
реальных параметров
могут быть
необходимы
на 8 ядерной системе Fast Track при
выполнении SQLIO
CPU Socket
(4 Core)
CPU Socket
(4 Core)
Сбалансированная система – масштабирование
Storage Processor
Fiber
Switch
CPU
Socket
(4 Core)
CPU
Socket
(4 Core)
CPU
Socket
(4 Core)
CPU
Socket
(4 Core)
Storage Processor
CPU
Socket
(4 Core)
CPU
Socket
(4 Core)
Storage Processor
CPU
Socket
(4 Core)
CPU
Socket
(4 Core)
Storage Processor
Storage Enclosure
Storage Processor
RAID-1
RAID-1
RAID-1
RAID-1
RAID-1
Storage Enclosure
Storage Processor
RAID-1
RAID-1
RAID-1
RAID-1
RAID-1
Storage Enclosure
Storage Processor
Storage Processor
HBA
Storage Processor
Storage Processor
HBA
HBA
Storage Processor
Storage Processor
Storage Processor
Storage Processor
RAID-1
RAID-1
RAID-1
Storage Enclosure
RAID-1
RAID-1
RAID-1
RAID-1
RAID-1
RAID-1
RAID-1
RAID-1
RAID-1
RAID-1
Storage Enclosure
HBA
HBA
RAID-1
RAID-1
Storage Enclosure
HBA
HBA
RAID-1
RAID-1
RAID-1
RAID-1
RAID-1
Storage Enclosure
HBA
Server
RAID-1
RAID-1
RAID-1
RAID-1
RAID-1
Storage Processor
Storage Processor
RAID-1
RAID-1
RAID-1
RAID-1
RAID-1
Storage Enclosure
Темы
 Предпосылки
 Сбалансированная архитектура, как подход к
построению DW
 Примеры справочных архитектур FastTrack DW
 Оптимизация хранилищ, загрузки и поддержка
 Примеры внедрений
 Выводы
Оптимизация схемы хранилища для
интенсивных сканирований
 Конфигурация LUN’ов базируется на
RAID10

Предоставляет оптимальный уровень
доступа к дискам
 «Размазывание» данных по дискам
происходит на уровне файлов SQL
Server (разбиение на файлы в
файловой группе)
 Наблюдаемая производительность
одной RAID пары >= 130 MB/s
S
P
A
S
P
B
RAID GP01
RAID GP02
01
03
02
LUN1
LUN3
LUN2
LUN4
04
RAID GP04
05
07
06
LUN7
LUN6
LUN8
09
10
LUN0
(Logs)
RAID GP03
LUN5
RAID GP05
08
HS
Влияние схемы хранилища на SQL Server
Stage
DB
Permanant_DB
LUN 1
LUN 2
LUN16
LUN 3
Permanent FG
Permanent_1.ndf
Permanent_2.ndf
Permanent_16.ndf
Permanent_3.ndf
Stage FG
Stage_1.ndf
Stage_2.ndf
Stage_3.ndf
Stage_16.ndf
Temp
DB
Local Drive 1
TempDB.mdf (25GB)
TempDB_02.ndf (25GB)
TempDB_03ndf (25GB)
TempDB_16.ndf (25GB)
Log LUN 1
Permanent DB Log
Stage DB Log
Секционирование таблиц
Table January: Partitioned by day, all days in one File Group
January_static
01.01.2011 02.01.2011 …
January_1.ndf
January_2.ndf
January_3.ndf
January_4.ndf
…
January_N.ndf
FG_January
February_Static
30.01.2011 31.01.2011
01.02.2011 02.02.2011 …
LUN1
LUN_N
27.02.2011 28.02.2011
February_1.ndf
February_2.ndf
February_3.ndf
February_4.ndf
…
February_N.ndf
FG_February
Обзор фрагментации
 Логическая фрагментация


Величина, показывающая степень несоответствия порядка размещения
физических страниц логическому ключу(по всем файлам)
sys.dm_db_index_physical_stats: Logical_Fragmentation
B-tree
Page
Фрагментация
B-tree
Page
B-tree
Page
Листовые
страницы
1:31
1:32
1:54
1:33
1:34
1:35
1:53
1:36
Логический порядок индекса
1:37
1:38
1:39
1:40
1:41
1:42
1:80
1:60
Обзор фрагментации
 Фрагментация экстентов
 Величина, показывающая на сколько размещение
экстентов является упорядоченным (по всем файлам)
 sys.dm_db_index_physical_stats:
Avg_Fragment_Size_in_Pages, Fragment_Count
Idx 1
Idx 1
Idx 2
Idx 2
Idx 1
Idx 1
Idx 1
Idx 1
Экстенты внутри файла данных
Idx 1
Idx 2
Idx 1
Idx 1
Idx 1
Idx 1
Idx 1
Idx 1
Как оптимизировать сканирование
 SQL Server выполняет большое количество асинхронных read-ahead
запросов выполняя сканирование
 Пытается выполнить столько операций I/O, чтобы поддерживать CPU
“занятым”
 Размер I/O зависит от «продолжительности» фрагмента в файле данных

Размер I/O может быть в диапазоне от 8K до 512K
 Средний размер read-ahead запроса может быть выяснен с помощью

avg_fragment_size_in_pages в составе sys.dm_index_physical_stats

Значения >= 64 страниц означает, что размер I/O’s близок к 512K
Read-Ahead операции в действии
 Кластерный индекс: упорядоченный ключ
1.
2.
3.
Каждый следующий запрошенный диапазон страниц
определяется при поиске в B-дереве следующего диапазона
ключей
Страницы в диапазоне отсортированы
I/O запрос выполняется для каждого непрерывающегося
диапазона страниц (до 64 страниц в запросе)
 Heap: порядок размещения
 Сканируются GAM страницы, чтобы определить следующий
диапазон страниц
1. I/O запрос выполняется для каждого непрерывающегося
диапазона страниц (до 64 страниц в запросе)
Read-Ahead операции в действии
Определение следующего диапазона страниц для
запроса, основываясь на упорядоченном ключе
(пример: ключи A-B)
B-tree
Page
1
B-tree
Page
B-tree
Page
Физический порядок страниц
2
A
1:31
B
1:32
B
1:33
B
1:34
B
1:35
C
1:36
D
1:37
B
1:38
B
1:39
C
1:40
D
1:41
A
1:42
A
1:43
Группирование в физическом порядке
A
1:31
B
1:32
B
1:38
B
1:39
A
1:42
A
1:43
B
1:33
A
1:44
B
1:34
A
1:45
B
1:35
A
1:46
3
3. Выполнение I/O
запросов для каждого
непрерывного куска
Disk
A
1:44
A
1:45
A
1:46
Приемы для увеличения
эффективности сканирования







Параметры запуска:
 -E – экстенты до 2 Мбайт
 -T1117 – равномерный рост всех файлов в файловой группе
Минимизировать использование некластерных индексов на таблице фактов
Использовать техники загрузки данных, позволяющих избегать фрагментацию
 Загрузка в порядке сортировки кластерного индекса (допустим, по дате)
если это возможно
Создавать индекс всегда с MAXDOP 1, SORT_IN_TEMPDB
Изолировать «активные» таблицы в другие файловые группы
Изолировать стейджинговые таблицы в отдельные файловые группы или базы
Периодические административные операции
«Обычный» тип загрузки приводит к
фрагментации
 Bulk Insert в кластерный индекс со «средним» размером пакета
 Каждый пакет отсортирован независимо
 Пересекающиеся пакеты приводят к «расщеплениям» страниц
1:31
1:36
1:32
1:32
1:33
1:37
1:34
1:33
1:35
1:36
1:37
1:38
1:39
1:40
1:38
1:34
Порядок сортировки по ключу
1:39
1:35
1:40
Альтернативные пути загрузки
 Использование heap
 Полезно, если запрос сканирует всю секцию
 или…использование BATCHSIZE = 0
 Допустимо. Если параллелизм при загрузке не требуется
 или…загрузка в два приема
1. Загрузка в стейджинговую таблицу (heap)
2. INSERT-SELECT из стейджинговой таблицы в целевую с CI
В результате таблица не фрагментирована
В шаге 1 можно использовать параллелизм, что критично при
загрузке больших объемов данных
Двух шаговая загрузка – варианты
 Вариант A: высокий параллелизм при загрузке архивных данных

Обычно в секционированную таблицу

Использование временных таблиц (heap), секционированных по тому
же принципу, что и целевая таблица

Использование множественных потоков при загрузке во временную
таблицу с «умеренным» размером пакетов batchsize (SSIS, Bulk Insert, и
т.д.)

INSERT-SELECT в раздельные секции целевой таблицы (параллелизм)
 Использование ALTER TABLE SET (LOCK_ESCALATION = AUTO)
 Внимание: если памяти не хватает, то TempDB будет перегружена
операциями сортировки sorting
Двух шаговая загрузка –
варианты
 Вариант B: избегаем нагрузку на TempDB во время
загрузки данных



Использовать стейджинговые таблицы, которые используют индексы,
аналогичные целевой таблице
Загрузка в стейджиговые таблицы с «умеренным» размером пакетов:
batchsize (< 1M rows)
Финальный INSERT-SELECT в целевую таблицу будет сортированным!
 Однако мы платим журналированием вставки в стейджинговую таблицу

Внимание: ограниченный параллелизм при «накладке» диапазонов
вставки
Другие рекомендации по избеганию фрагментации
 НЕ использовать Autogrow для файловых групп

Заранее назначать размер файловой группе, исходя из ожиданий
использования базы

Если нужно, то производить операцию «вручную» добавляя сразу
большие «куски»
 «Активные таблицы» - в отдельную файловую группу

Таблицы, которые часто перестраиваются, или куда данные
добавляются маленькими порциями
 Если архивные данные загружаются параллельно, можно подумать о
разделении файловых групп для разделения секций, к ним
привязанных и избежать фрагментации экстентов
Иногда фрагментации не избежать
 Если «дозаливки» пересекаются с уже
существующими диапазонами данных в
кластерном индексе – расщеплений страниц
не избежать
 Периодические административные действия
могут помочь уменьшит/избежать
фрагментации
 Секционирование по историческому ключу
(date key) может помочь уменьшить объем
административных задач
Администрирование
 Использовать
ALTER INDEX … REBUILD …
… WITH (MAXDOP = 1, SORT_IN_TEMPDB)




Один поток -- избегаем создания фрагментации экстентов
Можно ограничиться перестроением «актуальной» секции
Избегайте использовать ALTER INDEX … REORGANIZE
Страницы будут упорядочены на физическом уровне, однако
может отразиться серьезной фрагментацией экстентов
Управление «долгосрочной»
фрагментацией
 Иногда проще «начать с начала» :
 Создать новую файловую группу, чтобы перенести данные. Удалить
старую группу
 Создать пустую копию таблицы в новой файловой группе
 С совпадающими ключами секционирования и кластеризации
 INSERT-SELECT из старой таблицы в новую
 Создать вторичные индексы
 Удалить оригинальную таблицу и переименовать новую
 Все шаги могут выполняться онлайн
Стратегии индексирования
 Если большинство операций (запросов)
характеризуются сканированием диапазонов –
нужен ли нам кластерный индекс?


Ключ секционирования не обязательно должен быть кластерным
Меньше проблем при параллельной заливке данных
 Какая нагрузка возлагается на некластерные
индексы?


Возможные блокировки при заливке данных
Неактуальная статистика может привести к неэффективным CI или
RID Lookup
 Необходим «облегченный! Вариант индексирования
Секционирование для доступности
INSERT /
UPDATE
•
Исторические и актуальные данные
находятся в разных таблицах, в
разных файловых группах
2010-08
2010-01 to 2010-07
ALTER VIEW +
SWITCH
MSCFactCDR
(View)
2009
2008
2007
SELECT ...
FROM
MSCFactCDR
Пример 1: Страховая компания--
массивная загрузка за ограниченное время
 Задача: Загрузить и дополнить данные объемом в 50
GB за менее, чем 1 час
 Выполнимо только при высоком параллелизме
загрузки
 Используется секционирование таблицы
 Секционирование по ключу “customer”
 Кластерный индекс по дате!
 # секций = # ядер
 Параллельная загрузка во временные таблицы
 Разделение файловых групп (группа – секция) не допускают
пересечения загрузок
Архитектура
MSA2000 DAE
Pri_A
Pri_B
Pri_C
Primary Storage
8 Drives
(4 RAID1 Pairs)
Pri_D
Log
Logs
2 Drives
(1 RAID1 Pair)
Hot
Spare
Hot
Spare
Spares
2 Drives
Результат
Существующее решение
SQL Server
Fast Track DW
51:31 total time
Сравнение
R SQL Server 6x
faster
4:36:08 total time
1:50.01 total time
R SQL Server 2.5x
faster
3:03 avg query time
0:15 avg query time
R SQL Server 12x
(using 9 benchmark queries) (using 9 benchmark queries)
faster
Loading –
Subject Area 1
Loading –
Subject Area 2
Время запроса–
Subject Area 1
5:10:21 total time
Время запроса –
Subject Area 2
56:44 avg query time
8:09 avg query time
R SQL Server 7x
(using 4 benchmark queries) (using 4 benchmark queries)
faster
Цена за TB (8TB) – Cal :
Цена за TB (16TB) – Cal:
$22K / TB
$13K / TB
Пример 2: Телеком– изначальная
загрузка данных
 Загрузка 400 GB в «новый» кластерный индекс на
8-ядерном сервере в течении 7часов
 Целевая таблица- 8 секций поделенных по
историческим диапазонам
 3-шаговая загрузка, использующая
секционирование



Load, Index, Switch
Все шаги используют параллелизм
Минимальное журналирование
Европейский Телеком
Описание
 Реляционная часть разработана на :
 HP DL785 G6 с 8 x 6 ядрами AMD
 196GB RAM
 EMC SAN с 12 x EMC AX4, где каждый 20 x 450 GB дисков.
 Общая ёмкость примерно 38 TB без сжатия и 76 TB при
консервативной оценке сжатия в 50%
 Windows Server 2008 R2 Enterprise Edition
 SQL Server 2008 R2 Enterprise Edition
Производительность
Оценка производительности была произведена с помощью:
 SQLIO
 SQL Server обрабатывал актуальные данные
Результаты:
 SQLIO показал общую пропускную способность системы в 9,6GB/sec,
что является теоретическим максимумом.
 SQL Server производил сканирование таблиц со скоростью в 8,8 до
9.0GB/sec.
 SQLIO показал комбинированную скорость записи в 4,7 до 5.1 GB/sec
 SQL Server произвел запись 1 TB за менее, чем 20 минут при
использовании параллельных пакетов SSIS.
 SQL Server показал скорость создания резервной копии в более, чем
3 GB/sec.
“Почти FastTrack”
 Многие клиенты следуют рекомендациям
FastTrack без точного следования описанной
архитектуре:
 НЕ использовать разделяемое хранилище данных
 Инвестировать в большее количество «полок» и HBA для
обеспечения соответствующей пропускной способности
 Повысить эффективность операций сканирования используя
техники загрузки данных
Fast Track «подобная» система
Table Scan
Current Disk Queue Length = ~ 670
(достаточное время отклика,
учитывая объем и глубину
outstanding I/O)
•
Storage – MSA60
–
Disk Read Bytes / sec = ~ 4 GB/s
–
Read-ahead pages/sec is почти на
том же уровне, что и pages/sec.
•
5 x HP SAS P800 controllers with 512MB
cache.
Каждый конроллер подключен MSA60
«полке»
LUN Configuration
–
–
–
24 Data LUNs, One RAID1 Pair per LUN
1 Log LUN
50 spindles total
Avg.Disk Bytes/Read = ~ 500 KB
А если нагрузка включает много Random
IO?
 Принципы FastTrack позволят получить приемлемую
скорость для операций сканирования.
 Особенно учитывая количество контроллеров и HBAs
Однако
 Возможно придется дополнительно инвестировать в
большее количество дисков для обеспечения
поддержки высокого уровня random IO в секунду
 100+ дисков – не редкость
Рекомендация
 Изучите «FastTrack Methodology and Reference
Architectures for Data Warehouse»
http://www.microsoft.com/sqlserver/2008/en/us/
fasttrack.aspx
Дополнительные ресурсы:
 Data Loading Performance Guide
http://msdn.microsoft.com/en-us/library/dd425070.aspx
 SQLCAT Top 10 DW Best Practices
http://go.microsoft.com/fwlink/?LinkId=141862
Questions?
Download