Bộ nhớ là một trong những tài nguyên hình thành tam giác hiệu suất — CPU và bộ nhớ là hai tài nguyên còn lại. Nếu một chiếc bị bắn trúng, hai chiếc còn lại sẽ cố gắng đưa hiệu suất đến mức có thể chấp nhận được, nhưng luôn có sự đánh đổi. Bất kỳ giao dịch nào không thể được cam kết với bộ nhớ, chúng sẽ được SQL Server chuyển tiếp đến hệ thống con đĩa. Điều này gây ra tắc nghẽn hiệu suất. Do đó, thống kê chờ có thể giúp xác định các vấn đề về hiệu suất trên SQL Server.
Trong bài viết này, các chủ đề sau được thảo luận:
- Hiểu bên trong cấu hình và cài đặt bộ nhớ SQL Server
- Bộ nhớ SQL Server và tác động của nó đối với cơ sở dữ liệu và hiệu suất ứng dụng
- Thảo luận về các thành phần SQL Server khác nhau góp phần vào việc sử dụng bộ nhớ
- Các phương pháp hay nhất và đề xuất để định kích thước bộ nhớ
- Báo cáo bộ nhớ nhiều máy chủ
- Và hơn thế nữa…
Nội bộ quản lý bộ nhớ
SQL Server có Đơn vị quản lý bộ nhớ thực hiện quản lý bộ nhớ động tự động dựa trên khối lượng công việc của hệ thống. Bộ nhớ này là không gian dễ bay hơi, rất quan trọng đối với nhu cầu Công nghệ - Kinh doanh ngày nay, việc định cỡ phù hợp là rất quan trọng đối với hiệu suất tối ưu của các ứng dụng.
Tuy nhiên, chúng ta đều biết rằng khi thiết lập máy chủ, việc định cỡ có chứa một số giá trị mặc định. trong một số trường hợp, chúng tôi sớm phát hiện ra rằng SQL Server sử dụng gần như tất cả bộ nhớ trên máy chủ, mặc dù không có hoạt động hiển thị nào trên cơ sở dữ liệu, dẫn đến câu hỏi:Các giá trị mặc định có không chính xác không? Nếu vậy, kích thước phải là bao nhiêu?
Quản lý bộ nhớ trên SQL Server hoạt động dựa trên thuật toán Fill-and-Flush. Các giá trị mặc định không hạn chế mức tiêu thụ bộ nhớ ngày càng tăng trừ khi có yêu cầu từ Hệ điều hành.
Kích thước phụ thuộc vào các thành phần khác nhau của hệ thống — trong nhiều trường hợp, đặt nó từ 70% đến 80% là một điểm khởi đầu tốt. Sau đó, bạn cũng nên theo dõi nó để xem bạn có thể thiếu những gì khác và liệu bạn có nên điều chỉnh cài đặt hay không. Nếu bạn có các dịch vụ khác trên SQL Server (bạn thực sự không nên làm như vậy), bạn có thể cần phải bỏ lại nhiều hơn, đặc biệt nếu các dịch vụ này là ổ chứa bộ nhớ. Xem xét việc truy cập lại cài đặt bộ nhớ của phiên bản SQL trong bất kỳ trường hợp nào sau đây:
- Sự không phản hồi của Hệ điều hành
- Ứng dụng cạn kiệt
- Các hoạt động sao lưu yêu cầu bộ nhớ đệm lớn
- Các đối tượng được Tối ưu hóa trong Bộ nhớ
- Các chỉ mục lưu trữ theo cột, vì chúng yêu cầu dung lượng bộ nhớ lớn để thực hiện duy trì chỉ mục.
Cài đặt bộ nhớ trên SQL Server khá đơn giản. Bạn có thể thay đổi giá trị bằng cách sử dụng sp_configure hoặc SSMS GUI. Đây là một tùy chọn trực tuyến nhưng hãy nhớ rằng việc thiết lập hoặc đặt lại các giá trị này có thể khiến một số đối tượng bộ nhớ đệm bên trong cấu trúc lại, điều này sẽ khiến hệ thống chạy chậm hơn một chút.
sp_configure ‘bộ nhớ máy chủ tối đa (MB)’,
Trong trường hợp này, số “2147483647” có nghĩa là Máy chủ SQL không có giới hạn trên và sẽ sử dụng tất cả bộ nhớ trên máy chủ.
Bộ nhớ máy chủ tối thiểu:bộ nhớ máy chủ tối thiểu như một giá trị sàn; SQL Server sẽ cam kết bộ nhớ để sử dụng riêng cho đến khi nó đạt đến cài đặt bộ nhớ máy chủ tối thiểu. Sau đó, nó sẽ duy trì ít nhất lượng bộ nhớ có thể sử dụng này.
Bộ nhớ máy chủ tối đa:Giống như cách mà bộ nhớ máy chủ tối thiểu cung cấp một tầng, bộ nhớ máy chủ tối đa cung cấp một mức trần.
Mức bộ nhớ tối thiểu và tối đa là giới hạn dưới và trên của dung lượng bộ nhớ được vùng đệm cho phép sử dụng. Vùng đệm là phần bộ nhớ lớn nhất được sử dụng bởi SQL Server. Sau đây là các thành phần SQL Server trong phiên bản SQL sử dụng bộ nhớ từ vùng đệm
- Bộ nhớ cache của Trang Cơ sở dữ liệu
- Bộ nhớ đệm trong nhật ký
- Bộ đệm thủ tục hoặc bộ đệm kế hoạch truy vấn
- Không gian khối lượng công việc truy vấn
- Khóa (Cấp bộ nhớ)
- Ngữ cảnh kết nối
- Tối ưu hoá các truy vấn
- Cấu trúc dữ liệu cấp hệ thống
Giá trị của các chỉ số quan trọng như Mbyte khả dụng, Số trang / giây, Tỷ lệ truy cập bộ nhớ đệm của bộ đệm, PLE, v.v. xác định hiệu suất của Máy chủ SQL.
Buffer Cache Hit Ratio dành riêng cho từng ứng dụng. 90% thường được coi là mong muốn. Nó có nghĩa là hơn 90% yêu cầu được phục vụ bởi bộ nhớ cache, đó là một điều tốt. Nếu giá trị thấp hơn, hãy thêm nhiều bộ nhớ hơn cho đến khi nó luôn cao hơn 90%.
Số byte khả dụng không là gì khác ngoài chỉ báo về lượng bộ nhớ có sẵn để sử dụng. Bộ đếm số trang / giây hiển thị số lượng trang được truy xuất từ đĩa hoặc được ghi vào đĩa, cả hai đều do lỗi trang cứng.
PLE là viết tắt của Page Life Expectancy, là chỉ báo cho biết trang sẽ ở trong nhóm trong bao nhiêu giây.
Ví dụ,
$server = 'hqdbt01'
$counters = @("\Memory\Available MBytes",
"\Memory\Pages/sec",
"\SQLServer:Buffer Manager\Buffer cache hit ratio",
"\SQLServer:Buffer Manager\Lazy writes/sec",
"\SQLServer:Buffer Manager\Page life expectancy"
)
$collections = Get-Counter -ComputerName $server -Counter $counters -SampleInterval 10 -MaxSamples 1
Write-Output $collections
foreach ($collection in $collections)
{$sampling = $collection.CounterSamples | Select-Object -Property TimeStamp, Path, Cookedvalue
$sampling | Format-Table -AutoSize
}
Các đề xuất và phương pháp hay nhất
Bây giờ chúng ta hãy xem xét ngắn gọn các kỹ thuật để kích thước bộ nhớ.
- 1 GB bộ nhớ dành riêng cho Hệ điều hành
- Mỗi 1 GB cho mỗi 4 GB RAM sau 4 GB ban đầu, tối đa 16 GB RAM
- 1 GB cho mỗi 8 GB trong hơn 16 GB RAM
Ví dụ:nếu bạn có Máy chủ cơ sở dữ liệu RAM 32 GB, thì bộ nhớ được cấp cho Hệ điều hành sẽ là
- 1 GB, mức phân bổ tối thiểu
- + 3 GB, kể từ 16 GB - 4 GB =12 GB; 12 GB chia cho 4 GB (mỗi 4 GB được 1 GB) là 3 GB.
- + 2 GB, là 32 GB - 16 GB =16 GB; 16 chia cho 8 (mỗi 8 GB sau 16 GB được 1 GB) là 2 GB
Vì vậy, tổng cộng, đối với một máy chủ có 32 GB RAM, 7 GB sẽ được dành riêng cho Hệ điều hành. Đây là bộ nhớ tối đa được cấp cho SQL Server phải là 25 GB. Tương tự, đối với Máy chủ 64 GB, 10 GB nên được dành riêng cho Hệ điều hành và 54 GB nên được phân bổ cho Máy chủ SQL.
Tất cả chúng ta, ở một số thời điểm hay cách khác, đã nghe nói đến hoặc sử dụng Công cụ quản lý Windows (WMI). Có một số lớp trong WMI, cho phép chúng tôi trích xuất thông tin về phần cứng, phần mềm đã cài đặt, hệ điều hành hoặc thậm chí cả sổ đăng ký. Chúng tôi thậm chí có thể sửa đổi cài đặt và thực hiện các hành động trên các khía cạnh này.
Lớp win32_OperatingSystem là lớp WMI có tất cả thông tin cần thiết về hoạt động hệ điều hành (trong trường hợp bạn là, chẳng hạn, khởi động kép). Lớp này cũng có thể được sử dụng để lấy dung lượng bộ nhớ được cấp cho hệ điều hành. Dưới đây là một số đối tượng mà lớp có thể trả về, có thể giúp ích cho chúng ta (bộ nhớ được đo bằng kilobyte bởi lớp này):
- TotalVosystemMemorySize :Trường này hiển thị tổng bộ nhớ vật lý có thể truy cập vào hệ điều hành. Phần bộ nhớ không thể truy cập được có thể khiến một số nhỏ hơn số lượng cài đặt hiển thị ở đây.
- FreePhysicalMemory :Điều này cho chúng ta biết lượng bộ nhớ vật lý còn trống.
- TotalVirtualMemorySize :Đây là tổng bộ nhớ ảo có sẵn cho HĐH sử dụng. Điều này bao gồm bộ nhớ vật lý được cài đặt trên máy tính cùng với kích thước của tệp trang.
- FreeVirtualMemory :Tương tự như FreePhysicalMemory, nhưng bao gồm cả dung lượng trống trong bộ nhớ phân trang.
$server='hqdbt01'
Get-WmiObject -Class Win32_OperatingSystem -ComputerName $server | select CSName,
@{name="TotalVirtualMemorySize";expression={($_.TotalVirtualMemorySize/1024).tostring("N0")}},
@{name="TotalVisibleMemorySize";expression={($_.TotalVisibleMemorySize/1024).tostring("N0")}},
@{name="FreePhysicalMemory";expression={($_.FreePhysicalMemory/1024).tostring("N0")}},
@{name="FreeVirtualMemory";expression={($_.FreeVirtualMemory/1024).tostring("N0")}},
@{name="FreeSpaceInPagingFiles";expression={($_.FreeSpaceInPagingFiles/1024).tostring("N0")}},
NumberofProcesses,
NumberOfUsers
Chúng tôi có thể tìm nạp thông tin tệp trang bằng cách sử dụng lớp WMI Win32_PageFileSetting.
$server='hqdbt01'
Get-WMIObject Win32_PageFileSetting -Computer $server| select @{name="ServerName";expression={$_.__Server}}, Name, InitialSize, MaximumSize
Truy vấn sau cung cấp chi tiết sử dụng bộ nhớ cấp cao của phiên bản SQL.
SELECT
physical_memory_in_use_kb/1024 Physical_memory_in_use_MB,
large_page_allocations_kb/1024 Large_page_allocations_MB,
locked_page_allocations_kb/1024 Locked_page_allocations_MB,
virtual_address_space_reserved_kb/1024 VAS_reserved_MB,
virtual_address_space_committed_kb/1024 VAS_committed_MB,
virtual_address_space_available_kb/1024 VAS_available_MB,
page_fault_count Page_fault_count,
memory_utilization_percentage Memory_utilization_percentage,
process_physical_memory_low Process_physical_memory_low,
process_virtual_memory_low Process_virtual_memory_low
FROM sys.dm_os_process_memory;
Chuẩn bị kịch bản
Hãy tích hợp ba đầu ra nói trên vào một đầu ra bộ nhớ duy nhất:
- Cấu trúc bộ nhớ trong SQL sử dụng bộ đếm
- Bộ nhớ vật lý và ảo có sẵn sử dụng đối tượng WMI
- Cài đặt tệp trang bằng WMI
Chuẩn bị nội dung HTML là tất cả về việc điền giá trị được cung cấp từ phần khác nhau của tập lệnh, giữa các thẻ bên phải.
Tập lệnh có thể tạo các thẻ HTML hợp lệ. Sau đây là các hàm được sử dụng trong script.
- writeHTMLHeader:chức năng này được sử dụng để tạo Tiêu đề và xác định kiểu cho tệp HTML.
- wrietableFooter:điều này xác định các thẻ HTML đóng.
- writeTableHeader:điều này xác định tiêu đề đầu ra gồm mười ba cột cho tệp HTML
- writeMemoryInfo:đây là hàm thực hiện việc hợp nhất hai đầu ra của lớp WMI. Đầu ra của Win32_PageFileSetting, Win32_OperatingSystem và SMO SQL được chuyển làm đối số cho hàm này. Các giá trị cũng có thể được chuyển đổi hoặc thao tác thêm trong phần này.
- Phần email
[expand title =”Mã”]
# First, let’s create a text file, where we will later save memory details $MailServer='mail01.example.com' $MemoryFileName = "f:\PowerSQL\Memory.htm" New-Item -ItemType file $MemoryFileName -Force # Function to write the HTML Header to the file Function writeHtmlHeader { param($fileName) $date = ( get-date ).ToString('yyyy/MM/dd') Add-Content $fileName "<html>" Add-Content $fileName "<head>" Add-Content $fileName "<meta http-equiv='Content-Type' content='text/html; charset=iso-8859-1'>" Add-Content $fileName '<title>SQLShack Memory Usage Report </title>' add-content $fileName '<STYLE TYPE="text/css">' add-content $fileName "<!--" add-content $fileName "td {" add-content $fileName "font-family: Tahoma;" add-content $fileName "font-size: 11px;" add-content $fileName "border-top: 1px solid #999999;" add-content $fileName "border-right: 1px solid #999999;" add-content $fileName "border-bottom: 1px solid #999999;" add-content $fileName "border-left: 1px solid #999999;" add-content $fileName "padding-top: 0px;" add-content $fileName "padding-right: 0px;" add-content $fileName "padding-bottom: 0px;" add-content $fileName "padding-left: 0px;" add-content $fileName "}" add-content $fileName "body {" add-content $fileName "margin-left: 5px;" add-content $fileName "margin-top: 5px;" add-content $fileName "margin-right: 0px;" add-content $fileName "margin-bottom: 10px;" add-content $fileName "" add-content $fileName "table {" add-content $fileName "border: thin solid #000000;" add-content $fileName "}" add-content $fileName "-->" add-content $fileName "</style>" Add-Content $fileName "</head>" Add-Content $fileName "<body>" add-content $fileName "<table width='100%'>" add-content $fileName "<tr bgcolor='#CCCCCC'>" add-content $fileName "<td colspan='13' height='25' align='center'>" add-content $fileName "<font face='tahoma' color='#003399' size='4'><strong>SQLShack Memory Usage Report - $date</strong></font>" add-content $fileName "</td>" add-content $fileName "</tr>" add-content $fileName "</table>" } # Function to write the HTML Header to the file Function writeTableHeader { param($fileName) Add-Content $fileName "<tr bgcolor=#CCCCCC>" Add-Content $fileName "<td width='10%' align='center'>ServerName</td>" Add-Content $fileName "<td width='10%' align='center'>TotalVirtualMemorySize</td>" Add-Content $fileName "<td width='10%' align='center'>TotalVisibleMemorySize</td>" Add-Content $fileName "<td width='10%' align='center'>FreePhysicalMemory</td>" Add-Content $fileName "<td width='10%' align='center'>FreeVirtualMemory</td>" Add-Content $fileName "<td width='10%' align='center'>FreeSpaceInPagingFiles</td>" Add-Content $fileName "<td width='10%' align='center'>NumberofProcesses</td>" Add-Content $fileName "<td width='10%' align='center'>NumberOfUsers</td>" Add-Content $fileName "<td width='10%' align='center'>PageFile</td>" Add-Content $fileName "<td width='10%' align='center'>Page-InitialSize</td>" Add-Content $fileName "<td width='10%' align='center'>Page-MaxSize</td>" Add-Content $fileName "<td width='10%' align='center'>SQLMaxMemory</td>" Add-Content $fileName "<td width='10%' align='center'>SQLMinMemory</td>" Add-Content $fileName "<td width='10%' align='center'>Memory Available MBytes</td>" Add-Content $fileName "<td width='10%' align='center'>Buffer Cache Hit Ratio</td>" Add-Content $fileName "<td width='10%' align='center'>PLE</td>" Add-Content $fileName "</tr>" } Function writeHtmlFooter { param($fileName) Add-Content $fileName "</body>" Add-Content $fileName "</html>" } Function writeMemoryInfo { param($filename,$csname,$TotalVirtualMemorySize,$TotalVisibleMemorySize,$FreePhysicalMemory,$FreeVirtualMemory,$FreeSpaceInPagingFiles,$NumberofProcesses,$NumberOfUsers,$PageFile,$initialSize,$MaxSize,$SQLMaxMemory, $SQLMinMemory ,$mAvailableMBytes, $Buffercachehitratio, $PLE ) Add-Content $fileName "<tr>" Add-Content $fileName "<td>$csname </td>" Add-Content $fileName "<td>$TotalVirtualMemorySize </td>" Add-Content $fileName "<td>$TotalVisibleMemorySize</td>" Add-Content $fileName "<td>$FreePhysicalMemory </td>" Add-Content $fileName "<td>$FreeVirtualMemory </td>" Add-Content $fileName "<td>$FreeSpaceInPagingFiles </td>" Add-Content $fileName "<td>$NumberofProcesses </td>" Add-Content $fileName "<td>$NumberOfUsers</td>" Add-Content $fileName "<td>$PageFile</td>" Add-Content $fileName "<td>$initialSize</td>" Add-Content $fileName "<td>$MaxSize</td>" Add-Content $fileName "<td>$SQLMaxMemory</td>" Add-Content $fileName "<td>$SQLMinMemory</td>" Add-Content $fileName "<td>$mAvailableMBytes</td>" Add-Content $fileName "<td>$Buffercachehitratio</td>" Add-Content $fileName "<td>$PLE</td>" Add-Content $fileName "</tr>" } Function sendEmail { param($from,$to,$subject,$smtphost,$htmlFileName) $body = Get-Content $htmlFileName $body = New-Object System.Net.Mail.MailMessage $from, $to, $subject, $body $body.isBodyhtml = $true $smtpServer = $MailServer $smtp = new-object Net.Mail.SmtpClient($smtpServer) $smtp.Send($body) } writeHtmlHeader $MemoryFileName Add-Content $MemoryFileName "<table width='100%'><tbody>" Add-Content $MemoryFileName "<tr bgcolor='#CCCCCC'>" Add-Content $MemoryFileName "<td width='100%' align='center' colSpan=16><font face='tahoma' color='#003399' size='2'><strong> Memory Usage Details</strong></font></td>" Add-Content $MemoryFileName "</tr>" writeTableHeader $MemoryFileName foreach ($svr in get-content "\\hqdbsp18\f$\PowerSQL\Server.txt"){ $page=Get-WMIObject Win32_PageFileSetting -Computer $svr| select __Server, Name, InitialSize, MaximumSize $dp = Get-WmiObject -Class Win32_OperatingSystem -ComputerName $svr | select CSName, @{name="TotalVirtualMemorySize";expression={($_.TotalVirtualMemorySize/1024).tostring("N0")}}, @{name="TotalVisibleMemorySize";expression={($_.TotalVisibleMemorySize/1024).tostring("N0")}}, @{name="FreePhysicalMemory";expression={($_.FreePhysicalMemory/1024).tostring("N0")}}, @{name="FreeVirtualMemory";expression={($_.FreeVirtualMemory/1024).tostring("N0")}}, @{name="FreeSpaceInPagingFiles";expression={($_.FreeSpaceInPagingFiles/1024).tostring("N0")}}, NumberofProcesses, NumberOfUsers $srv = new-object ('Microsoft.SqlServer.Management.Smo.Server') ($svr) write-host $srv.Configuration.MaxServerMemory.RunValue write-host $srv.Configuration.MinServerMemory.RunValue $counters = @("\Memory\Available MBytes", "\Memory\Pages/sec", "\SQLServer:Buffer Manager\Buffer cache hit ratio", "\SQLServer:Buffer Manager\Lazy writes/sec", "\SQLServer:Buffer Manager\Page life expectancy" ) $collections = Get-Counter -ComputerName $svr -Counter $counters -SampleInterval 5 -MaxSamples 1 Write-Output $collections foreach ($collection in $collections) { $sampling = $collection.CounterSamples | Select-Object -Property TimeStamp, Path, Cookedvalue foreach($sam in $sampling) { if ($sam.Path -like "*\Memory\Available MBytes*") { $mAvailableMBytes=$sam.CookedValue } elseif ($sam.Path -like "*Buffer Manager\Buffer cache hit ratio*") { $Buffercachehitratio=$sam.CookedValue } elseif ($sam.Path -like "*Page life expectancy*") { $PLE=$sam.CookedValue} } } write-host $mAvailableMBytes $Buffercachehitratio $PLE Write-Host $dp.csname $dp.TotalVirtualMemorySize $dp.TotalVisibleMemorySize $dp.FreePhysicalMemory $dp.FreeVirtualMemory $dp.FreeSpaceInPagingFiles $dp.NumberofProcesses $dp.NumberOfUsers $page.InitialSize $page.Name $page.MaximumSize $srv.Configuration.MaxServerMemory.RunValue $srv.Configuration.MinServerMemory.RunValue $mAvailableMBytes $Buffercachehitratio $PLE writeMemoryInfo $MemoryFileName $dp.csname $dp.TotalVirtualMemorySize $dp.TotalVisibleMemorySize $dp.FreePhysicalMemory $dp.FreeVirtualMemory $dp.FreeSpaceInPagingFiles $dp.NumberofProcesses $dp.NumberOfUsers $page.Name $page.InitialSize $page.MaximumSize $srv.Configuration.MaxServerMemory.RunValue $srv.Configuration.MinServerMemory.RunValue $mAvailableMBytes $Buffercachehitratio $PLE } Add-Content $MemoryFileName "</table>" writeHtmlFooter $MemoryFileName $date = ( get-date ).ToString('yyyy/MM/dd') sendEmail [email protected] [email protected] "Memory Usage Report - $Date" $MailServer $MemoryFileName
[/ mở rộng]
Đầu ra
Kết thúc
Bây giờ bạn đã học được một số điều mới về quản lý bộ nhớ SQL Server, bạn sẽ hiểu rõ hơn về các tài nguyên của SQL Server.
Nếu có đủ RAM trên máy chủ, các trang dữ liệu có thể có tuổi thọ lâu hơn trong vùng đệm, do đó dẫn đến giảm đáng kể nhu cầu I / O.
Mặc dù trong hầu hết các trường hợp, Quản trị viên cơ sở dữ liệu dựa vào cài đặt bộ nhớ mặc định, chúng ta cần hiểu rằng yêu cầu bộ nhớ bên trong phụ thuộc vào khối lượng công việc của phiên bản.
Bài viết này là hướng dẫn cấp cao về bộ nhớ SQL Server và bộ nhớ bên trong của nó. Ngoài ra, nó bao gồm các lý do khác nhau đằng sau sự tắc nghẽn hiệu suất do không thiết lập bộ nhớ tối đa.
Tôi đã bao gồm hướng dẫn từng bước để thiết lập và định cấu hình báo cáo bộ nhớ. Các bước về cách đặt bộ nhớ SQL cũng được bao gồm. Hơn nữa, chúng tôi đã thảo luận về các thành phần SQL khác nhau góp phần vào việc sử dụng bộ nhớ khả dụng trên môi trường SQL Server.
Một điểm cần nhớ là việc phân bổ và khử phân bổ bộ nhớ sẽ làm chậm quá trình khởi động. Do đó, nếu bạn có một số ứng dụng dừng và khởi động trên cùng một máy chủ, nó có thể ảnh hưởng đến hiệu suất. Tương tự, nếu có một số ứng dụng khác đang chạy trên cùng một máy chủ, việc đặt bộ nhớ máy chủ tối thiểu và bộ nhớ máy chủ tối đa trở nên quan trọng hơn để đảm bảo hiệu suất tối ưu.
Đó là tất cả bây giờ…
Tài liệu tham khảo
- Giám sát việc sử dụng bộ nhớ
- Tầm quan trọng của việc đặt Bộ nhớ máy chủ tối đa trong SQL Server và cách đặt nó
- Tùy chọn cấu hình máy chủ bộ nhớ máy chủ