Baza wiedzy LINKSPOT › Biuletyny

XL146-Dobre praktyki. Konfiguracja, zarządzanie Microsoft SQL Serwer oraz bazami danych.

Biuletyny · Opublikowano 2024-07-03

Spis treści

Konfiguracja serwera

Bazy danych

Konfiguracja maszyn wirtualnych

Konfiguracja serwera

Po zainstalowaniu serwera Microsoft SQL Serwer należy zwrócić uwagę na kilka rzeczy:

Uwaga

Parametry ! Cost Threshold For Parallelism oraz Max Degree of Parallelism mają duże znaczenie przy powstających deadlockach oraz blokad powodowanych przez zrównoleglanie zapytań. Jeśli podczas audytu serwera zauważymy że blokady spowodowane przez zrównoleglanie serwera stanowią znaczący procent, wówczas należy zmniejszyć wartość parametru Max DoP, lub zwiększyć Cost Threshold For Parallelism. Możliwe, że będzie konieczna zmiana obydwu parametrów. Podczas wprowadzanych zmian należy obserwować zachowanie serwera oraz bazy danych (jaki wpływ na wydajność mają wprowadzane zmiany)

Uwaga

CXPACKET – typ blokad powstających podczas zrównoleglania

WITH [Waits]

AS (SELECT wait_type, wait_time_ms/ 1000.0 AS [WaitS],

(wait_time_ms – signal_wait_time_ms) / 1000.0 AS [ResourceS],

signal_wait_time_ms / 1000.0 AS [SignalS],

waiting_tasks_count AS [WaitCount],

100.0 * wait_time_ms / SUM (wait_time_ms) OVER() AS [Percentage],

ROW_NUMBER() OVER(ORDER BY wait_time_ms DESC) AS [RowNum]

FROM sys.dm_os_wait_stats WITH (NOLOCK)

WHERE [wait_type] NOT IN (

N’BROKER_EVENTHANDLER’, N’BROKER_RECEIVE_WAITFOR’, N’BROKER_TASK_STOP’,

N’BROKER_TO_FLUSH’, N’BROKER_TRANSMITTER’, N’CHECKPOINT_QUEUE’,

N’CHKPT’, N’CLR_AUTO_EVENT’, N’CLR_MANUAL_EVENT’, N’CLR_SEMAPHORE’,

N’DBMIRROR_DBM_EVENT’, N’DBMIRROR_EVENTS_QUEUE’, N’DBMIRROR_WORKER_QUEUE’,

N’DBMIRRORING_CMD’, N’DIRTY_PAGE_POLL’, N’DISPATCHER_QUEUE_SEMAPHORE’,

N’EXECSYNC’, N’FSAGENT’, N’FT_IFTS_SCHEDULER_IDLE_WAIT’, N’FT_IFTSHC_MUTEX’,

N’HADR_CLUSAPI_CALL’, N’HADR_FILESTREAM_IOMGR_IOCOMPLETION’, N’HADR_LOGCAPTURE_WAIT’,

N’HADR_NOTIFICATION_DEQUEUE’, N’HADR_TIMER_TASK’, N’HADR_WORK_QUEUE’,

N’KSOURCE_WAKEUP’, N’LAZYWRITER_SLEEP’, N’LOGMGR_QUEUE’,

N’MEMORY_ALLOCATION_EXT’, N’ONDEMAND_TASK_QUEUE’,

N’PARALLEL_REDO_DRAIN_WORKER’, N’PARALLEL_REDO_LOG_CACHE’, N’PARALLEL_REDO_TRAN_LIST’,

N’PARALLEL_REDO_WORKER_SYNC’, N’PARALLEL_REDO_WORKER_WAIT_WORK’,

N’PREEMPTIVE_HADR_LEASE_MECHANISM’, N’PREEMPTIVE_SP_SERVER_DIAGNOSTICS’,

N’PREEMPTIVE_OS_LIBRARYOPS’, N’PREEMPTIVE_OS_COMOPS’, N’PREEMPTIVE_OS_CRYPTOPS’,

N’PREEMPTIVE_OS_PIPEOPS’, N’PREEMPTIVE_OS_AUTHENTICATIONOPS’,

N’PREEMPTIVE_OS_GENERICOPS’, N’PREEMPTIVE_OS_VERIFYTRUST’,

N’PREEMPTIVE_OS_FILEOPS’, N’PREEMPTIVE_OS_DEVICEOPS’, N’PREEMPTIVE_OS_QUERYREGISTRY’,

N’PREEMPTIVE_OS_WRITEFILE’,

N’PREEMPTIVE_XE_CALLBACKEXECUTE’, N’PREEMPTIVE_XE_DISPATCHER’,

N’PREEMPTIVE_XE_GETTARGETSTATE’, N’PREEMPTIVE_XE_SESSIONCOMMIT’,

N’PREEMPTIVE_XE_TARGETINIT’, N’PREEMPTIVE_XE_TARGETFINALIZE’,

N’PWAIT_ALL_COMPONENTS_INITIALIZED’, N’PWAIT_DIRECTLOGCONSUMER_GETNEXT’,

N’QDS_PERSIST_TASK_MAIN_LOOP_SLEEP’,

N’QDS_ASYNC_QUEUE’,

N’QDS_CLEANUP_STALE_QUERIES_TASK_MAIN_LOOP_SLEEP’, N’REQUEST_FOR_DEADLOCK_SEARCH’,

N’RESOURCE_QUEUE’, N’SERVER_IDLE_CHECK’, N’SLEEP_BPOOL_FLUSH’, N’SLEEP_DBSTARTUP’,

N’SLEEP_DCOMSTARTUP’, N’SLEEP_MASTERDBREADY’, N’SLEEP_MASTERMDREADY’,

N’SLEEP_MASTERUPGRADED’, N’SLEEP_MSDBSTARTUP’, N’SLEEP_SYSTEMTASK’, N’SLEEP_TASK’,

N’SLEEP_TEMPDBSTARTUP’, N’SNI_HTTP_ACCEPT’, N’SP_SERVER_DIAGNOSTICS_SLEEP’,

N’SQLTRACE_BUFFER_FLUSH’, N’SQLTRACE_INCREMENTAL_FLUSH_SLEEP’, N’SQLTRACE_WAIT_ENTRIES’,

N’WAIT_FOR_RESULTS’, N’WAITFOR’, N’WAITFOR_TASKSHUTDOWN’, N’WAIT_XTP_HOST_WAIT’,

N’WAIT_XTP_OFFLINE_CKPT_NEW_LOG’, N’WAIT_XTP_CKPT_CLOSE’, N’WAIT_XTP_RECOVERY’,

N’XE_BUFFERMGR_ALLPROCESSED_EVENT’, N’XE_DISPATCHER_JOIN’,

N’XE_DISPATCHER_WAIT’, N’XE_LIVE_TARGET_TVF’, N’XE_TIMER_EVENT’)

AND waiting_tasks_count > 0)

SELECT

MAX (W1.wait_type) AS [WaitType],

CAST (MAX (W1.Percentage) AS DECIMAL (5,2)) AS [Wait Percentage],

CAST ((MAX (W1.WaitS) / MAX (W1.WaitCount)) AS DECIMAL (16,4)) AS [AvgWait_Sec],

CAST ((MAX (W1.ResourceS) / MAX (W1.WaitCount)) AS DECIMAL (16,4)) AS [AvgRes_Sec],

CAST ((MAX (W1.SignalS) / MAX (W1.WaitCount)) AS DECIMAL (16,4)) AS [AvgSig_Sec],

CAST (MAX (W1.WaitS) AS DECIMAL (16,2)) AS [Wait_Sec],

CAST (MAX (W1.ResourceS) AS DECIMAL (16,2)) AS [Resource_Sec],

CAST (MAX (W1.SignalS) AS DECIMAL (16,2)) AS [Signal_Sec],

MAX (W1.WaitCount) AS [Wait Count]

FROM Waits AS W1

INNER JOIN Waits AS W2

ON W2.RowNum <= W1.RowNum

GROUP BY W1.RowNum, W1.wait_type

HAVING SUM (W2.Percentage) – MAX (W1.Percentage) < 99 — percentage threshold

OPTION (RECOMPILE);

Bazy danych

Konfiguracja

Przykładowe podzielenie plików. Ważne jest aby Size oraz autogrowth dla każdego Pliku miały takie same wartości.

Baza ta może znacznie się rozrosnąć przy dużych operacjach (np. odbudowa indeksów), więc należy jej zapewnić odpowiednią ilość miejsca.

Do wersji SQL 2014 włącznie po podziale baz na pliki należy ustawić flagi: T1117, T1118.

Serwisowanie bazy

Backupy

Backupy baz ich rodzaj i częstotliwość ustawia się zgodnie z oczekiwaniami Klienta. Rodzaje podstawowych kopii baz danych:

Aktualizacja statystyk oraz odbudowa indeksów

Od wersji 2016 SQL Server zmianie uległ algorytm dotyczący częstotliwości aktualizacji statystyk. W kolejnych wersjach działa on poprawnie. Jednak można w oknie serwisowym, po skończonej pracy przeprowadzić aktualizację statystyk, korzystając z Maintenance Plans lub wprowadzając do JOB’a polecenie T-SQL. Można również przeprowadzić reorganizacje największych i najbardziej pofragmentowanych indeksów (powyżej 2500 stron i stopień fragmentacji powyżej 5%).

Raz w tygodniu można wykonać reindeksację największych i najbardziej pofragmentowanych indeksów (2500 stron, stopień fragmentacji powyżej 50%).

Konfiguracja maszyn wirtualnych

W przypadku konfigurowania maszyn wirtualnych na serwerze, należy zwrócić uwagę na ilość przypisywanych gniazd procesorów dla wirtualnych CPU (vCPU).

Część wirtualizatorów dla jednego vCPU przypisuje pojedyncze gniazdo. W przypadku najnowszych wersji Microsoft SQL Server Standard maksymalna ilość obsługiwanych gniazd wynosi cztery.

Przykład: Jeśli dla maszyny zostanie przypisanych 8 vCPU i 8 gniazd to SQL będzie wykorzystywał tylko 4 gniazda i 4 vCPU pozostałe cztery nie będą brały udziału w operacja wykonywanych na SQL Serwerze. Dobrą praktyką jest przypisanie takiej ilości gniazd jaka znajduje się na maszynie fizycznej. Natomiast jeśli z jakiejś przyczyny zostanie przydzielona inna ilość to należy się stosować do założenia, że na 8 vCPU można przypisać jedno gniazdo (dla 16 vCPU – 2 gniazda itd.).a
+ Mam problem z tym tematem Otwórz w portalu bazy wiedzy »