Домой / Работа в Интернете / Max degree of parallelism – выбор оптимального значения. Зона особого внимания – Опция Maximum Degree of Parallelism Sql максимальная степень параллелизма

Max degree of parallelism – выбор оптимального значения. Зона особого внимания – Опция Maximum Degree of Parallelism Sql максимальная степень параллелизма

Max degree of parallelism (DOP) - дополнительна опция конфигурации SQL Server, с которой связано много вопросов и которой посвящено множество публикаций. В этой статье своего блога, автор надеется внести немного ясности в то, что эта опция делает и как её нужно использовать.

Во-первых, автор хотел бы рассеять любые сомнения по поводу того, что указанная опция устанавливает, сколько процессоров может использовать SQL Server при обслуживании нескольких подключений (или пользователей) - это не так! Если SQL Server имеет доступ к четырем неактивным процессорам, и он настроен на использование всех четырёх процессоров, он будет использовать все четыре процессора, независимо от максимальной степени параллелизма.

Так, что же эта опция даёт? Эта опция устанавливает максимальное число процессоров, которые SQL Server может использовать для одного запроса. Если запрос к SQL Server должен вернуть большой объём данных (много записей), его иногда имеет смысл распараллелить, разбив на несколько маленьких запросов, каждый из которых будет возвращать своё подмножество строк. Таким образом, SQL Server может использовать несколько процессоров, и, следовательно, на многопроцессорных системах большое количество записей всего запроса потенциально может быть возвращено быстрее, чем на однопроцессорной системе.

Есть множество критериев, которые должны быть учтены до того, как SQL Server вызовет "Intra Query Parallelism" (разбивку запроса на несколько потоков), и нет смысла их здесь детализировать. Вы можете найти их в BOL, поискав фразу "Degree of parallelism". Там написано, что решение о распараллеливании основано на доступности памяти процессору и, особенно, на доступности самих процессоров.

Итак, почему мы должны продумать использование этой опции - потому что, оставляя её в значении по умолчанию (SQL Server сам принимает решение о распараллеливании), иногда можно получить нежелательные эффекты. Эти эффекты выглядят примерно так:

  • Распараллеленные запросы выполняются медленнее.
  • Время исполнения запросов может стать недетерминированным, и это может раздражить пользователей. Время исполнения может измениться потому что:
    • Запрос может иногда распараллеливаться, а иногда нет.
    • Запрос может блокироваться параллельным запросом, если перед этим процессоры были перегружены работой.

Прежде, чем мы продолжим, автор хотел бы заметить, что нет особой необходимости погружаться во внутреннюю организацию параллелизма. Если же Вы этим интересуетесь, Вы можете почитать статью "Parallel Query Processing" в Books on Line, в которой эта информация изложена более детально. Автор считает, что есть только две важные вещи, которые стоит знать о внутренней организации параллелизма:

  1. Параллельные запросы могут породить больше потоков, чем указано в опции "Max degree of parallelism". DOP 4 может породить более двенадцати потоков, четыре для запроса и дополнительные потоки, используемые для сортировок, потоков, агрегатов и сборок и т.д.
  2. Распараллеливание запросов может провоцировать разные SPID ожидать с типом ожидания CXPACKET или 0X0200. Этим можно воспользоваться для того, что бы найти те SPID, которые находятся в состоянии ожидания при параллельных операциях, и имеют в sysprocesses waittype: CXPACKET. Для облегчения этой задачи, автор предлагает воспользоваться имеющейся в его блоге хранимой процедурой: track_waitstats.

И так "Запрос может выполняться медленнее при распараллеливании" почему?

  • Если у системы очень слабая пропускная способность дисковых подсистем, тогда при анализе запроса, его декомпозиция может выполняться дольше, чем без параллелизма.
  • Возможен перекос данных или блокировки диапазонов данных для процессора, порождённые другим, используемым параллельно и запущенным позже процессом, и т.д.
  • Если отсутствует индекс для предиката, что приводит к сканированию таблицы. Параллельная операция в рамках запроса может скрыть тот факт, что запрос выполнился бы намного быстрее с последовательным планом исполнения и с правильным индексом.

Упомянутые выше эффекты параллелизма, сами собой должны навести Вас на мысль о том, что внутренняя механика распараллеливания запросов не подходит для применения в OLTP - приложениях. Это такие приложения, для которых изменение времени исполнения запроса может раздражать пользователей и для которых сервер, одновременно обслуживающий множество пользователей, вряд ли выберет параллельный план исполнения из-за присущих этим приложениям особенностей профиля рабочей нагрузки процессора.

Поэтому, если Вы собираетесь использовать параллелизм, то, скорее всего это понадобится, для задач извлечения данных (data warehouse), поддержки принятия решений или отчётных систем, где не много запросов, но они являются достаточно тяжёлыми и исполняются на мощном сервере с большим объёмом оперативной памяти.

Если Вы решили использовать параллелизм, какое же значение нужно установить для DOP?. Хорошей практикой для этого механизма является то, что если Вы имеете 8 процессоров, тогда устанавливайте DOP = 4, и это с большой степенью вероятности будет оптимальной установкой. Однако, нет никаких гарантий, что так оно и будет работать. Единственный способ убедиться в этом - протестировать разные значения для DOP. В дополнение к этому, автор хотел предложить свой, основанный на эмпирических наблюдениях совет, никогда не устанавливать это число больше, чем половине от числа процессоров, которые есть в наличии. Если бы автор имел процессоров меньше шести, он установил бы DOP в 1, что просто запрещает распараллеливание. Он мог бы сделать исключение, если бы имел базу данных, которая поддерживает процесс только одного пользователя (некоторые технологии извлечения данных или задачи отчётности), в этом случае, в порядке исключения, можно будет установить DOP в 0 (значение по умолчанию), которое позволяет SQL Server самому принимать решение о необходимости распараллеливания запроса.

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

Наконец, ваш запрос может замедляться при распараллеливании из-за ошибок, поэтому убедитесь, что на вашем сервере установлен последний сервисный пакет (service pack).

REATE proc track_waitstats
@num_samples int =10
,@delaynum int =1
,@delaytype nvarchar (10 )="minutes"
AS
-- T. Davidson
-- This stored procedure is provided =AS IS= with no warranties,
-- and confers no rights.
-- Use of included script samples are subject to the terms
-- specified at http://www.microsoft.com/info/cpyright.htm
-- @num_samples is the number of times to capture waitstats,
-- default is 10 times. default delay interval is 1 minute
-- delaynum is the delay interval. delaytype specifies whether
-- the delay interval is minutes or seconds
-- create waitstats table if it does not exist, otherwise truncate

set nocount on
if not exists (select 1 from sysobjects where name = "waitstats" )
create table waitstats ( varchar (80 ),
requests numeric (20 ,1 ),
numeric (20 ,1 ),
numeric (20 ,1 ),
now datetime default getdate ())
else truncate table waitstats

dbcc sqlperf (waitstats,clear) -- clear out waitstats

declare @i int
,@delay varchar (8 )
,@dt varchar (3 )
,@now datetime
,@totalwait numeric (20 ,1 )
,@endtime datetime
,@begintime datetime
,@hr int
,@min int
,@sec int

select @i = 1
select @dt = case lower (@delaytype)
when "minutes" then "m"
when "minute" then "m"
when "min" then "m"
when "mm" then "m"
when "mi" then "m"
when "m" then "m"
when "seconds" then "s"
when "second" then "s"
when "sec" then "s"
when "ss" then "s"
when "s" then "s"
else @delaytype
end

if @dt not in ("s" ,"m" )
begin
print "please supply delay type e.g. seconds or minutes"
return
end

if @dt = "s"
begin
select @sec = @delaynum % 60
select @min = cast ((@delaynum / 60 ) as int )
select @hr = cast ((@min / 60 ) as int )
select @min = @min % 60
end

if @dt = "m"
begin
select @sec = 0
select @min = @delaynum % 60
select @hr = cast ((@delaynum / 60 ) as int )
end

select @delay = right ("0" + convert (varchar (2 ),@hr),2 ) + ":" +
2 ),@min),2 ) + ":" +
+ right ("0" +convert (varchar (2 ),@sec),2 )

if @hr > 23 or @min > 59 or @sec > 59
begin
select "hh:mm:ss delay time cannot > 23:59:59"
select "delay interval and type: " + convert (varchar (10 )
,@delaynum) + "," + @delaytype + " converts to "
+ @delay
return
end

while (@i <= @num_samples)
begin
insert into waitstats (, requests,
,)
exec ("dbcc sqlperf(waitstats)" )
select @i = @i + 1
waitfor delay @delay
End

Create waitstats report
execute get_waitstats

--//--//--//--//--//--//--//--//--//-//--//--//--//--//--//--//--//--/

CREATE proc get_waitstats
AS
-- This stored procedure is provided =AS IS= with no warranties, and
-- confers no rights.
-- Use of included script samples are subject to the terms specified
-- at http://www.microsoft.com/info/cpyright.htm
--
-- this proc will create waitstats report listing wait types by
-- percentage
-- can be run when track_waitstats is executing

set nocount on

declare @now datetime
,@totalwait numeric (20 ,1 )
,@endtime datetime
,@begintime datetime
,@hr int
,@min int
,@sec int

select @now=max (now),@begintime=min (now),@endtime=max (now)
from waitstats where = "Total"

Subtract waitfor, sleep, and resource_queue from Total

select @totalwait = sum () + 1 from waitstats
where not in ("WAITFOR" ,"SLEEP" ,"RESOURCE_QUEUE"
, "Total" , "***total***" ) and now = @now

Insert adjusted totals, rank by percentage descending

delete waitstats where = "***total***" and now = @now

insert into waitstats select "***total***"
,0
,@totalwait
,@totalwait
,@now

select
,
,percentage = cast (100 */@totalwait as numeric (20 ,1 ))
from waitstats
where not in ("WAITFOR" ,"SLEEP" ,"RESOURCE_QUEUE" ,"Total" )
and now = @now
order by percentage desc

В этой небольшой заметке я бы хотел немного рассказать о тонкостях в настройках параллелизма в Microsoft SQL Server. Очень многим из вас давно известна опция Max Degree od Parallelism, которая присутствует в SQL Server уже очень давно. По умолчанию она выставлена в 0, что значит, что SQL Server будет сам выбирать оптимальную степень параллелизма, то есть количество процессоров\потоков, задействованных для выполнения одной инструкции. Я сейчас не буду останавливаться и рассуждать, в какое же именно значении лучше выставлять эту опцию – это тема для отдельное заметки. Я лишь рассмотрю, как значение этой опции влияет на выполнение запросов. Например, ниже на рисунке, эта опция выставлена в 1, что означет, что параллельные планы для всех запросов по умолчанию отключены.

Также данная опция доступна для просмотра с помощью следующей команды T-SQL:

И действительно, любой план запроса по умолчанию будет последовательным. Например:

Однако, у разработчика и любого пользователя по-прежнему остается возможность повлиять на это путем использования подсказок (hints). Для этого всего лишь нужно указать нужную степень параллелизма, и генерируется нужный план запроса, например:

И если мы понаблюдаем на этот запрос через представление sys.dm_exec_query_profiles, то увидим, что он действительно выполняется в 10 потоков.

Таким образом, в системе остается потайной лаз, который могут использовать разработчики и пользователи, чтобы «ускорить» (тут я специально поставил в кавычки, т.к. не всегда большая степень параллелизма ведет к уменьшению времени выполнения запроса) свои запросы путем увеличения степени параллелизма. Но, таким образом, они могут просто «убить» сервер, запуская множество неконтролируемых параллельных запросов одновременно. Что же мы можем с этим сделать? Вот тут нам на помощь приходит Resource Governor, очень мощная и совершенно недооцененная система, которая позволяет очень гибко распределить ресурсы между разными группами пользователей. Опять же, я сейчас не буду останавливаться на том, как он устроен, и какими возможностями обладает. Я лишь остановлюсь подробно, как влияют его настройки ограничения параллелизма. Давайте для начала взглянем в настройки по умолчанию:

Опять мы видим, что по умолчанию опция выставлена в 0 и решение о выборе максимальной степени отдано на откуп SQL Server. Теперь посмотрим, что будет, если я поменяю это значение в 5. Внимание, ни в коем случае не делайте такие настройки на реальной системе, т.к. я даже не определил функцию классификации для Resource Governor и меняю default группу. Но для теста и понимания, как все работает конкретно сейчас на моем примере, этого хватит. Таким образом, я ограничиваю для всех максимальную степень параллелизма 5 потоками. Напомню, что опция Max Degree of Parallelism , которую мы рассматривали ранее выставлена по-прежнему в значение 1. Если мы теперь посмотрим на план выполнения нашего изначального запроса, то по умолчанию он будет последовательный, а с опцией maxdop 10 – параллельный. Но, если мы запустим параллельный план, то увидим кое-что интересное.

Теперь наш запрос выполняется только в 5 потоков, несмотря на то, что опция maxdop для него имеет значение 10. И, если вы укажете для запроса опцию maxdop 4, он будет выполняться в 4 потока (опция в Resource Governor установлена в 5). В этом случае подсказка maxdop меньше настройки Resource Governor, поэтому дополнительного ограничения не накладывается. Пример этого я уже не привожу.

Таким образом, Resource Governor является более мощным средством, который уже реально ограничивает максимальную степень параллелизма для запросов, и эту степень можно задать разную для разных групп пользователей. При этом опция Max Degree of Parallelism по-прежнему продолжает работать и вносит свою лепту (или слегка запутывает администраторов, разработчиков и пользователей, когда работает в купе с Resource Governor). Далее, лишь только вашей фантазией ограничены варианты выставления значений этих 2х параметров, но важно помнить лишь две вещи: Max Degree of Parallelism и подсказка (hint) maxdop для запроса влияет на то, какой план будет сгенерирован, сколько максимальное количество потоков будет возможно для этого запроса, а Resource Governor еще дополнительно сверху ограничивает запрос уже во время выполнения.

Цель: изучить влияние параллелизма SQL на работу с запросами 1С

Литература:

Тестовая среда:

· Windows server 2008 R2 Enterprise

· MS SQL server 2008 R2

· 1С Предприятие 8.2.19.90

Рисунок 1. SQL properties “General”


Рисунок 2. SQL properties “Advansed”

Инструменты:

· SQL server profiler

· Консоль запросов 1С

Тестовый запрос:

ВЫБРАТЬ

АК.Наименование КАК Наименование

ИЗ

РегистрСведений.АдресныйКлассификатор КАК АК

ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.АдресныйКлассификатор КАК АК1

ПО АК.Код = АК1.Код

Подготовка:

Запускаем SQL server Profiler, устанавливаем соединение, отмечаем события и колонки как показано на рисунке 3.


Рисунок 3. Trace properties

Устанавливаем отбор для нашей базы


Рисунок 4. Фильтр по базе

Сокращения:

· Max degree of parallelism – MDOP

· Сost threshold for parallelism - cost

Тестирование последовательного плана запроса (MDOP = 1)


Рисунок 5. Консоль запросов – время выполнения 20 сек.

Параметр SQL сервера “Max degree of parallelism” установлен в 1 (без параллелизма). Смотрим результат в профайлере (рис.6)


Рисунок 6. Последовательный план запроса

SQL сервер сформировал последовательный план запроса, при этом: общая загрузка CPU = 6,750 (сек), а время на выполнение запроса = 7,097(сек)

Тестирование параллельного плана запроса (MDOP = 0, cost =5)

Переводим SQL server в режим параллелизма (в SQL Query):

USE master ;

EXEC sp_configure "show advanced option" , 1;

RECONFIGURE WITH OVERRIDE

USE master ;

exec sp_configure "max degree of parallelism" , 0;

RECONFIGURE WITH OVERRIDE

Выполняем тот же запрос (Рисунок 7)


Рисунок 7. Консоль запросов – время выполнения 16 сек.

Проверяем результат в профайлере (Рисунок 8)


Рисунок 8. Параллельный план запроса

Сервер SQL в этот раз сформировал параллельный план запроса, при этом общая загрузка CPU = 7,905 сек, а длительность выполнения запроса = 3,458 сек

Тестирование последовательного плана запроса (MDOP = 0, cost = 150)

Попытаемся избавиться от параллельного плана, используя параметр «Сost threshold for parallelism». По умолчанию параметр установлен в 5. В нашем случае от формирования параллельного плана удалось избавиться при значении 150 (в SQL Query):

USE master ;

exec sp_configure "cost threshold for parallelism" , 150 ;

Проверяем выполнение запроса в данных условиях (рис. 9)

Рисунок 9. Консоль запросов – время выполнения 20 сек.

Проверяем результат в профайлере (рис.10)


Рисунок 10. Последовательный план запроса.

Сервер SQL сформировал последовательный план запроса. Общая загрузка CPU = 7,171 сек, время выполнения запроса =7, 864 сек.

Выводы:

· Выполнение тестового запроса в среде 1С Предприятия с использованием SQL сервером параллельного плана запроса дает значительный прирост производительности по сравнению с последовательным планом (16 сек. против 20 сек. – выигрыш 4 сек.)

· Выполнения тестового запроса самим сервером SQL при использовании параллельного плана запроса происходит в два раза быстрее, чем при использовании последовательного плана запроса (3,5 сек. против 7,1 сек.)

· Параллелизм SQL сервера можно регулировать не только, используя параметр MDOP, но и параметр «Сost threshold for parallelism»

  • Tutorial

Данная инструкция предназначена для новичков, ищущих простое руководство на русском языке для установки английской версии SQL Server 2012, который будет далее использоваться для SharePoint 2013.
Эта статья не для профессионалов.

Вся работа разделена на 3 этапа:

  • Установка SQL Server 2012
  • Настройка параметра конфигурации сервера max degree of parallelism
  • Настройка прав учетной записи, предназначенной для установки SharePoint 2013
Также в статье описывается процесс установки Microsoft .NET Framework 3.5 в среде MS Windows Server 2012 R2 Standart.

Внимание: под катом много картинок!

Установка SQL Server 2012

1. Перед установкой следует убедиться, что на жестком диске достаточно свободного места (в моем случае потребовалось 2.7 ГБ).
После запуска дистрибутива выбираем пункт "Installation " в левом меню, затем «кликаем» пункт "New SQL Server stand-alone or add features to an existing installation ":

2. Запустится мастер установки. Он выполнит проверку. Можно кликнуть по кнопке «Show details» и посмотреть детальный отчет:

3. Детальный отчет. Нажимаем кнопку «ОК»:

4. Вводим ключ продукта и нажимаем кнопку «Next»:

5. Соглашаемся c условиями лицензионного соглашения.
Для этого ставим галочку "I accept the license terms

6. На шаге «Setup Role» выбираем первый пункт "SQL Server Feature Installation ". Нажимаем кнопку «Next»:

7. На шаге «Feature Selection» отмечаем "Database Engine Services ", "Management Tools – Basic " и "Management Tools – Complete ". Затем нажимаем кнопку «Next»:

8. Затем установщик выполнит еще одну проверку. Можно кликнуть по кнопке «Show details» и посмотреть детальный отчет:

9. Детальный отчет. (На данном этапе у меня возникла ошибка в правиле «Microsoft .NET Framework 3.5 is installed ...». Об этом ниже). Нажимаем кнопку «Next»:

10. На шаге «Instance Configuration» необходимо сконфигурировать экземпляр службы SQL-сервера.
Повторюсь, что данная статья предназначена для новичков. Поэтому сделаем предположение, что на вашем сервере до этого не устанавливался SQL Server, а значит оставим все настройки по умолчанию. Нажимаем кнопку «Next»:

11. На данном шаге мастер установки отобразит требования к дисковому пространству. Нажимаем кнопку «Next»:

12. На шаге «Server Configuration» необходимо указать доменную учетную запись для службы "SQL Server Database Engine ". После заполнения полей «Account Name» и «Password» нажимаем кнопку «Next»:

13. На шаге «Database Engine Configuration» достаточно добавить текущего пользователя в администраторы SQL-сервера. Для этого нажмите кнопку «Add Current User», затем нажмите кнопку «Next»:

14. На следующем шаге нажимаем кнопку «Next»:

15. Далее мастер установки опять выполнит проверку и отобразит её результаты. Нажимаем кнопку «Next»:

16. На шаге «Ready to Install» мастер отобразит сводную информацию. Здесь необходимо нажать кнопку «Install»:

17. После завершения установки отобразится информация о произведенных операциях:

18. Крайне рекомендую на данном этапе перезагрузить компьютер. В некоторых случаях (например, при инсталляции Microsoft .NET Framework 3.5) мастер установки сам отобразит окно с предложением перезагрузить компьютер. Не отказывайтесь.

Настройка параметра конфигурации сервера max degree of parallelism

По умолчанию значение параметра «Max Degree of Parallelism» равно 0.
SharePoint 2013 требует, чтобы этот параметр был равен 1.
Это легко исправить!

1. Запустите Microsoft SQL Server Management Studio (Пуск - Все программы - Microsoft SQL Server 2012 - SQL Server Management Studio).

2. На экране подключения к серверу нажмите кнопку «Connect».

3. Щелкните правой клавишей мыши по вашему серверу в окне "Object Explorer " и выберите пункт "Properties ":

4. В открывшемся окне свойств сервера в левом меню выберите страницу "Advanced " и промотайте список свойств в самый низ экрана. Установите значение параметра "Max Degree of Parallelism " в 1 и нажмите кнопку «ОК»:

5. Не закрывайте SQL Server Management Studio, она нам еще пригодится.

Настройка прав учетной записи, предназначенной для установки SharePoint 2013

Учетная запись, от имени которой будет производиться установка SharePoint 2013, должна обладать повышенными правами в SQL-сервере.
Этой учетной записи рекомендуется дать следующие роли:
  • dbcreator
  • securityadmin
  • public
1. В SQL Server Management Studio в окне "Object Explorer " разверните пункт "Security ". Затем щелкните правой клавишей мышки на пункте "Logins " и выберите пункт "New Login ":

2. В поле «Login name» введите доменное имя учетной записи, из под которой вы планируете установить и настроить SharePoint 2013.

3. В левом меню выберите страницу "Server Roles " и отметьте роли «dbcreator» и «securityadmin», а также убедитесь, что роль «public» уже отмечена. Затем нажмите кнопку «ОК»:

Теперь SQL-сервер готов к установке SharePoint 2013.

Установка Microsoft .NET Framework 3.5 в среде MS Windows Server 2012 R2 Standart

В шаге №9 пункта "Установка SQL Server 2012 " у меня возникла ошибка: не был установлен.NET Framework 3.5.
Для решения этой проблемы необходимо выполнить следующие шаги:

1. Необходимо открыть консоль "Server Manager ".

2. В левом меню выбираем пункт «Dashboard».

3. В центре окна щелкаем по пункту «Add roles and features».

4. В открывшемся мастере пропускаем шаг «Before You Begin».

5. На шаге «Installation Type» выбираем пункт "Role-based or feature-based installation ". Нажимаем кнопку «Next».

6. На следующем шаге оставляем все по умолчанию и нажимаем кнопку «Next».

7. Пропускаем шаг «Server Roles», нажав кнопку «Next».

8. На шаге «Features» отмечаем галочку ".NET Framework 3.5 Features". Нажимаем кнопку «Next».

9. После завершения процесса установки можно закрыть мастер «Add Roles and Features Wizard».

10. Готово!

Всем добра и мирного неба над головой!

P.S. С наступающим Днем космонавтики!

В данном посте речь пойдет только о MS SQL Server. Если вы собрались "попытать счастья" в использовании 1С с Oracle, DB2, Postrgre вам данная информация будет бесполезна. Но нужно понимать, что в 1С есть прежде всего специалисты по MS SQL серверу. Усилиями со стороны компании IBM появляются ещё и специалисты по DB2. Можно долго рассуждать хорошие или плохие это СУБД, важно одно, наиболее "гладко" 1С работает с MS SQL сервером. Судя по последним сообщениям с "фронта" более-менее приличной стала работа с DB2. Хотя я лично имел опыт настройки 1С для работы с DB2 ещё в версии 8.1 - там всё было как-то не очень. В любом случае выбор другой СУБД должен быть четко аргументирован - либо возможностоями, которых нет в MS SQL (кластер с балансировкой нагрузки, Grid, и т.п.), либо финансами (Oracle уже куплен), либо платформой (всё на linux).

Итак по порядку, что нужно сделать с MS SQL Server:

1) Настроить минимальный и максимальный объем памяти. Минимальный - половина памяти системы. Максимальный - память системы без 2ГБ. Делается это через Management Studio - в свойствах сервера:

2) Если приоритет не установлен на закладке "Процессоры" - нужно установить

3) Максимальную степень параллелизма ставим в 1.

4) Включаем SQL Server Agent, настраиваем Database Mail - ничего там трудного нет, подробно описывать не буду.

5) Настраиваем планы обслуживания:
Общие:
а) Обновление статистики - каждые 2 часа
б) DBCC FREEPROCCACHE - каждые 2 часа
Для каждой базы:
а) Полное резервное копирование
б) Разностное резервное копирование
в) Дефрагментация индексов - каждый день
г) Перестройка индексов - ночью в выходные
д) Проверка целостности базы - раз в месяц ночью в выходные

6) Рекомендую для каждой базы (в свойствах) модель восстановления установить как Simple. В случае если у вас не 24/7 система и менее 1000 пользователей на базу, нет отказоустойчивого кластера и вы не подписывали SLA в котором обязуетесь в случае выхода любого оборудования из строя восстановить данные с точностью до секунды (а не со времени последней резервной копии) эта рекомендация будет разумной. Иначе вы очень скоро будете долго и судорожно размышлять куда же деть разросшийся Tranzaction Log

7) Уберите базу tempdb от обычных баз на другой диск - даже если при этом придётся переконфигурировать RAID массив и снизить его производительность. Иначе 1 пользователь сможет парализовать работу всех остальных. Если у вас есть Hardware Accelereator вместо жесткого диска то конечно можно не отделять и положить tempdb на него, но это только в случае если таковой имеется

8) установите какое-нибудь средство мониторинга - мне, к примеру, нравится spotlight http://www.quest.com/spotlight-on-sql-server-enterprise/

9) Проверьте себя с best practice analizer от Microsoft - http://www.microsoft.com/download/en/details.aspx?id=15289 - замечательный инструмент, который помогает не только с настройками, но и с решением многих проблем.

Теперь вкратце для чего мы всё это делали:

1) Память. Минимальное значение просто убережет вас от "глюков", когда SQL сервер по каким-то только ему известным причинам не использует всю доступную ему память. Должен съесть всю! Максимальное значение убережет вас от свопа в случае если тот же самый оптимизатор использования памяти SQL сервер-а решит что ему ещё на помешало бы....

3) Очень важный пункт - ИХМО его нужно ставить в 1 во всех транзакционных системах. Во-первых - это предотвращает часть блокировок между разными процессами, пытающимися выполнить 1 запрос, соответственно уберегает нас от некоторых "странных" ошибок. Во-вторых... 1 "убийственный" запрос сможет вытянуть на себя все ресурсы сервера, что несколько не справедливо по отношению к остальным пользователям системы.Собственно параметр определяет - сколькими ядрами процессоров может обрабатываться 1 запрос.

5) Про статистику и очистку процедурного кэша - это "на слуху " а вот про реиндексацию часто забываем. А между тем это процедура достаточно важная, особенно с ростом объёма базы важность её увеличивается. Иногда на фрагментации индексов теряется до60 % производительности.

7) При наличии Hardware Accelerator или просто 2 дисков с разными скоростями доступа я бы рекоммендовал ещё задуматься о выделении в базах файловых групп и разделении отдельных таблиц на разные дисковые массивы, с разным временем доступа. Ведь согласитесь, РН "товары на складах" и справочник "Хранилище дополнительной информации" 2 объекта требования к хранению которых в корне рознятся. Не обязательно на быстром массиве хранить все файлы и картинки в базе - можно выделить его на отдельный, не такой быстрый, но где места много (и не бояться потом в базу кучу файлов загружать, кстати).