[{"id":312,"title":"SQL Server'da CPU Kullan\u0131m\u0131n\u0131 S\u0131n\u0131rlama","content":"<p>SQL Server sunucular\u0131nda CPU kullan\u0131m\u0131n\u0131 kontrol alt\u0131nda tutmak, sistem performans\u0131 ve kaynak y&ouml;netimi a&ccedil;\u0131s\u0131ndan kritik &ouml;neme sahiptir. &Ouml;zellikle ayn\u0131 sunucuda birden fazla uygulama &ccedil;al\u0131\u015f\u0131yorsa veya belirli i\u015f y&uuml;klerinin t&uuml;m sistem kaynaklar\u0131n\u0131 t&uuml;ketmesini engellemek istiyorsan\u0131z, CPU s\u0131n\u0131rlamas\u0131 hayati bir gereklilik haline gelir.<\/p>\r\n<p>Bu yaz\u0131da, SQL Server'\u0131n farkl\u0131 s&uuml;r&uuml;mlerinde (Express, Standard, Enterprise) CPU kullan\u0131m\u0131n\u0131 nas\u0131l s\u0131n\u0131rlayabilece\u011finizi, hangi y&ouml;ntemlerin hangi durumlarda i\u015fe yarad\u0131\u011f\u0131n\u0131 ve kar\u015f\u0131la\u015fabilece\u011finiz hatalar\u0131n &ccedil;&ouml;z&uuml;mlerini detayl\u0131 olarak inceleyece\u011fiz.<\/p>\r\n<h2>SQL Server S&uuml;r&uuml;mleri ve CPU S\u0131n\u0131rlamalar\u0131<\/h2>\r\n<p>SQL Server'\u0131n farkl\u0131 s&uuml;r&uuml;mlerinin CPU kullan\u0131m\u0131 konusunda farkl\u0131 yetenekleri ve k\u0131s\u0131tlamalar\u0131 vard\u0131r:<\/p>\r\n<h3>Express Edition<\/h3>\r\n<ul>\r\n<li><strong>Maksimum CPU:<\/strong> 4 &ccedil;ekirdek veya 1 soket (hangisi daha az ise)<\/li>\r\n<li><strong>Maksimum RAM:<\/strong> 1 GB<\/li>\r\n<li><strong>Resource Governor:<\/strong> Desteklenmiyor \u274c<\/li>\r\n<li><strong>CPU Affinity:<\/strong> Desteklenmiyor \u274c<\/li>\r\n<li><strong>Lisans:<\/strong> &Uuml;cretsiz<\/li>\r\n<\/ul>\r\n<h3>Standard Edition<\/h3>\r\n<ul>\r\n<li><strong>Maksimum CPU:<\/strong> 4 soket veya 24 &ccedil;ekirdek (hangisi daha az ise)<\/li>\r\n<li><strong>Maksimum RAM:<\/strong> 128 GB<\/li>\r\n<li><strong>Resource Governor:<\/strong> Desteklenmiyor \u274c<\/li>\r\n<li><strong>CPU Affinity:<\/strong> Destekleniyor \u2705<\/li>\r\n<li><strong>Lisans:<\/strong> &Uuml;cretli<\/li>\r\n<\/ul>\r\n<h3>Enterprise Edition<\/h3>\r\n<ul>\r\n<li><strong>Maksimum CPU:<\/strong> S\u0131n\u0131rs\u0131z<\/li>\r\n<li><strong>Maksimum RAM:<\/strong> \u0130\u015fletim sistemi maksimumu<\/li>\r\n<li><strong>Resource Governor:<\/strong> Tam destek \u2705<\/li>\r\n<li><strong>CPU Affinity:<\/strong> Tam destek \u2705<\/li>\r\n<li><strong>Lisans:<\/strong> &Uuml;cretli (en pahal\u0131)<\/li>\r\n<\/ul>\r\n<h3>Developer Edition<\/h3>\r\n<ul>\r\n<li><strong>&Ouml;zellikler:<\/strong> Enterprise ile tamamen ayn\u0131<\/li>\r\n<li><strong>Kullan\u0131m:<\/strong> Sadece geli\u015ftirme\/test ortamlar\u0131 i&ccedil;in<\/li>\r\n<li><strong>Lisans:<\/strong> &Uuml;cretsiz<\/li>\r\n<\/ul>\r\n<h2>Y&ouml;ntem 1: Resource Governor (Sadece Enterprise\/Developer)<\/h2>\r\n<p>Resource Governor, SQL Server Enterprise ve Developer Edition'larda bulunan, kaynak kullan\u0131m\u0131n\u0131 dinamik olarak y&ouml;netmenizi sa\u011flayan geli\u015fmi\u015f bir &ouml;zelliktir.<\/p>\r\n<h3>Resource Governor Nedir?<\/h3>\r\n<p>Resource Governor, &uuml;&ccedil; ana bile\u015fenden olu\u015fur:<\/p>\r\n<ol>\r\n<li><strong>Resource Pool (Kaynak Havuzu):<\/strong> CPU ve bellek limitlerini tan\u0131mlar<\/li>\r\n<li><strong>Workload Group (\u0130\u015f Y&uuml;k&uuml; Grubu):<\/strong> Resource Pool'a ba\u011fl\u0131 grup<\/li>\r\n<li><strong>Classifier Function (S\u0131n\u0131fland\u0131r\u0131c\u0131 Fonksiyon):<\/strong> Hangi ba\u011flant\u0131n\u0131n hangi gruba gidece\u011fini belirler<\/li>\r\n<\/ol>\r\n<h3>Temel Kullan\u0131m<\/h3>\r\n<pre><code class=\"language-sql\">-- 1. Kaynak Havuzu Olu\u015fturma\r\nCREATE RESOURCE POOL limited_cpu_pool\r\nWITH (\r\n    MAX_CPU_PERCENT = 90,  -- Maksimum %90 CPU kullan\u0131m\u0131\r\n    MIN_CPU_PERCENT = 10   -- Garanti edilen minimum %10 CPU\r\n);\r\n\r\n-- 2. \u0130\u015f Y&uuml;k&uuml; Grubu Olu\u015fturma\r\nCREATE WORKLOAD GROUP limited_workload_group\r\nUSING limited_cpu_pool;\r\n\r\n-- 3. Yap\u0131land\u0131rmay\u0131 Aktifle\u015ftirme\r\nALTER RESOURCE GOVERNOR RECONFIGURE;\r\n<\/code><\/pre>\r\n<h3>Classifier Function ile Kullan\u0131c\u0131 Bazl\u0131 S\u0131n\u0131rlama<\/h3>\r\n<pre><code class=\"language-sql\">USE master;\r\nGO\r\n\r\nCREATE FUNCTION dbo.ResourceGovernorClassifier()\r\nRETURNS sysname\r\nWITH SCHEMABINDING\r\nAS\r\nBEGIN\r\n    DECLARE @workload_group_name sysname;\r\n    \r\n    -- Raporlama kullan\u0131c\u0131lar\u0131 i&ccedil;in s\u0131n\u0131rlama\r\n    IF (SUSER_NAME() IN ('rapor_user', 'bi_user', 'ssrs_service'))\r\n        SET @workload_group_name = 'limited_workload_group';\r\n    \r\n    -- SSRS (Reporting Services) uygulamalar\u0131 i&ccedil;in\r\n    ELSE IF (APP_NAME() LIKE '%ReportServer%')\r\n        SET @workload_group_name = 'limited_workload_group';\r\n    \r\n    -- Belirli bir sunucudan gelen ba\u011flant\u0131lar i&ccedil;in\r\n    ELSE IF (HOST_NAME() = 'RAPOR_SUNUCU')\r\n        SET @workload_group_name = 'limited_workload_group';\r\n    \r\n    -- Di\u011fer t&uuml;m kullan\u0131c\u0131lar varsay\u0131lan gruba\r\n    ELSE\r\n        SET @workload_group_name = 'default';\r\n    \r\n    RETURN @workload_group_name;\r\nEND;\r\nGO\r\n\r\n-- Classifier Function'\u0131 Kaydetme\r\nALTER RESOURCE GOVERNOR \r\nWITH (CLASSIFIER_FUNCTION = dbo.ResourceGovernorClassifier);\r\nGO\r\n\r\nALTER RESOURCE GOVERNOR RECONFIGURE;\r\nGO\r\n<\/code><\/pre>\r\n<h3>Mesai Saatine G&ouml;re Dinamik S\u0131n\u0131rlama<\/h3>\r\n<pre><code class=\"language-sql\">CREATE FUNCTION dbo.ResourceGovernorClassifier()\r\nRETURNS sysname\r\nWITH SCHEMABINDING\r\nAS\r\nBEGIN\r\n    DECLARE @hour INT = DATEPART(HOUR, GETDATE());\r\n    DECLARE @workload_group_name sysname;\r\n    \r\n    -- Mesai saatleri d\u0131\u015f\u0131nda (18:00-08:00) raporlar s\u0131n\u0131rlans\u0131n\r\n    IF (@hour &gt;= 18 OR @hour &lt; 8)\r\n        SET @workload_group_name = 'limited_workload_group';\r\n    ELSE\r\n        SET @workload_group_name = 'default';\r\n    \r\n    RETURN @workload_group_name;\r\nEND;\r\nGO\r\n<\/code><\/pre>\r\n<h3>Resource Governor \u0130zleme<\/h3>\r\n<pre><code class=\"language-sql\">-- Resource Pool ve Workload Group durumunu g&ouml;r&uuml;nt&uuml;leme\r\nSELECT \r\n    rp.name AS pool_name,\r\n    rp.max_cpu_percent,\r\n    rp.min_cpu_percent,\r\n    rp.max_memory_percent,\r\n    wg.name AS workload_group_name,\r\n    wg.group_max_requests,\r\n    wg.importance\r\nFROM sys.dm_resource_governor_resource_pools rp\r\nLEFT JOIN sys.dm_resource_governor_workload_groups wg \r\n    ON rp.pool_id = wg.pool_id\r\nWHERE rp.name &lt;&gt; 'internal';\r\n\r\n-- Aktif oturumlar\u0131n hangi workload group'ta oldu\u011funu g&ouml;rme\r\nSELECT \r\n    s.session_id,\r\n    s.login_name,\r\n    s.host_name,\r\n    s.program_name,\r\n    wg.name AS workload_group_name,\r\n    rp.name AS resource_pool_name,\r\n    rp.max_cpu_percent\r\nFROM sys.dm_exec_sessions s\r\nLEFT JOIN sys.dm_resource_governor_workload_groups wg \r\n    ON s.group_id = wg.group_id\r\nLEFT JOIN sys.dm_resource_governor_resource_pools rp \r\n    ON wg.pool_id = rp.pool_id\r\nWHERE s.is_user_process = 1;\r\n\r\n-- CPU kullan\u0131m istatistikleri\r\nSELECT \r\n    pool_id,\r\n    name,\r\n    total_cpu_usage_ms,\r\n    total_cpu_usage_preemptive_ms,\r\n    CAST(total_cpu_usage_ms AS DECIMAL(20,2)) \/ 1000 \/ 60 AS total_cpu_minutes\r\nFROM sys.dm_resource_governor_resource_pools\r\nWHERE name &lt;&gt; 'internal'\r\nORDER BY total_cpu_usage_ms DESC;\r\n<\/code><\/pre>\r\n<h3>Resource Governor'\u0131 Kald\u0131rma<\/h3>\r\n<pre><code class=\"language-sql\">-- &Ouml;nce classifier'\u0131 kald\u0131r\r\nALTER RESOURCE GOVERNOR WITH (CLASSIFIER_FUNCTION = NULL);\r\nALTER RESOURCE GOVERNOR RECONFIGURE;\r\n\r\n-- Workload Group'u sil\r\nDROP WORKLOAD GROUP limited_workload_group;\r\n\r\n-- Resource Pool'u sil\r\nDROP RESOURCE POOL limited_cpu_pool;\r\n\r\n-- De\u011fi\u015fiklikleri uygula\r\nALTER RESOURCE GOVERNOR RECONFIGURE;\r\n<\/code><\/pre>\r\n<h3>Kar\u015f\u0131la\u015f\u0131labilecek Hatalar<\/h3>\r\n<h4>Hata 1: Edition Desteklemiyor<\/h4>\r\n<pre><code>Msg 10923, Level 16, State 1\r\n'ALTER RESOURCE GOVERNOR RECONFIGURE' failed. \r\nThe resource governor is not available in this edition of SQL Server.\r\n<\/code><\/pre>\r\n<p><strong>&Ccedil;&ouml;z&uuml;m:<\/strong> Bu hata Standard veya Express Edition kulland\u0131\u011f\u0131n\u0131z\u0131 g&ouml;sterir. Resource Governor sadece Enterprise\/Developer Edition'da &ccedil;al\u0131\u015f\u0131r.<\/p>\r\n<p><strong>Alternatif Y&ouml;ntemler:<\/strong><\/p>\r\n<ul>\r\n<li>CPU Affinity (Standard Edition'da &ccedil;al\u0131\u015f\u0131r)<\/li>\r\n<li>MAXDOP ayarlar\u0131<\/li>\r\n<li>Query hints<\/li>\r\n<\/ul>\r\n<h2>Y&ouml;ntem 2: CPU Affinity (Processor Affinity)<\/h2>\r\n<p>CPU Affinity, SQL Server'\u0131n hangi i\u015flemci &ccedil;ekirdeklerini kullanabilece\u011fini belirler. Bu y&ouml;ntem Standard ve Enterprise Edition'larda &ccedil;al\u0131\u015f\u0131r.<\/p>\r\n<h3>T-SQL ile CPU Affinity Ayarlama<\/h3>\r\n<pre><code class=\"language-sql\">-- 20 CPU'luk bir sistemde 18 CPU kullan (%90)\r\nALTER SERVER CONFIGURATION\r\nSET PROCESS AFFINITY CPU = 0 TO 17;\r\n\r\n-- Belirli CPU'lar\u0131 se&ccedil;me\r\nALTER SERVER CONFIGURATION\r\nSET PROCESS AFFINITY CPU = 0, 1, 2, 3, 4, 5, 6, 7;\r\n\r\n-- NUMA node bazl\u0131 ayarlama\r\nALTER SERVER CONFIGURATION\r\nSET PROCESS AFFINITY NUMANODE = 0, 1;\r\n\r\n-- Affinity'yi kald\u0131rma (t&uuml;m CPU'lar\u0131 kullan)\r\nALTER SERVER CONFIGURATION\r\nSET PROCESS AFFINITY CPU = AUTO;\r\n<\/code><\/pre>\r\n<h3>GUI ile CPU Affinity Ayarlama<\/h3>\r\n<ol>\r\n<li><strong>SQL Server Management Studio (SSMS)<\/strong> a&ccedil;\u0131n<\/li>\r\n<li>Sunucuya sa\u011f t\u0131klay\u0131n &rarr; <strong>Properties<\/strong><\/li>\r\n<li><strong>Processors<\/strong> sayfas\u0131n\u0131 se&ccedil;in<\/li>\r\n<li><strong>\"Automatically set processor affinity mask for all processors\"<\/strong> i\u015faretini kald\u0131r\u0131n<\/li>\r\n<li>Kullan\u0131lmas\u0131n\u0131 istemedi\u011finiz CPU'lar\u0131n kutular\u0131n\u0131 <strong>i\u015faretsiz<\/strong> b\u0131rak\u0131n<\/li>\r\n<li><strong>OK<\/strong> butonuna t\u0131klay\u0131n<\/li>\r\n<li><strong>SQL Server servisini restart edin<\/strong><\/li>\r\n<\/ol>\r\n<h3>CPU Affinity Kontrol<\/h3>\r\n<pre><code class=\"language-sql\">-- Hangi CPU'lar SQL Server taraf\u0131ndan kullan\u0131l\u0131yor?\r\nSELECT \r\n    scheduler_id,\r\n    cpu_id,\r\n    status,\r\n    is_online,\r\n    current_tasks_count,\r\n    runnable_tasks_count\r\nFROM sys.dm_os_schedulers\r\nWHERE scheduler_id &lt; 255\r\nORDER BY cpu_id;\r\n\r\n-- SQL Server'\u0131n toplam CPU say\u0131s\u0131\r\nSELECT \r\n    cpu_count AS 'SQL Server G&ouml;r&uuml;nen CPU Say\u0131s\u0131',\r\n    hyperthread_ratio AS 'Hyperthread Oran\u0131',\r\n    cpu_count \/ hyperthread_ratio AS 'Fiziksel CPU Say\u0131s\u0131',\r\n    scheduler_count AS 'Scheduler Say\u0131s\u0131'\r\nFROM sys.dm_os_sys_info;\r\n<\/code><\/pre>\r\n<h3>Affinity Mask Hesaplama<\/h3>\r\n<p>Affinity Mask, binary (ikili) sistemde &ccedil;al\u0131\u015f\u0131r. Her bit bir CPU'yu temsil eder.<\/p>\r\n<p><strong>&Ouml;rnek: 20 CPU'dan 18'ini kullanmak<\/strong><\/p>\r\n<pre><code>CPU 0-17 kullan\u0131lacak:\r\nBinary: 0000 0000 0000 1111 1111 1111 1111 1111\r\nDecimal: 262143\r\nHex: 0x3FFFF\r\n<\/code><\/pre>\r\n<pre><code class=\"language-sql\">-- sp_configure ile affinity mask ayarlama (eski y&ouml;ntem)\r\nEXEC sp_configure 'show advanced options', 1;\r\nRECONFIGURE;\r\n\r\nEXEC sp_configure 'affinity mask', 262143;\r\nRECONFIGURE;\r\n<\/code><\/pre>\r\n<p><strong>Not:<\/strong> Modern SQL Server s&uuml;r&uuml;mlerinde <code>ALTER SERVER CONFIGURATION<\/code> kullan\u0131m\u0131 &ouml;nerilir.<\/p>\r\n<h3>Kar\u015f\u0131la\u015f\u0131labilecek Hatalar<\/h3>\r\n<h4>Hata 2: CPU Say\u0131s\u0131 Yetersiz<\/h4>\r\n<pre><code>Msg 5833, Level 16, State 2\r\nThe affinity mask specified is greater than the number of CPUs \r\nsupported or licensed on this edition of SQL Server.\r\n<\/code><\/pre>\r\n<p><strong>Nedenleri:<\/strong><\/p>\r\n<ol>\r\n<li>Belirtti\u011finiz CPU numaras\u0131 sistemdeki toplam CPU say\u0131s\u0131ndan fazla<\/li>\r\n<li>SQL Server Edition'\u0131n\u0131z daha az CPU destekliyor (&ouml;rn: Express = 4 core)<\/li>\r\n<li>CPU lisans\u0131n\u0131z s\u0131n\u0131rl\u0131<\/li>\r\n<\/ol>\r\n<p><strong>&Ccedil;&ouml;z&uuml;m:<\/strong><\/p>\r\n<pre><code class=\"language-sql\">-- &Ouml;nce ka&ccedil; CPU oldu\u011funu kontrol edin\r\nSELECT cpu_count FROM sys.dm_os_sys_info;\r\n\r\n-- Sonra uygun de\u011feri ayarlay\u0131n\r\n-- &Ouml;rnek: 8 CPU varsa, 7'sini kullan\r\nALTER SERVER CONFIGURATION\r\nSET PROCESS AFFINITY CPU = 0 TO 6;\r\n<\/code><\/pre>\r\n<h2>Y&ouml;ntem 3: MAXDOP (Max Degree of Parallelism)<\/h2>\r\n<p>MAXDOP, bir sorgunun ayn\u0131 anda ka&ccedil; CPU &ccedil;ekirde\u011fi kullanabilece\u011fini belirler. T&uuml;m SQL Server s&uuml;r&uuml;mlerinde &ccedil;al\u0131\u015f\u0131r.<\/p>\r\n<h3>Sunucu Seviyesinde MAXDOP<\/h3>\r\n<pre><code class=\"language-sql\">-- T&uuml;m sunucu i&ccedil;in MAXDOP ayarlama\r\nEXEC sp_configure 'show advanced options', 1;\r\nRECONFIGURE;\r\n\r\nEXEC sp_configure 'max degree of parallelism', 8;\r\nRECONFIGURE;\r\n\r\n-- Ayar\u0131 kontrol etme\r\nEXEC sp_configure 'max degree of parallelism';\r\n<\/code><\/pre>\r\n<h3>Veritaban\u0131 Seviyesinde MAXDOP<\/h3>\r\n<pre><code class=\"language-sql\">-- Belirli bir veritaban\u0131 i&ccedil;in MAXDOP\r\nALTER DATABASE SCOPED CONFIGURATION \r\nSET MAXDOP = 8;\r\n\r\n-- Veritaban\u0131 ayar\u0131n\u0131 kontrol etme\r\nSELECT name, value \r\nFROM sys.database_scoped_configurations\r\nWHERE name = 'MAXDOP';\r\n<\/code><\/pre>\r\n<h3>Sorgu Seviyesinde MAXDOP<\/h3>\r\n<pre><code class=\"language-sql\">-- Tek bir sorgu i&ccedil;in MAXDOP\r\nSELECT \r\n    CustomerID,\r\n    COUNT(*) AS OrderCount\r\nFROM Orders\r\nGROUP BY CustomerID\r\nOPTION (MAXDOP 4);\r\n\r\n-- Paralellik tamamen kapal\u0131\r\nSELECT * FROM LargTable\r\nOPTION (MAXDOP 1);\r\n<\/code><\/pre>\r\n<h3>MAXDOP De\u011feri Nas\u0131l Belirlenir?<\/h3>\r\n<p>Microsoft'un &ouml;nerdi\u011fi form&uuml;l:<\/p>\r\n<pre><code>MAXDOP = MIN(8, CPU_Core_Count \/ NUMA_Node_Count)\r\n<\/code><\/pre>\r\n<p><strong>&Ouml;rnekler:<\/strong><\/p>\r\n<table>\r\n<thead>\r\n<tr>\r\n<th>Sistem Yap\u0131s\u0131<\/th>\r\n<th>&Ouml;nerilen MAXDOP<\/th>\r\n<\/tr>\r\n<\/thead>\r\n<tbody>\r\n<tr>\r\n<td>4 core, 1 NUMA<\/td>\r\n<td>4<\/td>\r\n<\/tr>\r\n<tr>\r\n<td>8 core, 1 NUMA<\/td>\r\n<td>8<\/td>\r\n<\/tr>\r\n<tr>\r\n<td>16 core, 1 NUMA<\/td>\r\n<td>8<\/td>\r\n<\/tr>\r\n<tr>\r\n<td>16 core, 2 NUMA<\/td>\r\n<td>8<\/td>\r\n<\/tr>\r\n<tr>\r\n<td>32 core, 4 NUMA<\/td>\r\n<td>8<\/td>\r\n<\/tr>\r\n<tr>\r\n<td>64 core, 8 NUMA<\/td>\r\n<td>8<\/td>\r\n<\/tr>\r\n<\/tbody>\r\n<\/table>\r\n<pre><code class=\"language-sql\">-- NUMA yap\u0131s\u0131n\u0131 kontrol etme\r\nSELECT \r\n    node_id,\r\n    COUNT(*) AS cpu_count\r\nFROM sys.dm_os_schedulers\r\nWHERE status = 'VISIBLE ONLINE'\r\nGROUP BY node_id;\r\n<\/code><\/pre>\r\n<h3>Cost Threshold for Parallelism<\/h3>\r\n<p>MAXDOP ile birlikte kullan\u0131lmas\u0131 gereken &ouml;nemli bir ayar:<\/p>\r\n<pre><code class=\"language-sql\">-- Sadece maliyeti 50'den y&uuml;ksek sorgular paralel &ccedil;al\u0131\u015fs\u0131n\r\nEXEC sp_configure 'cost threshold for parallelism', 50;\r\nRECONFIGURE;\r\n<\/code><\/pre>\r\n<p><strong>Varsay\u0131lan de\u011fer:<\/strong> 5 (&ccedil;ok d&uuml;\u015f&uuml;k) <strong>&Ouml;nerilen de\u011fer:<\/strong> 25-50 aras\u0131<\/p>\r\n<pre><code class=\"language-sql\">-- Hangi sorgular\u0131n paralel &ccedil;al\u0131\u015ft\u0131\u011f\u0131n\u0131 g&ouml;rme\r\nSELECT \r\n    query_plan,\r\n    execution_count,\r\n    total_worker_time \/ execution_count AS avg_cpu_time,\r\n    degree_of_parallelism\r\nFROM sys.dm_exec_query_stats qs\r\nCROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) qp\r\nWHERE qp.query_plan LIKE '%Parallelism%'\r\nORDER BY total_worker_time DESC;\r\n<\/code><\/pre>\r\n<h2>Y&ouml;ntem 4: Maximum Worker Threads<\/h2>\r\n<p>Worker thread say\u0131s\u0131n\u0131 s\u0131n\u0131rlayarak dolayl\u0131 olarak CPU kullan\u0131m\u0131n\u0131 kontrol edebilirsiniz.<\/p>\r\n<pre><code class=\"language-sql\">-- Worker thread say\u0131s\u0131n\u0131 g&ouml;r&uuml;nt&uuml;leme\r\nSELECT \r\n    max_workers_count AS 'Configured Max Workers',\r\n    (SELECT COUNT(*) \r\n     FROM sys.dm_os_workers \r\n     WHERE state IN ('RUNNING', 'RUNNABLE')) AS 'Active Workers'\r\nFROM sys.dm_os_sys_info;\r\n\r\n-- Worker thread say\u0131s\u0131n\u0131 ayarlama\r\nEXEC sp_configure 'show advanced options', 1;\r\nRECONFIGURE;\r\n\r\n-- &Ouml;rnek: 512 worker thread\r\nEXEC sp_configure 'max worker threads', 512;\r\nRECONFIGURE;\r\n<\/code><\/pre>\r\n<p><strong>Varsay\u0131lan de\u011ferler (x64):<\/strong><\/p>\r\n<table>\r\n<thead>\r\n<tr>\r\n<th>CPU Say\u0131s\u0131<\/th>\r\n<th>Varsay\u0131lan Worker Thread<\/th>\r\n<\/tr>\r\n<\/thead>\r\n<tbody>\r\n<tr>\r\n<td>&le; 4<\/td>\r\n<td>512<\/td>\r\n<\/tr>\r\n<tr>\r\n<td>8<\/td>\r\n<td>576<\/td>\r\n<\/tr>\r\n<tr>\r\n<td>16<\/td>\r\n<td>704<\/td>\r\n<\/tr>\r\n<tr>\r\n<td>32<\/td>\r\n<td>960<\/td>\r\n<\/tr>\r\n<tr>\r\n<td>64<\/td>\r\n<td>1472<\/td>\r\n<\/tr>\r\n<\/tbody>\r\n<\/table>\r\n<p>\u26a0\ufe0f <strong>Dikkat:<\/strong> &Ccedil;ok d&uuml;\u015f&uuml;k de\u011fer SQL Server'\u0131 kilitleyebilir!<\/p>\r\n<h2>Y&ouml;ntem 5: Windows \u0130\u015fletim Sistemi Seviyesi<\/h2>\r\n<h3>Task Manager ile Affinity Ayarlama<\/h3>\r\n<ol>\r\n<li><strong>Task Manager<\/strong> a&ccedil;\u0131n (Ctrl + Shift + Esc)<\/li>\r\n<li><strong>Details<\/strong> sekmesine gidin<\/li>\r\n<li><strong>sqlservr.exe<\/strong> s&uuml;recini bulun<\/li>\r\n<li>Sa\u011f t\u0131klay\u0131n &rarr; <strong>Set affinity<\/strong><\/li>\r\n<li>Kullan\u0131lmas\u0131n\u0131 istemedi\u011finiz CPU'lar\u0131n i\u015faretini kald\u0131r\u0131n<\/li>\r\n<li><strong>OK<\/strong> t\u0131klay\u0131n<\/li>\r\n<\/ol>\r\n<p>\u26a0\ufe0f <strong>&Ouml;nemli:<\/strong> Bu ayar SQL Server servisini her restart etti\u011finizde s\u0131f\u0131rlan\u0131r.<\/p>\r\n<h3>PowerShell ile Kal\u0131c\u0131 Affinity<\/h3>\r\n<pre><code class=\"language-powershell\"># SQL Server servisinin CPU affinity'sini ayarlama\r\n$service = Get-WmiObject Win32_Service -Filter \"Name='MSSQLSERVER'\"\r\n$processId = $service.ProcessId\r\n$process = Get-Process -Id $processId\r\n\r\n# \u0130lk 18 CPU'yu kullan (0x3FFFF = 262143)\r\n$process.ProcessorAffinity = 262143\r\n<\/code><\/pre>\r\n<h3>Windows Process Priority<\/h3>\r\n<pre><code class=\"language-sql\">-- SQL Server'\u0131n priority boost ayar\u0131 (&ouml;nerilmez)\r\nEXEC sp_configure 'show advanced options', 1;\r\nRECONFIGURE;\r\n\r\nEXEC sp_configure 'priority boost', 0; -- 0 = Normal, 1 = High\r\nRECONFIGURE;\r\n<\/code><\/pre>\r\n<p>\u26a0\ufe0f <strong>Uyar\u0131:<\/strong> Priority boost'u aktifle\u015ftirmek sistem karars\u0131zl\u0131\u011f\u0131na neden olabilir.<\/p>\r\n<h2>CPU Kullan\u0131m\u0131n\u0131 \u0130zleme ve Analiz<\/h2>\r\n<h3>Ger&ccedil;ek Zamanl\u0131 CPU Kullan\u0131m\u0131<\/h3>\r\n<pre><code class=\"language-sql\">-- SQL Server'\u0131n anl\u0131k CPU kullan\u0131m\u0131\r\nDECLARE @ms_ticks INT;\r\nSELECT @ms_ticks = ms_ticks FROM sys.dm_os_sys_info;\r\n\r\nSELECT TOP 30\r\n    DATEADD(ms, -1 * (@ms_ticks - [timestamp]), GETDATE()) AS EventTime,\r\n    SQLProcessUtilization,\r\n    SystemIdle,\r\n    100 - SystemIdle - SQLProcessUtilization AS OtherProcessCPU\r\nFROM (\r\n    SELECT \r\n        record.value('(.\/Record\/@id)[1]', 'int') AS record_id,\r\n        record.value('(.\/Record\/SchedulerMonitorEvent\/SystemHealth\/SystemIdle)[1]', 'int') AS SystemIdle,\r\n        record.value('(.\/Record\/SchedulerMonitorEvent\/SystemHealth\/ProcessUtilization)[1]', 'int') AS SQLProcessUtilization,\r\n        timestamp\r\n    FROM (\r\n        SELECT timestamp, CONVERT(XML, record) AS record\r\n        FROM sys.dm_os_ring_buffers\r\n        WHERE ring_buffer_type = N'RING_BUFFER_SCHEDULER_MONITOR'\r\n          AND record LIKE '%%'\r\n    ) AS x\r\n) AS y\r\nORDER BY record_id DESC;\r\n<\/code><\/pre>\r\n<h3>En &Ccedil;ok CPU T&uuml;keten Sorgular<\/h3>\r\n<pre><code class=\"language-sql\">-- Son 1 saat i&ccedil;inde en &ccedil;ok CPU kullanan sorgular\r\nSELECT TOP 20\r\n    SUBSTRING(qt.text, (qs.statement_start_offset\/2)+1,\r\n        ((CASE qs.statement_end_offset\r\n            WHEN -1 THEN DATALENGTH(qt.text)\r\n            ELSE qs.statement_end_offset\r\n        END - qs.statement_start_offset)\/2)+1) AS query_text,\r\n    qs.execution_count,\r\n    qs.total_worker_time \/ 1000 AS total_cpu_time_ms,\r\n    qs.total_worker_time \/ qs.execution_count \/ 1000 AS avg_cpu_time_ms,\r\n    qs.last_execution_time,\r\n    qp.query_plan\r\nFROM sys.dm_exec_query_stats qs\r\nCROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) qt\r\nCROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) qp\r\nWHERE qs.last_execution_time &gt; DATEADD(HOUR, -1, GETDATE())\r\nORDER BY qs.total_worker_time DESC;\r\n<\/code><\/pre>\r\n<h3>CPU Beklemeleri (Wait Statistics)<\/h3>\r\n<pre><code class=\"language-sql\">-- CPU ile ilgili bekleme istatistikleri\r\nSELECT \r\n    wait_type,\r\n    waiting_tasks_count,\r\n    wait_time_ms,\r\n    max_wait_time_ms,\r\n    signal_wait_time_ms,\r\n    CAST(100.0 * wait_time_ms \/ SUM(wait_time_ms) OVER() AS DECIMAL(5,2)) AS percentage\r\nFROM sys.dm_os_wait_stats\r\nWHERE wait_type LIKE 'SOS_SCHEDULER_YIELD'\r\n   OR wait_type LIKE 'CXPACKET'\r\n   OR wait_type LIKE 'CXCONSUMER'\r\nORDER BY wait_time_ms DESC;\r\n<\/code><\/pre>\r\n<h3>Scheduler Durumu<\/h3>\r\n<pre><code class=\"language-sql\">-- Her CPU scheduler'\u0131n\u0131n durumu\r\nSELECT \r\n    scheduler_id,\r\n    cpu_id,\r\n    status,\r\n    is_online,\r\n    is_idle,\r\n    current_tasks_count,\r\n    runnable_tasks_count,\r\n    current_workers_count,\r\n    active_workers_count,\r\n    work_queue_count,\r\n    load_factor,\r\n    yield_count\r\nFROM sys.dm_os_schedulers\r\nWHERE scheduler_id &lt; 255\r\nORDER BY cpu_id;\r\n<\/code><\/pre>\r\n<h2>Pratik Senaryolar ve &Ccedil;&ouml;z&uuml;mler<\/h2>\r\n<h3>Senaryo 1: Raporlama Sunucusu CPU'yu T&uuml;ketiyor<\/h3>\r\n<p><strong>Problem:<\/strong> SSRS (SQL Server Reporting Services) raporlar\u0131 production veritaban\u0131nda &ccedil;al\u0131\u015f\u0131yor ve t&uuml;m CPU'yu kullan\u0131yor.<\/p>\r\n<p><strong>&Ccedil;&ouml;z&uuml;m (Enterprise Edition):<\/strong><\/p>\r\n<pre><code class=\"language-sql\">-- Raporlama i&ccedil;in &ouml;zel pool olu\u015ftur\r\nCREATE RESOURCE POOL reporting_pool\r\nWITH (\r\n    MAX_CPU_PERCENT = 30,\r\n    MIN_CPU_PERCENT = 5\r\n);\r\n\r\nCREATE WORKLOAD GROUP reporting_group\r\nUSING reporting_pool;\r\n\r\n-- Raporlama kullan\u0131c\u0131lar\u0131n\u0131 s\u0131n\u0131fland\u0131r\r\nCREATE FUNCTION dbo.ResourceGovernorClassifier()\r\nRETURNS sysname\r\nWITH SCHEMABINDING\r\nAS\r\nBEGIN\r\n    IF (APP_NAME() LIKE '%ReportServer%' \r\n        OR APP_NAME() LIKE '%Report Builder%')\r\n        RETURN 'reporting_group';\r\n    \r\n    IF (SUSER_NAME() LIKE '%_report')\r\n        RETURN 'reporting_group';\r\n    \r\n    RETURN 'default';\r\nEND;\r\nGO\r\n\r\nALTER RESOURCE GOVERNOR \r\nWITH (CLASSIFIER_FUNCTION = dbo.ResourceGovernorClassifier);\r\nGO\r\n\r\nALTER RESOURCE GOVERNOR RECONFIGURE;\r\nGO\r\n<\/code><\/pre>\r\n<h3>Senaryo 2: Gece Batch \u0130\u015fleri<\/h3>\r\n<p><strong>Problem:<\/strong> Gece &ccedil;al\u0131\u015fan ETL i\u015fleri g&uuml;nd&uuml;z performans\u0131 etkiliyor.<\/p>\r\n<p><strong>&Ccedil;&ouml;z&uuml;m:<\/strong><\/p>\r\n<pre><code class=\"language-sql\">-- Zaman bazl\u0131 s\u0131n\u0131rlama\r\nCREATE FUNCTION dbo.ResourceGovernorClassifier()\r\nRETURNS sysname\r\nWITH SCHEMABINDING\r\nAS\r\nBEGIN\r\n    DECLARE @hour INT = DATEPART(HOUR, GETDATE());\r\n    \r\n    -- G&uuml;nd&uuml;z saatleri (08:00-18:00)\r\n    IF (@hour &gt;= 8 AND @hour &lt; 18)\r\n    BEGIN\r\n        -- ETL i\u015flerini s\u0131n\u0131rla\r\n        IF (APP_NAME() LIKE '%SSIS%' OR SUSER_NAME() = 'etl_user')\r\n            RETURN 'limited_workload_group';\r\n    END\r\n    \r\n    RETURN 'default';\r\nEND;\r\nGO\r\n<\/code><\/pre>\r\n<h3>Senaryo 3: Multi-Tenant SaaS Ortam\u0131<\/h3>\r\n<p><strong>Problem:<\/strong> Farkl\u0131 m&uuml;\u015fterilerin sorgular\u0131 birbirini etkiliyor.<\/p>\r\n<p><strong>&Ccedil;&ouml;z&uuml;m:<\/strong><\/p>\r\n<pre><code class=\"language-sql\">-- M&uuml;\u015fteri bazl\u0131 resource pool'lar\r\nCREATE RESOURCE POOL premium_customer_pool\r\nWITH (MAX_CPU_PERCENT = 60, MIN_CPU_PERCENT = 20);\r\n\r\nCREATE RESOURCE POOL standard_customer_pool\r\nWITH (MAX_CPU_PERCENT = 30, MIN_CPU_PERCENT = 5);\r\n\r\nCREATE WORKLOAD GROUP premium_customers\r\nUSING premium_customer_pool;\r\n\r\nCREATE WORKLOAD GROUP standard_customers\r\nUSING standard_customer_pool;\r\n\r\n-- Classifier function\r\nCREATE FUNCTION dbo.ResourceGovernorClassifier()\r\nRETURNS sysname\r\nWITH SCHEMABINDING\r\nAS\r\nBEGIN\r\n    DECLARE @customer_tier VARCHAR(20);\r\n    \r\n    -- Application name'den m&uuml;\u015fteri tier'\u0131n\u0131 al\r\n    -- &Ouml;rnek: \"MyApp_Premium_Customer123\"\r\n    IF (APP_NAME() LIKE '%Premium%')\r\n        RETURN 'premium_customers';\r\n    ELSE IF (APP_NAME() LIKE '%Standard%')\r\n        RETURN 'standard_customers';\r\n    \r\n    RETURN 'default';\r\nEND;\r\nGO\r\n<\/code><\/pre>\r\n<h3>Senaryo 4: Express Edition S\u0131n\u0131rlamalar\u0131<\/h3>\r\n<p><strong>Problem:<\/strong> Express Edition kullan\u0131yorsunuz ve Resource Governor yok.<\/p>\r\n<p><strong>&Ccedil;&ouml;z&uuml;m:<\/strong><\/p>\r\n<pre><code class=\"language-sql\">-- 1. MAXDOP ile paralel sorgu s\u0131n\u0131rlama\r\nEXEC sp_configure 'max degree of parallelism', 2;\r\nRECONFIGURE;\r\n\r\n-- 2. Cost threshold y&uuml;kseltme\r\nEXEC sp_configure 'cost threshold for parallelism', 50;\r\nRECONFIGURE;\r\n\r\n-- 3. Uygulama taraf\u0131nda connection pool s\u0131n\u0131rlama\r\n-- Connection String:\r\n-- \"Max Pool Size=10;Min Pool Size=2;\"\r\n\r\n-- 4. Query hints kullanma\r\nSELECT * FROM LargeTable\r\nWHERE Date &gt; '2024-01-01'\r\nOPTION (MAXDOP 1, RECOMPILE);\r\n<\/code><\/pre>\r\n<h2>Best Practices (En \u0130yi Uygulamalar)<\/h2>\r\n<h3>1. Test Ortam\u0131nda Deneyin<\/h3>\r\n<pre><code class=\"language-sql\">-- Production'a ge&ccedil;meden &ouml;nce test edin\r\n-- Test ortam\u0131nda Resource Governor yap\u0131land\u0131rmas\u0131\r\nCREATE RESOURCE POOL test_pool\r\nWITH (MAX_CPU_PERCENT = 50);\r\n\r\n-- Y&uuml;k testi yap\u0131n\r\n-- sqlcmd veya ostress ile\r\n<\/code><\/pre>\r\n<h3>2. \u0130zleme ve Uyar\u0131 Sistemi Kurun<\/h3>\r\n<pre><code class=\"language-sql\">-- CPU kullan\u0131m\u0131 %90'\u0131 ge&ccedil;ince uyar\u0131\r\nCREATE PROCEDURE sp_MonitorCPUUsage\r\nAS\r\nBEGIN\r\n    DECLARE @cpu_usage INT;\r\n    \r\n    SELECT @cpu_usage = SQLProcessUtilization\r\n    FROM (\r\n        SELECT TOP 1 \r\n            record.value('(.\/Record\/SchedulerMonitorEvent\/SystemHealth\/ProcessUtilization)[1]', 'int') AS SQLProcessUtilization\r\n        FROM (\r\n            SELECT CONVERT(XML, record) AS record\r\n            FROM sys.dm_os_ring_buffers\r\n            WHERE ring_buffer_type = N'RING_BUFFER_SCHEDULER_MONITOR'\r\n        ) AS x\r\n        ORDER BY record.value('(.\/Record\/@id)[1]', 'int') DESC\r\n    ) AS y;\r\n    \r\n    IF @cpu_usage &gt; 90\r\n    BEGIN\r\n        -- E-posta g&ouml;nder veya log yaz\r\n        RAISERROR('CPU usage exceeded 90%%!', 16, 1);\r\n    END\r\nEND;\r\nGO\r\n\r\n-- SQL Agent job ile 5 dakikada bir &ccedil;al\u0131\u015ft\u0131r\r\n<\/code><\/pre>\r\n<h3>3. Dok&uuml;mantasyon<\/h3>\r\n<p>Her yap\u0131land\u0131rma de\u011fi\u015fikli\u011fini dok&uuml;mante edin:<\/p>\r\n<pre><code class=\"language-sql\">-- De\u011fi\u015fiklik ge&ccedil;mi\u015fi tablosu\r\nCREATE TABLE dbo.ResourceGovernorChanges\r\n(\r\n    ChangeID INT IDENTITY PRIMARY KEY,\r\n    ChangeDate DATETIME DEFAULT GETDATE(),\r\n    ChangedBy NVARCHAR(128) DEFAULT SUSER_NAME(),\r\n    ChangeType NVARCHAR(50),\r\n    OldValue NVARCHAR(MAX),\r\n    NewValue NVARCHAR(MAX),\r\n    Reason NVARCHAR(500)\r\n);\r\n\r\n-- De\u011fi\u015fiklik kayd\u0131\r\nINSERT INTO dbo.ResourceGovernorChanges\r\n(ChangeType, OldValue, NewValue, Reason)\r\nVALUES\r\n('MAX_CPU_PERCENT', '100', '90', 'Reporting server performance impact');\r\n<\/code><\/pre>\r\n<h3>4. Rollback Plan\u0131 Haz\u0131rlay\u0131n<\/h3>\r\n<pre><code class=\"language-sql\">-- Emergency rollback script\r\n-- Her yap\u0131land\u0131rma de\u011fi\u015fikli\u011finden &ouml;nce haz\u0131rlay\u0131n\r\n\r\n-- Resource Governor'\u0131 tamamen devre d\u0131\u015f\u0131 b\u0131rakma\r\nALTER RESOURCE GOVERNOR DISABLE;\r\n\r\n-- CPU Affinity'yi t&uuml;m CPU'lara a&ccedil;ma\r\nALTER SERVER CONFIGURATION\r\nSET PROCESS AFFINITY CPU = AUTO;\r\n\r\n-- MAXDOP'u varsay\u0131lana d&ouml;nd&uuml;rme\r\nEXEC sp_configure 'max degree of parallelism', 0;\r\nRECONFIGURE;\r\n<\/code><\/pre>\r\n<h3>5. Baseline (Temel &Ccedil;izgi) &Ouml;l&ccedil;&uuml;mleri Al\u0131n<\/h3>\r\n<pre><code class=\"language-sql\">-- De\u011fi\u015fiklik &ouml;ncesi performans metrikleri\r\nSELECT \r\n    GETDATE() AS baseline_time,\r\n    @@SERVERNAME AS server_name,\r\n    (SELECT AVG(SQLProcessUtilization) \r\n     FROM (\r\n         SELECT TOP 60 \r\n             record.value('(.\/Record\/SchedulerMonitorEvent\/SystemHealth\/ProcessUtilization)[1]', 'int') AS SQLProcessUtilization\r\n         FROM (\r\n             SELECT CONVERT(XML, record) AS record\r\n             FROM sys.dm_os_ring_buffers\r\n             WHERE ring_buffer_type = N'RING_BUFFER_SCHEDULER_MONITOR'\r\n         ) AS x\r\n     ) AS y) AS avg_cpu_last_hour,\r\n    (SELECT COUNT(*) \r\n     FROM sys.dm_exec_requests \r\n     WHERE status = 'running') AS active_requests,\r\n    (SELECT COUNT(*) \r\n     FROM sys.dm_os_waiting_tasks) AS waiting_tasks\r\nINTO dbo.PerformanceBaseline;\r\n<\/code><\/pre>\r\n<h2 class=\"text-xl font-bold text-text-100 mt-1 -mb-0.5\">Sorun Giderme (Troubleshooting)<\/h2>\r\n<h3 class=\"text-lg font-bold text-text-100 mt-1 -mb-1.5\">Problem 1: Resource Governor &Ccedil;al\u0131\u015fm\u0131yor<\/h3>\r\n<p class=\"whitespace-normal break-words\"><strong>Belirti:<\/strong> Ayarlar yap\u0131ld\u0131 ama CPU kullan\u0131m\u0131 hala y&uuml;ksek.<\/p>\r\n<p class=\"whitespace-normal break-words\"><strong>Kontroller:<\/strong><\/p>\r\n<pre><code class=\"language-sql\">-- 1. Resource Governor aktif mi?\r\nSELECT is_enabled \r\nFROM sys.resource_governor_configuration;\r\n-- 0 = Devre d\u0131\u015f\u0131, 1 = Aktif\r\n\r\n-- 2. Classifier function do\u011fru mu?\r\nSELECT object_name(classifier_function_id) AS classifier_function\r\nFROM sys.resource_governor_configuration;\r\n\r\n-- 3. Kullan\u0131c\u0131lar do\u011fru gruba atanm\u0131\u015f m\u0131?\r\nSELECT \r\n    s.session_id,\r\n    s.login_name,\r\n    wg.name AS workload_group,\r\n    rp.name AS resource_pool\r\nFROM sys.dm_exec_sessions s\r\nLEFT JOIN sys.dm_resource_governor_workload_groups wg \r\n    ON s.group_id = wg.group_id\r\nLEFT JOIN sys.dm_resource_governor_resource_pools rp \r\n    ON wg.pool_id = rp.pool_id\r\nWHERE s.is_user_process = 1;\r\n\r\n-- 4. Classifier function test\r\nSELECT dbo.ResourceGovernorClassifier() AS assigned_group;\r\n<\/code><\/pre>\r\n<p><strong>&Ccedil;&ouml;z&uuml;mler:<\/strong><\/p>\r\n<pre><code class=\"language-sql\">-- Resource Governor'\u0131 yeniden etkinle\u015ftir\r\nALTER RESOURCE GOVERNOR RECONFIGURE;\r\n\r\n-- E\u011fer devre d\u0131\u015f\u0131ysa\r\nALTER RESOURCE GOVERNOR ENABLE;\r\nALTER RESOURCE GOVERNOR RECONFIGURE;\r\n\r\n-- Mevcut ba\u011flant\u0131lar i&ccedil;in ge&ccedil;erli olmas\u0131 i&ccedil;in kullan\u0131c\u0131lar\u0131n\r\n-- yeniden ba\u011flanmas\u0131 gerekir veya:\r\nALTER RESOURCE GOVERNOR RESET STATISTICS;\r\n<\/code><\/pre>\r\n<h3>Problem 2: CPU Affinity De\u011fi\u015fmiyor<\/h3>\r\n<p><strong>Belirti:<\/strong> ALTER SERVER CONFIGURATION komutu hatas\u0131z &ccedil;al\u0131\u015f\u0131yor ama CPU kullan\u0131m\u0131 de\u011fi\u015fmiyor.<\/p>\r\n<p><strong>Neden:<\/strong> SQL Server servisinin restart edilmesi gerekiyor.<\/p>\r\n<p><strong>&Ccedil;&ouml;z&uuml;m:<\/strong><\/p>\r\n<pre><code class=\"language-sql\">-- 1. SQL Server Agent'\u0131 durdur\r\nEXEC msdb.dbo.sp_stop_job @job_name = 'ALL';\r\n\r\n-- 2. PowerShell veya Service Manager ile SQL Server'\u0131 restart et\r\n\r\n-- 3. Restart sonras\u0131 kontrol\r\nSELECT \r\n    scheduler_id,\r\n    cpu_id,\r\n    is_online\r\nFROM sys.dm_os_schedulers\r\nWHERE scheduler_id &lt; 255\r\nORDER BY cpu_id;\r\n<\/code><\/pre>\r\n<h3>Problem 3: MAXDOP Ayar\u0131 &Ccedil;al\u0131\u015fm\u0131yor<\/h3>\r\n<p><strong>Belirti:<\/strong> MAXDOP ayarland\u0131 ama sorgular hala t&uuml;m CPU'lar\u0131 kullan\u0131yor.<\/p>\r\n<p><strong>Kontroller:<\/strong><\/p>\r\n<pre><code class=\"language-sql\">-- 1. MAXDOP de\u011ferini kontrol et\r\nEXEC sp_configure 'max degree of parallelism';\r\n\r\n-- 2. Veritaban\u0131 seviyesi ayar var m\u0131?\r\nSELECT name, value, value_for_secondary\r\nFROM sys.database_scoped_configurations\r\nWHERE name = 'MAXDOP';\r\n\r\n-- 3. Query Store hint var m\u0131?\r\nSELECT \r\n    qsqt.query_sql_text,\r\n    qsq.query_id,\r\n    qsh.query_hint_text\r\nFROM sys.query_store_query qsq\r\nINNER JOIN sys.query_store_query_text qsqt\r\n    ON qsq.query_text_id = qsqt.query_text_id\r\nLEFT JOIN sys.query_store_query_hints qsh\r\n    ON qsq.query_id = qsh.query_id\r\nWHERE qsh.query_hint_text LIKE '%MAXDOP%';\r\n\r\n-- 4. Plan cache'de MAXDOP hint'li planlar\r\nSELECT \r\n    query_plan,\r\n    execution_count,\r\n    query_plan.value('declare namespace p=\"http:\/\/schemas.microsoft.com\/sqlserver\/2004\/07\/showplan\";\r\n                      max(\/\/p:StmtSimple\/@StatementOptmLevel)', 'INT') AS MaxDOP\r\nFROM sys.dm_exec_query_stats qs\r\nCROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) qp\r\nWHERE query_plan.value('declare namespace p=\"http:\/\/schemas.microsoft.com\/sqlserver\/2004\/07\/showplan\";\r\n                        max(\/\/p:StmtSimple\/@StatementOptmLevel)', 'INT') &gt; 1;\r\n<\/code><\/pre>\r\n<p><strong>&Ccedil;&ouml;z&uuml;mler:<\/strong><\/p>\r\n<pre><code class=\"language-sql\">-- Veritaban\u0131 seviyesi ayar\u0131 kald\u0131r (sunucu ayar\u0131n\u0131 kullan)\r\nALTER DATABASE SCOPED CONFIGURATION SET MAXDOP = PRIMARY;\r\n\r\n-- Plan cache'i temizle\r\nDBCC FREEPROCCACHE;\r\n\r\n-- Belirli bir sorgu i&ccedil;in hint kullan\r\nSELECT * FROM Orders\r\nOPTION (MAXDOP 4, RECOMPILE);\r\n<\/code><\/pre>\r\n<h3>Problem 4: \"Insufficient System Resources\" Hatas\u0131<\/h3>\r\n<p><strong>Belirti:<\/strong> De\u011fi\u015fiklik sonras\u0131 SQL Server yava\u015flad\u0131 veya ba\u011flant\u0131lar kurulam\u0131yor.<\/p>\r\n<pre><code>Msg 701, Level 17, State 123\r\nThere is insufficient system memory in resource pool 'default' \r\nto run this query.\r\n<\/code><\/pre>\r\n<p><strong>Neden:<\/strong> Resource Pool ayarlar\u0131 &ccedil;ok k\u0131s\u0131tlay\u0131c\u0131.<\/p>\r\n<p><strong>&Ccedil;&ouml;z&uuml;m:<\/strong><\/p>\r\n<pre><code class=\"language-sql\">-- Mevcut resource pool ayarlar\u0131n\u0131 g&ouml;r&uuml;nt&uuml;le\r\nSELECT \r\n    name,\r\n    max_memory_percent,\r\n    max_cpu_percent,\r\n    min_memory_percent,\r\n    min_cpu_percent\r\nFROM sys.resource_governor_resource_pools;\r\n\r\n-- Acil durum: Resource Governor'\u0131 devre d\u0131\u015f\u0131 b\u0131rak\r\nALTER RESOURCE GOVERNOR DISABLE;\r\n\r\n-- Daha sonra ayarlar\u0131 d&uuml;zelt\r\nALTER RESOURCE POOL limited_cpu_pool\r\nWITH (\r\n    MAX_CPU_PERCENT = 90,  -- 80'den 90'a &ccedil;\u0131kar\r\n    MIN_CPU_PERCENT = 10,\r\n    MAX_MEMORY_PERCENT = 90  -- Bellek de ekle\r\n);\r\n\r\nALTER RESOURCE GOVERNOR RECONFIGURE;\r\nALTER RESOURCE GOVERNOR ENABLE;\r\n<\/code><\/pre>\r\n<h3>Problem 5: Classifier Function &Ccedil;al\u0131\u015fm\u0131yor<\/h3>\r\n<p><strong>Belirti:<\/strong> T&uuml;m kullan\u0131c\u0131lar 'default' grubuna d&uuml;\u015f&uuml;yor.<\/p>\r\n<p><strong>Debug:<\/strong><\/p>\r\n<pre><code class=\"language-sql\">-- Classifier function'\u0131 test et\r\nCREATE PROCEDURE sp_TestClassifier\r\n    @test_user NVARCHAR(128) = NULL,\r\n    @test_app NVARCHAR(128) = NULL,\r\n    @test_host NVARCHAR(128) = NULL\r\nAS\r\nBEGIN\r\n    DECLARE @result SYSNAME;\r\n    \r\n    -- Ge&ccedil;ici context de\u011fi\u015ftir (test ama&ccedil;l\u0131)\r\n    PRINT 'Current User: ' + SUSER_NAME();\r\n    PRINT 'Current App: ' + APP_NAME();\r\n    PRINT 'Current Host: ' + HOST_NAME();\r\n    \r\n    -- Classifier function'\u0131 &ccedil;a\u011f\u0131r\r\n    SELECT @result = dbo.ResourceGovernorClassifier();\r\n    \r\n    PRINT 'Assigned Group: ' + @result;\r\nEND;\r\nGO\r\n\r\nEXEC sp_TestClassifier;\r\n<\/code><\/pre>\r\n<p><strong>Yayg\u0131n Hatalar:<\/strong><\/p>\r\n<pre><code class=\"language-sql\">-- HATA: SCHEMABINDING kullan\u0131lmam\u0131\u015f\r\n-- YANLI\u015e:\r\nCREATE FUNCTION dbo.ResourceGovernorClassifier()\r\nRETURNS sysname\r\nAS\r\nBEGIN\r\n    -- ...\r\nEND;\r\n\r\n-- DO\u011eRU:\r\nCREATE FUNCTION dbo.ResourceGovernorClassifier()\r\nRETURNS sysname\r\nWITH SCHEMABINDING\r\nAS\r\nBEGIN\r\n    -- ...\r\nEND;\r\n\r\n-- HATA: NULL d&ouml;n&uuml;yor\r\n-- YANLI\u015e:\r\nCREATE FUNCTION dbo.ResourceGovernorClassifier()\r\nRETURNS sysname\r\nWITH SCHEMABINDING\r\nAS\r\nBEGIN\r\n    IF (SUSER_NAME() = 'test_user')\r\n        RETURN 'test_group';\r\n    -- NULL d&ouml;ner!\r\nEND;\r\n\r\n-- DO\u011eRU:\r\nCREATE FUNCTION dbo.ResourceGovernorClassifier()\r\nRETURNS sysname\r\nWITH SCHEMABINDING\r\nAS\r\nBEGIN\r\n    IF (SUSER_NAME() = 'test_user')\r\n        RETURN 'test_group';\r\n    \r\n    RETURN 'default';  -- Varsay\u0131lan de\u011fer\r\nEND;\r\n<\/code><\/pre>\r\n<h2>Performans Etkileri ve Optimizasyon<\/h2>\r\n<h3>Resource Governor Overhead<\/h3>\r\n<p>Resource Governor'\u0131n performans maliyeti minimumdur:<\/p>\r\n<pre><code class=\"language-sql\">-- Resource Governor overhead &ouml;l&ccedil;&uuml;m&uuml;\r\nDECLARE @start_time DATETIME2 = SYSDATETIME();\r\n\r\n-- 1000 ba\u011flant\u0131 sim&uuml;lasyonu\r\nDECLARE @i INT = 0;\r\nWHILE @i &lt; 1000\r\nBEGIN\r\n    -- Classifier function &ccedil;a\u011fr\u0131l\u0131r\r\n    DECLARE @group SYSNAME = dbo.ResourceGovernorClassifier();\r\n    SET @i = @i + 1;\r\nEND\r\n\r\nDECLARE @end_time DATETIME2 = SYSDATETIME();\r\n\r\nSELECT DATEDIFF(MILLISECOND, @start_time, @end_time) AS overhead_ms;\r\n-- Genellikle &lt; 10ms\r\n<\/code><\/pre>\r\n<p><strong>Optimizasyon \u0130pu&ccedil;lar\u0131:<\/strong><\/p>\r\n<ol>\r\n<li><strong>Basit Classifier Function Yaz\u0131n<\/strong><\/li>\r\n<\/ol>\r\n<pre><code class=\"language-sql\">-- K&Ouml;T&Uuml;: Karma\u015f\u0131k sorgu\r\nCREATE FUNCTION dbo.ResourceGovernorClassifier()\r\nRETURNS sysname\r\nWITH SCHEMABINDING\r\nAS\r\nBEGIN\r\n    DECLARE @tier VARCHAR(20);\r\n    \r\n    -- YAVA\u015e: Tablo sorgusu\r\n    SELECT @tier = customer_tier \r\n    FROM dbo.Customers \r\n    WHERE username = SUSER_NAME();\r\n    \r\n    RETURN @tier + '_group';\r\nEND;\r\n\r\n-- \u0130Y\u0130: Basit kontroller\r\nCREATE FUNCTION dbo.ResourceGovernorClassifier()\r\nRETURNS sysname\r\nWITH SCHEMABINDING\r\nAS\r\nBEGIN\r\n    -- H\u0131zl\u0131 string kontrolleri\r\n    IF (SUSER_NAME() LIKE '%_premium')\r\n        RETURN 'premium_group';\r\n    \r\n    IF (APP_NAME() LIKE '%Report%')\r\n        RETURN 'reporting_group';\r\n    \r\n    RETURN 'default';\r\nEND;\r\n<\/code><\/pre>\r\n<ol start=\"2\">\r\n<li><strong>Gereksiz Classifier Function Kullanmay\u0131n<\/strong><\/li>\r\n<\/ol>\r\n<pre><code class=\"language-sql\">-- E\u011fer T&Uuml;M kullan\u0131c\u0131lar ayn\u0131 gruba gidiyorsa:\r\n-- Classifier function kullanmay\u0131n, direkt default pool ayar\u0131n\u0131 de\u011fi\u015ftirin\r\n\r\nALTER RESOURCE POOL [default]\r\nWITH (MAX_CPU_PERCENT = 90);\r\n\r\nALTER RESOURCE GOVERNOR RECONFIGURE;\r\n<\/code><\/pre>\r\n<h3>CPU Affinity vs Resource Governor<\/h3>\r\n<p><strong>Performans Kar\u015f\u0131la\u015ft\u0131rmas\u0131:<\/strong><\/p>\r\n<table>\r\n<thead>\r\n<tr>\r\n<th>&Ouml;zellik<\/th>\r\n<th>CPU Affinity<\/th>\r\n<th>Resource Governor<\/th>\r\n<\/tr>\r\n<\/thead>\r\n<tbody>\r\n<tr>\r\n<td><strong>Overhead<\/strong><\/td>\r\n<td>Yok<\/td>\r\n<td>Minimal (~0.1%)<\/td>\r\n<\/tr>\r\n<tr>\r\n<td><strong>Esneklik<\/strong><\/td>\r\n<td>D&uuml;\u015f&uuml;k<\/td>\r\n<td>Y&uuml;ksek<\/td>\r\n<\/tr>\r\n<tr>\r\n<td><strong>Dinamik<\/strong><\/td>\r\n<td>Hay\u0131r<\/td>\r\n<td>Evet<\/td>\r\n<\/tr>\r\n<tr>\r\n<td><strong>Restart Gerekir<\/strong><\/td>\r\n<td>Evet<\/td>\r\n<td>Hay\u0131r<\/td>\r\n<\/tr>\r\n<tr>\r\n<td><strong>Kullan\u0131c\u0131 Bazl\u0131<\/strong><\/td>\r\n<td>Hay\u0131r<\/td>\r\n<td>Evet<\/td>\r\n<\/tr>\r\n<\/tbody>\r\n<\/table>\r\n<pre><code class=\"language-sql\">-- Benchmark: CPU Affinity\r\n-- Sadece 18 CPU kullan\r\nALTER SERVER CONFIGURATION\r\nSET PROCESS AFFINITY CPU = 0 TO 17;\r\n-- Restart gerekli\r\n\r\n-- Benchmark: Resource Governor\r\nCREATE RESOURCE POOL limited_pool\r\nWITH (MAX_CPU_PERCENT = 90);\r\n-- Restart gerektirmez, an\u0131nda etkili\r\n<\/code><\/pre>\r\n<h3>MAXDOP Optimizasyonu<\/h3>\r\n<pre><code class=\"language-sql\">-- En uygun MAXDOP de\u011ferini bulma\r\nWITH CPUStats AS (\r\n    SELECT \r\n        qs.query_hash,\r\n        COUNT(DISTINCT qs.plan_handle) AS plan_count,\r\n        AVG(qs.total_worker_time \/ qs.execution_count) AS avg_cpu_time,\r\n        MAX(qp.query_plan.value('declare namespace p=\"http:\/\/schemas.microsoft.com\/sqlserver\/2004\/07\/showplan\";\r\n                                 max(\/\/p:RelOp\/@EstimateRows)', 'FLOAT')) AS max_rows\r\n    FROM sys.dm_exec_query_stats qs\r\n    CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) qp\r\n    WHERE qs.execution_count &gt; 10\r\n    GROUP BY qs.query_hash\r\n)\r\nSELECT \r\n    CASE \r\n        WHEN avg_cpu_time &lt; 100 THEN 'MAXDOP 1 &ouml;nerilir'\r\n        WHEN avg_cpu_time &lt; 1000 THEN 'MAXDOP 2-4 &ouml;nerilir'\r\n        WHEN max_rows &lt; 10000 THEN 'MAXDOP 4 &ouml;nerilir'\r\n        ELSE 'MAXDOP 8 &ouml;nerilir'\r\n    END AS recommendation,\r\n    COUNT(*) AS query_count\r\nFROM CPUStats\r\nGROUP BY \r\n    CASE \r\n        WHEN avg_cpu_time &lt; 100 THEN 'MAXDOP 1 &ouml;nerilir'\r\n        WHEN avg_cpu_time &lt; 1000 THEN 'MAXDOP 2-4 &ouml;nerilir'\r\n        WHEN max_rows &lt; 10000 THEN 'MAXDOP 4 &ouml;nerilir'\r\n        ELSE 'MAXDOP 8 &ouml;nerilir'\r\n    END;\r\n<\/code><\/pre>\r\n<h2>Geli\u015fmi\u015f Senaryolar<\/h2>\r\n<h3>Senaryo 1: Adaptive MAXDOP<\/h3>\r\n<p>SQL Server 2019+ Automatic Plan Correction ile:<\/p>\r\n<pre><code class=\"language-sql\">-- Veritaban\u0131 seviyesinde Automatic Tuning aktifle\u015ftir\r\nALTER DATABASE CURRENT\r\nSET AUTOMATIC_TUNING (FORCE_LAST_GOOD_PLAN = ON);\r\n\r\n-- Query Store'u etkinle\u015ftir\r\nALTER DATABASE CURRENT\r\nSET QUERY_STORE = ON (\r\n    OPERATION_MODE = READ_WRITE,\r\n    MAX_STORAGE_SIZE_MB = 1024,\r\n    INTERVAL_LENGTH_MINUTES = 60\r\n);\r\n\r\n-- Regressed query'leri izle\r\nSELECT \r\n    qsq.query_id,\r\n    qsqt.query_sql_text,\r\n    qsrs.avg_duration \/ 1000 AS avg_duration_ms,\r\n    qsrs.avg_cpu_time \/ 1000 AS avg_cpu_time_ms,\r\n    rs.reason\r\nFROM sys.query_store_query qsq\r\nINNER JOIN sys.query_store_query_text qsqt\r\n    ON qsq.query_text_id = qsqt.query_text_id\r\nINNER JOIN sys.query_store_plan qsp\r\n    ON qsq.query_id = qsp.query_id\r\nINNER JOIN sys.query_store_runtime_stats qsrs\r\n    ON qsp.plan_id = qsrs.plan_id\r\nLEFT JOIN sys.dm_db_tuning_recommendations rs\r\n    ON qsq.query_id = rs.details.value('(\/state\/query\/@id)[1]', 'INT')\r\nWHERE rs.reason = 'CPUThresholdExceeded'\r\nORDER BY qsrs.avg_cpu_time DESC;\r\n<\/code><\/pre>\r\n<h3>Senaryo 2: Multi-Instance Sunucularda CPU Payla\u015f\u0131m\u0131<\/h3>\r\n<p>Ayn\u0131 sunucuda birden fazla SQL Server instance &ccedil;al\u0131\u015f\u0131yorsa:<\/p>\r\n<pre><code class=\"language-sql\">-- Instance 1 (Production): CPU 0-11 (12 core)\r\nALTER SERVER CONFIGURATION\r\nSET PROCESS AFFINITY CPU = 0 TO 11;\r\n\r\n-- Instance 2 (Reporting): CPU 12-19 (8 core)\r\n-- Di\u011fer instance'da &ccedil;al\u0131\u015ft\u0131r:\r\nALTER SERVER CONFIGURATION\r\nSET PROCESS AFFINITY CPU = 12 TO 19;\r\n<\/code><\/pre>\r\n<p><strong>Windows Process Priority ile:<\/strong><\/p>\r\n<pre><code class=\"language-powershell\"># Production instance: Normal priority\r\nGet-Process -Name \"sqlservr\" | \r\nWhere-Object {$_.Path -like \"*MSSQLSERVER*\"} | \r\nForEach-Object {$_.PriorityClass = \"Normal\"}\r\n\r\n# Reporting instance: Below Normal priority\r\nGet-Process -Name \"sqlservr\" | \r\nWhere-Object {$_.Path -like \"*REPORTING*\"} | \r\nForEach-Object {$_.PriorityClass = \"BelowNormal\"}\r\n<\/code><\/pre>\r\n<h3>Senaryo 3: Container\/Kubernetes Ortam\u0131nda SQL Server<\/h3>\r\n<p>Docker veya Kubernetes'te SQL Server &ccedil;al\u0131\u015ft\u0131r\u0131rken:<\/p>\r\n<p><strong>Dockerfile:<\/strong><\/p>\r\n<pre><code class=\"language-dockerfile\">FROM mcr.microsoft.com\/mssql\/server:2019-latest\r\n\r\n# CPU limitlerini environment variable olarak ayarla\r\nENV MSSQL_ENABLE_HADR=0\r\nENV MSSQL_CPU_LIMIT=8\r\nENV ACCEPT_EULA=Y\r\nENV SA_PASSWORD=YourStrong@Passw0rd\r\n\r\n# SQL Server ba\u015flatma script'i\r\nCOPY .\/configure-sql.sh \/usr\/config\/\r\nRUN chmod +x \/usr\/config\/configure-sql.sh\r\n\r\nCMD \/usr\/config\/configure-sql.sh\r\n<\/code><\/pre>\r\n<p><strong>configure-sql.sh:<\/strong><\/p>\r\n<pre><code class=\"language-bash\">#!\/bin\/bash\r\n\r\n# SQL Server'\u0131 ba\u015flat\r\n\/opt\/mssql\/bin\/sqlservr &amp;\r\n\r\n# SQL Server'\u0131n ba\u015flamas\u0131n\u0131 bekle\r\nsleep 30\r\n\r\n# MAXDOP ayarla\r\n\/opt\/mssql-tools\/bin\/sqlcmd -S localhost -U sa -P $SA_PASSWORD -Q \"\r\nEXEC sp_configure 'show advanced options', 1;\r\nRECONFIGURE;\r\nEXEC sp_configure 'max degree of parallelism', $MSSQL_CPU_LIMIT;\r\nRECONFIGURE;\r\n\"\r\n\r\n# Foreground'da &ccedil;al\u0131\u015fmaya devam et\r\nwait\r\n<\/code><\/pre>\r\n<p><strong>Kubernetes Deployment:<\/strong><\/p>\r\n<pre><code class=\"language-yaml\">apiVersion: apps\/v1\r\nkind: Deployment\r\nmetadata:\r\n  name: mssql-deployment\r\nspec:\r\n  replicas: 1\r\n  template:\r\n    spec:\r\n      containers:\r\n      - name: mssql\r\n        image: mcr.microsoft.com\/mssql\/server:2019-latest\r\n        resources:\r\n          requests:\r\n            cpu: \"4\"\r\n            memory: \"8Gi\"\r\n          limits:\r\n            cpu: \"8\"      # Maksimum 8 CPU\r\n            memory: \"16Gi\"\r\n        env:\r\n        - name: ACCEPT_EULA\r\n          value: \"Y\"\r\n        - name: SA_PASSWORD\r\n          valueFrom:\r\n            secretKeyRef:\r\n              name: mssql-secret\r\n              key: SA_PASSWORD\r\n<\/code><\/pre>\r\n<h3>Senaryo 4: Azure SQL Database ve Managed Instance<\/h3>\r\n<p>Azure SQL'de CPU s\u0131n\u0131rlamas\u0131 farkl\u0131 &ccedil;al\u0131\u015f\u0131r:<\/p>\r\n<pre><code class=\"language-sql\">-- Azure SQL Database'de DTU\/vCore limitleri\r\n-- Service Tier'a g&ouml;re otomatik s\u0131n\u0131rl\u0131d\u0131r\r\n\r\n-- Mevcut limitleri g&ouml;r&uuml;nt&uuml;le\r\nSELECT \r\n    database_name,\r\n    sku,\r\n    service_objective,\r\n    elastic_pool_name,\r\n    avg_cpu_percent,\r\n    max_worker_percent\r\nFROM sys.dm_db_resource_stats\r\nORDER BY end_time DESC;\r\n\r\n-- Azure SQL Managed Instance'da\r\nSELECT \r\n    virtual_core_count,\r\n    sku_name,\r\n    storage_size_gb,\r\n    max_storage_size_gb\r\nFROM sys.server_resource_stats;\r\n\r\n-- MAXDOP ayarlama (destekleniyor)\r\nALTER DATABASE SCOPED CONFIGURATION \r\nSET MAXDOP = 8;\r\n\r\n-- CPU intensive sorgular\u0131 bulma\r\nSELECT TOP 10\r\n    query_id,\r\n    SUM(total_cpu_time_ms) \/ SUM(count_executions) AS avg_cpu_ms,\r\n    SUM(count_executions) AS execution_count\r\nFROM sys.query_store_runtime_stats_interval\r\nWHERE end_time &gt;= DATEADD(HOUR, -1, GETUTCDATE())\r\nGROUP BY query_id\r\nORDER BY avg_cpu_ms DESC;\r\n<\/code><\/pre>\r\n<h2>Monitoring Dashboard Olu\u015fturma<\/h2>\r\n<h3>Power BI ile CPU Monitoring<\/h3>\r\n<p><strong>SQL Query (Power BI Dataset):<\/strong><\/p>\r\n<pre><code class=\"language-sql\">CREATE PROCEDURE sp_GetCPUMetrics\r\nAS\r\nBEGIN\r\n    -- CPU kullan\u0131m ge&ccedil;mi\u015fi\r\n    SELECT \r\n        DATEADD(ms, -1 * (si.ms_ticks - rb.timestamp), GETDATE()) AS measurement_time,\r\n        rec.value('(.\/Record\/SchedulerMonitorEvent\/SystemHealth\/ProcessUtilization)[1]', 'int') AS sql_cpu_percent,\r\n        rec.value('(.\/Record\/SchedulerMonitorEvent\/SystemHealth\/SystemIdle)[1]', 'int') AS system_idle_percent,\r\n        100 - rec.value('(.\/Record\/SchedulerMonitorEvent\/SystemHealth\/SystemIdle)[1]', 'int') \r\n            - rec.value('(.\/Record\/SchedulerMonitorEvent\/SystemHealth\/ProcessUtilization)[1]', 'int') \r\n            AS other_process_cpu_percent\r\n    FROM (\r\n        SELECT timestamp, CONVERT(XML, record) AS rec\r\n        FROM sys.dm_os_ring_buffers\r\n        WHERE ring_buffer_type = 'RING_BUFFER_SCHEDULER_MONITOR'\r\n          AND record LIKE '%%'\r\n    ) AS rb\r\n    CROSS JOIN sys.dm_os_sys_info si\r\n    WHERE rec.value('(.\/Record\/SchedulerMonitorEvent\/SystemHealth\/ProcessUtilization)[1]', 'int') IS NOT NULL\r\n    ORDER BY measurement_time DESC;\r\n    \r\n    -- Resource Governor istatistikleri\r\n    SELECT \r\n        rp.name AS pool_name,\r\n        rp.max_cpu_percent,\r\n        rp.total_cpu_usage_ms \/ 1000.0 \/ 60 AS total_cpu_minutes,\r\n        wg.name AS workload_group_name,\r\n        wg.total_request_count,\r\n        wg.active_request_count\r\n    FROM sys.dm_resource_governor_resource_pools rp\r\n    LEFT JOIN sys.dm_resource_governor_workload_groups wg\r\n        ON rp.pool_id = wg.pool_id\r\n    WHERE rp.name &lt;&gt; 'internal';\r\n    \r\n    -- Top CPU consumers\r\n    SELECT TOP 20\r\n        SUBSTRING(st.text, (qs.statement_start_offset\/2)+1,\r\n            ((CASE qs.statement_end_offset\r\n                WHEN -1 THEN DATALENGTH(st.text)\r\n                ELSE qs.statement_end_offset\r\n            END - qs.statement_start_offset)\/2)+1) AS query_text,\r\n        qs.execution_count,\r\n        qs.total_worker_time \/ 1000 AS total_cpu_ms,\r\n        qs.total_worker_time \/ qs.execution_count \/ 1000 AS avg_cpu_ms,\r\n        qs.last_execution_time,\r\n        DB_NAME(st.dbid) AS database_name\r\n    FROM sys.dm_exec_query_stats qs\r\n    CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) st\r\n    ORDER BY qs.total_worker_time DESC;\r\nEND;\r\nGO\r\n<\/code><\/pre>\r\n<h3>Grafana Dashboard<\/h3>\r\n<p><strong>Prometheus Exporter i&ccedil;in SQL Query:<\/strong><\/p>\r\n<pre><code class=\"language-sql\">-- cpu_usage_percent\r\nSELECT \r\n    'sql_server_cpu_usage_percent' AS metric,\r\n    SQLProcessUtilization AS value,\r\n    'sql_server' AS instance\r\nFROM (\r\n    SELECT TOP 1\r\n        record.value('(.\/Record\/SchedulerMonitorEvent\/SystemHealth\/ProcessUtilization)[1]', 'int') AS SQLProcessUtilization\r\n    FROM (\r\n        SELECT CONVERT(XML, record) AS record\r\n        FROM sys.dm_os_ring_buffers\r\n        WHERE ring_buffer_type = 'RING_BUFFER_SCHEDULER_MONITOR'\r\n    ) AS x\r\n    ORDER BY record.value('(.\/Record\/@id)[1]', 'int') DESC\r\n) AS y;\r\n\r\n-- resource_pool_cpu_usage\r\nSELECT \r\n    'sql_server_resource_pool_cpu_ms' AS metric,\r\n    name AS pool_name,\r\n    total_cpu_usage_ms AS value\r\nFROM sys.dm_resource_governor_resource_pools\r\nWHERE name &lt;&gt; 'internal';\r\n<\/code><\/pre>\r\n<h3>Custom Alert System<\/h3>\r\n<pre><code class=\"language-sql\">CREATE TABLE dbo.CPUAlertLog\r\n(\r\n    AlertID INT IDENTITY PRIMARY KEY,\r\n    AlertTime DATETIME DEFAULT GETDATE(),\r\n    CPUPercent INT,\r\n    TopQuery NVARCHAR(MAX),\r\n    AlertSent BIT DEFAULT 0\r\n);\r\nGO\r\n\r\nCREATE PROCEDURE sp_MonitorAndAlert\r\nAS\r\nBEGIN\r\n    DECLARE @cpu_percent INT;\r\n    DECLARE @top_query NVARCHAR(MAX);\r\n    \r\n    -- CPU y&uuml;zdesini al\r\n    SELECT TOP 1 @cpu_percent = \r\n        record.value('(.\/Record\/SchedulerMonitorEvent\/SystemHealth\/ProcessUtilization)[1]', 'int')\r\n    FROM (\r\n        SELECT CONVERT(XML, record) AS record\r\n        FROM sys.dm_os_ring_buffers\r\n        WHERE ring_buffer_type = 'RING_BUFFER_SCHEDULER_MONITOR'\r\n    ) AS x\r\n    ORDER BY record.value('(.\/Record\/@id)[1]', 'int') DESC;\r\n    \r\n    -- E\u011fer %90'\u0131n &uuml;zerindeyse\r\n    IF @cpu_percent &gt; 90\r\n    BEGIN\r\n        -- En &ccedil;ok CPU t&uuml;keten sorguyu bul\r\n        SELECT TOP 1 @top_query = \r\n            SUBSTRING(st.text, (qs.statement_start_offset\/2)+1,\r\n                ((CASE qs.statement_end_offset\r\n                    WHEN -1 THEN DATALENGTH(st.text)\r\n                    ELSE qs.statement_end_offset\r\n                END - qs.statement_start_offset)\/2)+1)\r\n        FROM sys.dm_exec_requests r\r\n        CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) st\r\n        INNER JOIN sys.dm_exec_query_stats qs\r\n            ON r.sql_handle = qs.sql_handle\r\n        ORDER BY r.cpu_time DESC;\r\n        \r\n        -- Log'a kaydet\r\n        INSERT INTO dbo.CPUAlertLog (CPUPercent, TopQuery)\r\n        VALUES (@cpu_percent, @top_query);\r\n        \r\n        -- Email g&ouml;nder\r\n        EXEC msdb.dbo.sp_send_dbmail\r\n            @profile_name = 'DBA_Profile',\r\n            @recipients = 'dba@company.com',\r\n            @subject = 'CRITICAL: SQL Server CPU Usage &gt; 90%',\r\n            @body = @top_query,\r\n            @body_format = 'TEXT';\r\n    END\r\nEND;\r\nGO\r\n\r\n-- SQL Agent Job: Her 5 dakikada &ccedil;al\u0131\u015ft\u0131r\r\n<\/code><\/pre>\r\n<h2>G&uuml;venlik ve \u0130zinler<\/h2>\r\n<h3>Resource Governor \u0130zinleri<\/h3>\r\n<pre><code class=\"language-sql\">-- Resource Governor y&ouml;netimi i&ccedil;in gereken izinler\r\n-- ALTER SETTINGS server permission gereklidir\r\n\r\n-- Kullan\u0131c\u0131ya izin verme\r\nGRANT ALTER SETTINGS TO [DBA_User];\r\n\r\n-- Veya server role kullan\r\nALTER SERVER ROLE sysadmin ADD MEMBER [DBA_User];\r\n\r\n-- Classifier function'\u0131 test edebilmek i&ccedil;in\r\nGRANT EXECUTE ON dbo.ResourceGovernorClassifier TO [DBA_User];\r\n\r\n-- Resource Governor objelerini g&ouml;r&uuml;nt&uuml;leme\r\nGRANT VIEW SERVER STATE TO [Monitor_User];\r\n<\/code><\/pre>\r\n<h3>Audit (Denetim) Sistemi<\/h3>\r\n<pre><code class=\"language-sql\">-- Resource Governor de\u011fi\u015fikliklerini audit et\r\nCREATE SERVER AUDIT ResourceGovernorAudit\r\nTO FILE (FILEPATH = 'C:\\SQLAudit\\')\r\nWITH (ON_FAILURE = CONTINUE);\r\n\r\nCREATE SERVER AUDIT SPECIFICATION ResourceGovernorChanges\r\nFOR SERVER AUDIT ResourceGovernorAudit\r\nADD (SCHEMA_OBJECT_CHANGE_GROUP);\r\n\r\nALTER SERVER AUDIT ResourceGovernorAudit\r\nWITH (STATE = ON);\r\n\r\nALTER SERVER AUDIT SPECIFICATION ResourceGovernorChanges\r\nWITH (STATE = ON);\r\n\r\n-- Audit loglar\u0131n\u0131 sorgulama\r\nSELECT \r\n    event_time,\r\n    statement,\r\n    succeeded,\r\n    server_principal_name\r\nFROM sys.fn_get_audit_file('C:\\SQLAudit\\*', DEFAULT, DEFAULT)\r\nWHERE statement LIKE '%RESOURCE%GOVERNOR%'\r\nORDER BY event_time DESC;\r\n<\/code><\/pre>\r\n<h2>Kapasite Planlama<\/h2>\r\n<h3>CPU B&uuml;y&uuml;me Analizi<\/h3>\r\n<pre><code class=\"language-sql\">CREATE TABLE dbo.CPUUsageHistory\r\n(\r\n    MeasurementDate DATE,\r\n    AvgCPUPercent DECIMAL(5,2),\r\n    MaxCPUPercent INT,\r\n    PeakHour INT\r\n);\r\nGO\r\n\r\n-- G&uuml;nl&uuml;k CPU istatistiklerini toplama\r\nCREATE PROCEDURE sp_CollectDailyCPUStats\r\nAS\r\nBEGIN\r\n    INSERT INTO dbo.CPUUsageHistory\r\n    SELECT \r\n        CAST(GETDATE() AS DATE),\r\n        AVG(CAST(SQLProcessUtilization AS DECIMAL(5,2))),\r\n        MAX(SQLProcessUtilization),\r\n        DATEPART(HOUR, MAX(measurement_time))\r\n    FROM (\r\n        SELECT \r\n            DATEADD(ms, -1 * (si.ms_ticks - rb.timestamp), GETDATE()) AS measurement_time,\r\n            rec.value('(.\/Record\/SchedulerMonitorEvent\/SystemHealth\/ProcessUtilization)[1]', 'int') AS SQLProcessUtilization\r\n        FROM (\r\n            SELECT timestamp, CONVERT(XML, record) AS rec\r\n            FROM sys.dm_os_ring_buffers\r\n            WHERE ring_buffer_type = 'RING_BUFFER_SCHEDULER_MONITOR'\r\n        ) AS rb\r\n        CROSS JOIN sys.dm_os_sys_info si\r\n        WHERE DATEADD(ms, -1 * (si.ms_ticks - rb.timestamp), GETDATE()) &gt;= CAST(GETDATE() AS DATE)\r\n    ) AS daily_data;\r\nEND;\r\nGO\r\n\r\n-- Trend analizi\r\nSELECT \r\n    MeasurementDate,\r\n    AvgCPUPercent,\r\n    AVG(AvgCPUPercent) OVER (ORDER BY MeasurementDate ROWS BETWEEN 6 PRECEDING AND CURRENT ROW) AS moving_avg_7day,\r\n    CASE \r\n        WHEN AVG(AvgCPUPercent) OVER (ORDER BY MeasurementDate ROWS BETWEEN 6 PRECEDING AND CURRENT ROW) &gt; 70\r\n        THEN 'Upgrade Recommended'\r\n        WHEN AVG(AvgCPUPercent) OVER (ORDER BY MeasurementDate ROWS BETWEEN 6 PRECEDING AND CURRENT ROW) &gt; 85\r\n        THEN 'URGENT: Upgrade Required'\r\n        ELSE 'Normal'\r\n    END AS recommendation\r\nFROM dbo.CPUUsageHistory\r\nWHERE MeasurementDate &gt;= DATEADD(DAY, -90, GETDATE())\r\nORDER BY MeasurementDate DESC;\r\n<\/code><\/pre>\r\n<h3>CPU Sizing Hesaplama<\/h3>\r\n<pre><code class=\"language-sql\">-- Mevcut y&uuml;k i&ccedil;in ideal CPU say\u0131s\u0131 hesaplama\r\nWITH CurrentLoad AS (\r\n    SELECT \r\n        AVG(CAST(SQLProcessUtilization AS FLOAT)) AS avg_cpu,\r\n        MAX(SQLProcessUtilization) AS peak_cpu\r\n    FROM (\r\n        SELECT TOP 1000\r\n            rec.value('(.\/Record\/SchedulerMonitorEvent\/SystemHealth\/ProcessUtilization)[1]', 'int') AS SQLProcessUtilization\r\n        FROM (\r\n            SELECT CONVERT(XML, record) AS rec\r\n            FROM sys.dm_os_ring_buffers\r\n            WHERE ring_buffer_type = 'RING_BUFFER_SCHEDULER_MONITOR'\r\n        ) AS x\r\n        WHERE rec.value('(.\/Record\/SchedulerMonitorEvent\/SystemHealth\/ProcessUtilization)[1]', 'int') IS NOT NULL\r\n    ) AS cpu_data\r\n),\r\nSystemInfo AS (\r\n    SELECT cpu_count AS current_cpus\r\n    FROM sys.dm_os_sys_info\r\n)\r\nSELECT \r\n    si.current_cpus AS 'Current CPUs',\r\n    cl.avg_cpu AS 'Average CPU %',\r\n    cl.peak_cpu AS 'Peak CPU %',\r\n    CEILING((cl.avg_cpu \/ 70.0) * si.current_cpus) AS 'Recommended CPUs (70% target)',\r\n    CEILING((cl.peak_cpu \/ 85.0) * si.current_cpus) AS 'Recommended CPUs (85% peak target)',\r\n    CASE \r\n        WHEN cl.avg_cpu &gt; 70 THEN 'Consider adding ' + \r\n            CAST(CEILING((cl.avg_cpu \/ 70.0) * si.current_cpus) - si.current_cpus AS VARCHAR) + ' CPUs'\r\n&nbsp; &nbsp; &nbsp; &nbsp; ELSE 'Current capacity adequate'<br>&nbsp; &nbsp; END AS 'Recommendation'<br>FROM CurrentLoad cl, SystemInfo si;<br>\r\n<\/code><\/pre>\r\n<h2 class=\"text-xl font-bold text-text-100 mt-1 -mb-0.5\">Checklist ve &Ouml;zet<\/h2>\r\n<h3 class=\"text-lg font-bold text-text-100 mt-1 -mb-1.5\">Pre-Production Checklist<\/h3>\r\n<div class=\"relative group\/copy bg-bg-000\/50 border-0.5 border-border-400 rounded-lg\">\r\n<div class=\"sticky opacity-0 group-hover\/copy:opacity-100 top-2 py-2 h-12 w-0 float-right\">\r\n<div class=\"absolute right-0 h-8 px-2 items-center inline-flex\">\r\n<div class=\"relative\">\r\n<div class=\"flex items-center justify-center transition-all opacity-100 scale-100\">&nbsp;<\/div>\r\n<div class=\"flex items-center justify-center absolute top-0 left-0 transition-all opacity-0 scale-50\">&nbsp;<\/div>\r\n<\/div>\r\n<\/div>\r\n<\/div>\r\n<div>\r\n<pre class=\"code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed\"><code>\u2610 SQL Server Edition kontrol&uuml; yap\u0131ld\u0131\r\n\u2610 Mevcut CPU say\u0131s\u0131 belirlendi\r\n\u2610 Baseline performans metrikleri al\u0131nd\u0131\r\n\u2610 MAXDOP de\u011feri hesapland\u0131\r\n\u2610 Cost threshold ayarland\u0131\r\n\u2610 Resource Governor yap\u0131land\u0131rmas\u0131 (Enterprise'da) tamamland\u0131\r\n\u2610 CPU Affinity ayarlar\u0131 (gerekirse) yap\u0131ld\u0131\r\n\u2610 Monitoring ve alerting sistemi kuruldu\r\n\u2610 Rollback plan\u0131 haz\u0131rland\u0131\r\n\u2610 Dok&uuml;mantasyon tamamland\u0131\r\n\u2610 Test ortam\u0131nda do\u011frulama yap\u0131ld\u0131\r\n\u2610 Stakeholder'lara bilgi verildi<\/code><\/pre>\r\n<\/div>\r\n<\/div>\r\n<h3 class=\"text-lg font-bold text-text-100 mt-1 -mb-1.5\">Production Deployment Checklist<\/h3>\r\n<div class=\"relative group\/copy bg-bg-000\/50 border-0.5 border-border-400 rounded-lg\">\r\n<div class=\"sticky opacity-0 group-hover\/copy:opacity-100 top-2 py-2 h-12 w-0 float-right\">\r\n<div class=\"absolute right-0 h-8 px-2 items-center inline-flex\">\r\n<div class=\"relative\">\r\n<div class=\"flex items-center justify-center transition-all opacity-100 scale-100\">&nbsp;<\/div>\r\n<div class=\"flex items-center justify-center absolute top-0 left-0 transition-all opacity-0 scale-50\">&nbsp;<\/div>\r\n<\/div>\r\n<\/div>\r\n<\/div>\r\n<div>\r\n<pre class=\"code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed\"><code>\u2610 De\u011fi\u015fiklik penceresi (maintenance window) planland\u0131\r\n\u2610 Backup al\u0131nd\u0131\r\n\u2610 Pre-deployment test yap\u0131ld\u0131\r\n\u2610 Deployment script'leri haz\u0131rland\u0131\r\n\u2610 Rollback script'leri haz\u0131rland\u0131\r\n\u2610 Monitoring dashboards a&ccedil;\u0131k\r\n\u2610 DBA team'i haz\u0131rda\r\n\u2610 De\u011fi\u015fiklikler uyguland\u0131\r\n\u2610 SQL Server restart edildi (gerekirse)\r\n\u2610 Post-deployment testler yap\u0131ld\u0131\r\n\u2610 Monitoring data toplan\u0131yor\r\n\u2610 Stakeholder'lara bilgi verildi<\/code><\/pre>\r\n<\/div>\r\n<\/div>\r\n<h3 class=\"text-lg font-bold text-text-100 mt-1 -mb-1.5\">Post-Deployment Monitoring (\u0130lk 24 Saat)<\/h3>\r\n<div class=\"relative group\/copy bg-bg-000\/50 border-0.5 border-border-400 rounded-lg\">\r\n<div class=\"sticky opacity-0 group-hover\/copy:opacity-100 top-2 py-2 h-12 w-0 float-right\">\r\n<div class=\"absolute right-0 h-8 px-2 items-center inline-flex\">\r\n<div class=\"relative\">\r\n<div class=\"flex items-center justify-center transition-all opacity-100 scale-100\">&nbsp;<\/div>\r\n<div class=\"flex items-center justify-center absolute top-0 left-0 transition-all opacity-0 scale-50\">&nbsp;<\/div>\r\n<\/div>\r\n<\/div>\r\n<\/div>\r\n<div class=\"text-text-500 font-small p-3.5 pb-0\">sql<\/div>\r\n<div>\r\n<pre class=\"code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed\"><code class=\"language-sql\"><span class=\"token\">-- Saatlik CPU metrik raporu<\/span>\r\n<span class=\"token\">SELECT<\/span> \r\n    DATEPART<span class=\"token\">(<\/span><span class=\"token\">HOUR<\/span><span class=\"token\">,<\/span> measurement_time<span class=\"token\">)<\/span> <span class=\"token\">AS<\/span> hour_of_day<span class=\"token\">,<\/span>\r\n    <span class=\"token\">AVG<\/span><span class=\"token\">(<\/span>cpu_percent<span class=\"token\">)<\/span> <span class=\"token\">AS<\/span> avg_cpu<span class=\"token\">,<\/span>\r\n    <span class=\"token\">MAX<\/span><span class=\"token\">(<\/span>cpu_percent<span class=\"token\">)<\/span> <span class=\"token\">AS<\/span> max_cpu<span class=\"token\">,<\/span>\r\n    <span class=\"token\">MIN<\/span><span class=\"token\">(<\/span>cpu_percent<span class=\"token\">)<\/span> <span class=\"token\">AS<\/span> min_cpu<span class=\"token\">,<\/span>\r\n    <span class=\"token\">COUNT<\/span><span class=\"token\">(<\/span><span class=\"token\">*<\/span><span class=\"token\">)<\/span> <span class=\"token\">AS<\/span> sample_count\r\n<span class=\"token\">FROM<\/span> <span class=\"token\">(<\/span>\r\n    <span class=\"token\">SELECT<\/span> \r\n        DATEADD<span class=\"token\">(<\/span>ms<span class=\"token\">,<\/span> <span class=\"token\">-<\/span><span class=\"token\">1<\/span> <span class=\"token\">*<\/span> <span class=\"token\">(<\/span>si<span class=\"token\">.<\/span>ms_ticks <span class=\"token\">-<\/span> rb<span class=\"token\">.<\/span><span class=\"token\">timestamp<\/span><span class=\"token\">)<\/span><span class=\"token\">,<\/span> GETDATE<span class=\"token\">(<\/span><span class=\"token\">)<\/span><span class=\"token\">)<\/span> <span class=\"token\">AS<\/span> measurement_time<span class=\"token\">,<\/span>\r\n        rec<span class=\"token\">.<\/span><span class=\"token\">value<\/span><span class=\"token\">(<\/span><span class=\"token\">'(.\/Record\/SchedulerMonitorEvent\/SystemHealth\/ProcessUtilization)[1]'<\/span><span class=\"token\">,<\/span> <span class=\"token\">'int'<\/span><span class=\"token\">)<\/span> <span class=\"token\">AS<\/span> cpu_percent\r\n    <span class=\"token\">FROM<\/span> <span class=\"token\">(<\/span>\r\n        <span class=\"token\">SELECT<\/span> <span class=\"token\">timestamp<\/span><span class=\"token\">,<\/span> <span class=\"token\">CONVERT<\/span><span class=\"token\">(<\/span>XML<span class=\"token\">,<\/span> record<span class=\"token\">)<\/span> <span class=\"token\">AS<\/span> rec\r\n        <span class=\"token\">FROM<\/span> sys<span class=\"token\">.<\/span>dm_os_ring_buffers\r\n        <span class=\"token\">WHERE<\/span> ring_buffer_type <span class=\"token\">=<\/span> <span class=\"token\">'RING_BUFFER_SCHEDULER_MONITOR'<\/span>\r\n    <span class=\"token\">)<\/span> <span class=\"token\">AS<\/span> rb\r\n    <span class=\"token\">CROSS<\/span> <span class=\"token\">JOIN<\/span> sys<span class=\"token\">.<\/span>dm_os_sys_info si\r\n    <span class=\"token\">WHERE<\/span> DATEADD<span class=\"token\">(<\/span>ms<span class=\"token\">,<\/span> <span class=\"token\">-<\/span><span class=\"token\">1<\/span> <span class=\"token\">*<\/span> <span class=\"token\">(<\/span>si<span class=\"token\">.<\/span>ms_ticks <span class=\"token\">-<\/span> rb<span class=\"token\">.<\/span><span class=\"token\">timestamp<\/span><span class=\"token\">)<\/span><span class=\"token\">,<\/span> GETDATE<span class=\"token\">(<\/span><span class=\"token\">)<\/span><span class=\"token\">)<\/span> <span class=\"token\">&gt;=<\/span> DATEADD<span class=\"token\">(<\/span><span class=\"token\">HOUR<\/span><span class=\"token\">,<\/span> <span class=\"token\">-<\/span><span class=\"token\">24<\/span><span class=\"token\">,<\/span> GETDATE<span class=\"token\">(<\/span><span class=\"token\">)<\/span><span class=\"token\">)<\/span>\r\n<span class=\"token\">)<\/span> <span class=\"token\">AS<\/span> hourly_data\r\n<span class=\"token\">GROUP<\/span> <span class=\"token\">BY<\/span> DATEPART<span class=\"token\">(<\/span><span class=\"token\">HOUR<\/span><span class=\"token\">,<\/span> measurement_time<span class=\"token\">)<\/span>\r\n<span class=\"token\">ORDER<\/span> <span class=\"token\">BY<\/span> hour_of_day<span class=\"token\">;<\/span><\/code><\/pre>\r\n<\/div>\r\n<\/div>\r\n<h2 class=\"text-xl font-bold text-text-100 mt-1 -mb-0.5\">Sonu&ccedil;<\/h2>\r\n<p class=\"whitespace-normal break-words\">SQL Server'da CPU kullan\u0131m\u0131n\u0131 s\u0131n\u0131rlamak, sistem performans\u0131n\u0131 optimize etmek ve kaynak &ccedil;eki\u015fmelerini &ouml;nlemek i&ccedil;in kritik &ouml;neme sahiptir. Bu rehberde ele ald\u0131\u011f\u0131m\u0131z y&ouml;ntemlerin &ouml;zeti:<\/p>\r\n<h3 class=\"text-lg font-bold text-text-100 mt-1 -mb-1.5\">Edition Bazl\u0131 &Ouml;neriler<\/h3>\r\n<p class=\"whitespace-normal break-words\"><strong>Express Edition:<\/strong><\/p>\r\n<ul class=\"[&amp;:not(:last-child)_ul]:pb-1 [&amp;:not(:last-child)_ol]:pb-1 list-disc space-y-1.5 pl-7\">\r\n<li class=\"whitespace-normal break-words\">\u2705 MAXDOP<\/li>\r\n<li class=\"whitespace-normal break-words\">\u2705 Cost Threshold for Parallelism<\/li>\r\n<li class=\"whitespace-normal break-words\">\u2705 Query Hints<\/li>\r\n<li class=\"whitespace-normal break-words\">\u274c Resource Governor<\/li>\r\n<li class=\"whitespace-normal break-words\">\u274c CPU Affinity<\/li>\r\n<\/ul>\r\n<p class=\"whitespace-normal break-words\"><strong>Standard Edition:<\/strong><\/p>\r\n<ul class=\"[&amp;:not(:last-child)_ul]:pb-1 [&amp;:not(:last-child)_ol]:pb-1 list-disc space-y-1.5 pl-7\">\r\n<li class=\"whitespace-normal break-words\">\u2705 MAXDOP<\/li>\r\n<li class=\"whitespace-normal break-words\">\u2705 Cost Threshold for Parallelism<\/li>\r\n<li class=\"whitespace-normal break-words\">\u2705 CPU Affinity<\/li>\r\n<li class=\"whitespace-normal break-words\">\u2705 Worker Threads<\/li>\r\n<li class=\"whitespace-normal break-words\">\u274c Resource Governor<\/li>\r\n<\/ul>\r\n<p class=\"whitespace-normal break-words\"><strong>Enterprise\/Developer Edition:<\/strong><\/p>\r\n<ul class=\"[&amp;:not(:last-child)_ul]:pb-1 [&amp;:not(:last-child)_ol]:pb-1 list-disc space-y-1.5 pl-7\">\r\n<li class=\"whitespace-normal break-words\">\u2705 T&uuml;m &ouml;zellikler<\/li>\r\n<li class=\"whitespace-normal break-words\">\u2705 Resource Governor (&Ouml;NER\u0130LEN)<\/li>\r\n<li class=\"whitespace-normal break-words\">\u2705 CPU Affinity<\/li>\r\n<li class=\"whitespace-normal break-words\">\u2705 MAXDOP<\/li>\r\n<li class=\"whitespace-normal break-words\">\u2705 \u0130leri d&uuml;zey optimizasyonlar<\/li>\r\n<\/ul>\r\n<h3 class=\"text-lg font-bold text-text-100 mt-1 -mb-1.5\">En \u0130yi Yakla\u015f\u0131m<\/h3>\r\n<ol class=\"[&amp;:not(:last-child)_ul]:pb-1 [&amp;:not(:last-child)_ol]:pb-1 list-decimal space-y-1.5 pl-7\">\r\n<li class=\"whitespace-normal break-words\"><strong>\u0130lk olarak:<\/strong> MAXDOP ve Cost Threshold ayarlar\u0131n\u0131 optimize edin<\/li>\r\n<li class=\"whitespace-normal break-words\"><strong>Enterprise Edition'da:<\/strong> Resource Governor kullan\u0131n<\/li>\r\n<li class=\"whitespace-normal break-words\"><strong>Gerekirse:<\/strong> CPU Affinity ile fiziksel s\u0131n\u0131rlama yap\u0131n<\/li>\r\n<li class=\"whitespace-normal break-words\"><strong>Mutlaka:<\/strong> Monitoring ve alerting sistemi kurun<\/li>\r\n<li class=\"whitespace-normal break-words\"><strong>S&uuml;rekli:<\/strong> Performans metriklerini izleyin ve optimize edin<\/li>\r\n<\/ol>\r\n<h3 class=\"text-lg font-bold text-text-100 mt-1 -mb-1.5\">Son Tavsiyeler<\/h3>\r\n<ul class=\"[&amp;:not(:last-child)_ul]:pb-1 [&amp;:not(:last-child)_ol]:pb-1 list-disc space-y-1.5 pl-7\">\r\n<li class=\"whitespace-normal break-words\">Test ortam\u0131nda her zaman deneyin<\/li>\r\n<li class=\"whitespace-normal break-words\">Baseline metrikler al\u0131n<\/li>\r\n<li class=\"whitespace-normal break-words\">Rollback plan\u0131 haz\u0131rlay\u0131n<\/li>\r\n<li class=\"whitespace-normal break-words\">Dok&uuml;mante edin<\/li>\r\n<li class=\"whitespace-normal break-words\">\u0130zlemeyi ihmal etmeyin<\/li>\r\n<li class=\"whitespace-normal break-words\">D&uuml;zenli olarak g&ouml;zden ge&ccedil;irin<\/li>\r\n<\/ul>\r\n<p class=\"whitespace-normal break-words\">Bu rehber, SQL Server'da CPU y&ouml;netimi i&ccedil;in kapsaml\u0131 bir kaynak sunmaktad\u0131r. Her ortam\u0131n kendine &ouml;zg&uuml; gereksinimleri oldu\u011funu unutmay\u0131n ve yap\u0131land\u0131rmalar\u0131n\u0131z\u0131 buna g&ouml;re &ouml;zelle\u015ftirin.<\/p>","excerpt":"SQL Server sunucular\u0131nda CPU kullan\u0131m\u0131n\u0131 kontrol alt\u0131nda tutmak, sistem performans\u0131 ve kaynak y\u00f6netimi a\u00e7\u0131s\u0131ndan kritik \u00f6neme sahiptir.","created_at":"2025-09-29 22:10:00","updated_at":"2026-09-06 15:59:14","category_id":6,"view_count":554,"reading_time":34,"status":"published","editor_choice":0,"is_editor_choice":1,"published_at":"2025-09-29 22:10:00","featured_image":"resimyok.jpg","slug":"sql-serverda-cpu-kullanimini-sinirlama","category_name":"Sistem","category_slug":"sistem","category_color":"#3b82f6"}]