목차
SQLSERVER 数据库性能的基本
데이터 베이스 MySQL 튜토리얼 SQLSERVER 数据库性能的的基本

SQLSERVER 数据库性能的的基本

Jun 07, 2016 pm 03:20 PM
sqlserver 기초적인 성능 데이터 베이스

SQLSERVER 数据库性能的基本 很久没有写文章了,在系统正式上线之前,DBA一般都要测试一下服务器的性能 比如你有很多的服务器,有些做web服务器,有些做缓存服务器,有些做文件服务器,有些做数据库服务器 做数据库服务器的那台服务器性能要相对较好,磁盘,

SQLSERVER 数据库性能的基本

很久没有写文章了,在系统正式上线之前,DBA一般都要测试一下服务器的性能

比如你有很多的服务器,有些做web服务器,有些做缓存服务器,有些做文件服务器,有些做数据库服务器

做数据库服务器的那台服务器性能要相对较好,磁盘,内存,CPU等等,

那么在选用其中某一台服务器作为数据库服务器之前需要测试每一台服务器的性能

并且需要设置一些硬件的参数,例如设置磁盘控制器的参数,参考文章:Writeback和Writethrough区别

SQLSERVER 数据库性能的的基本

那么具体怎麽测试呢?怎麽得出测试指标呢?

大家可以参考这篇文章:SQL Server Database Engine Performance Tuning Basics


正文

随着市场份额的SQL Server的发展随着时间的推移,有越来越多的对SQL服务器性能调优的需求。

有不同的团队和个人采用各种各样的方法提高SQLSERVER服务器的性能,

而且我认为这些记录SQLSERVER troubleshooting 的基本步骤和提高各种程序性能的文档对SQLSERVER社区是有意义的

 

磁盘

为了SQLSERVER能有效运行,监控和优化SQLSERVER的磁盘子系统是一个重要的方面

我们需要非常明确磁盘的性能需求

Avg. Disk Sec/Read 这个计数器是指每秒从磁盘读取数据的平均值

下面的列表显示这个计数器值的范围,并指出这个计数器所处范围的意思

少于 10 ms - 非常好
在 10 - 20 ms 之间- 还可以
在 20 - 50 ms 之间- 慢,需要关注
大于 50 ms –严重的 I/O 瓶颈

 

磁盘性能测试工具

(1)CrystalDiskMark

(2)HDTUNE 硬盘检测修复工具 

(3)ATTO Disk Benchmark 

 

 

 

辨别I/O瓶颈

PhysicalDisk Object:Avg. Disk Queue:所选物理磁盘在取样期间被排队的磁盘读写请求平均值

如果你的磁盘队列长度经常超出SQLSERVER磁盘使用峰值的2倍,那意味着可能有I/O瓶颈了

 

Avg. Disk Sec/Read:每秒从磁盘读取数据的平均值 

Avg. Disk Sec/Write:写入数据到磁盘的平均时间,Avg. Disk Sec/Read参考指标

Physical Disk:%Disk Time磁盘时间是所选磁盘驱动器繁忙处理读写请求时所花时间的百分比,一个指标就是如果这个值大于50%,那么就存在I/O瓶颈

Avg. Disk Reads/Sec:在磁盘上的读操作的比率。确保这个数字小于磁盘吞吐量的85%。当这个值超过85%磁盘访问时间会以指数式增长

Avg. Disk Writes/Sec c:在磁盘上的写操作的比率。确保这个数字小于磁盘吞吐量的85%。当这个值超过85%磁盘访问时间会以指数式增长

 

对于更多的信息,可以参考“如何创建性能计数器集”:http://technet.microsoft.com/en-us/library/cc722148.aspx

 

磁盘驱动器的位置

为了不同的目的,你需要使用不同的驱动器来存放下面的东西
独立的磁盘延时需求:
数据库大于15ms

事务日志大于2ms

Tempdb数据库大于2ms

 

磁盘速度的优先级
SQLSERVER 数据库性能的的基本

意思是说,Tempdb放在单独的物理磁盘,事务日志文件放在单独的物理磁盘,数据文件放在单独的物理磁盘,操作系统放在单独的物理磁盘,

数据库备份文件放在单独的物理磁盘

 

一般我们的做法:不可能有那么多单独的物理磁盘,一般就是做了磁盘阵列的存储

C盘放操作系统文件

D盘放数据文件和事务日志文件 和Tempdb数据文件和Tempdb日志文件

E盘放数据库备份文件

 

当格式化磁盘的时候,对于要存放SQLSERVER数据文件和日志文件的磁盘,尽量不要使用默认的磁盘分配单元

SQLSERVER 数据库性能的的基本


使用64k 簇大小 Allocation Unit 来格式化磁盘,至于为什麽大家可以看一下这篇文章:如何用Procmon.exe来监视SQLSERVER的logwrite大小

SQLSERVER 数据库性能的的基本

 


杀毒软件

杀毒软件会对SQLSERVER的一些功能产生问题,使用杀毒软件的排除功能将数据库的文件排除在扫描的范围外是很重要的(放入杀软的扫描例外里)

下面的文件类型是需要排除在外的

*.mdf, *.ndf, *.ldf, *.bak

杀毒软件导致YourSQLDba备份失败

文章中说到因为杀毒软件扫描备份文件夹并锁住了备份文件夹,导致SQLSERVER备份数据库失败

 


内存

总是给分配最大的内存给SQLSERVER实例在服务器属性那里设置

SQLSERVER 数据库性能的的基本


注意:最大内存设置只对SQLSERVER的buffer cache部分有效,不包括SQLSERVER的一些需要内存的功能,例如复制

(SQLSERVER2012的最大内存设置已经可以限制buffer cache部分和非buffer cache部分的内存)

 

为了指明Non-Buffer Pool 的内存占用,使用下面的说明

SQL Server’s buffer pool外的内存需求(这个需求不是说你设置了SQLSERVER最大内存之后,所剩下的内存的需求,不管你有没有设置SQLSERVER的最大内存

下面几项都是服务器固定需要消耗的内存,而无论你的服务器内存是4G,8G还是16G,下面几项都会固定占用服务器的内存)

(1)操作系统需要占用2GB内存,如果是64位操作系统,操作系统占用内存不大于3GB

(2)SQLSERVER工作线程的倍数,你可以在SQLSERVER服务器属性里设置最大工作线程,

每个线程会使用0.5MB内存(X86服务器)

每个线程会使用2MB内存(X64服务器)

每个线程会使用4MB内存(Itanium服务器)

注意:0.5MB内存存放的是线程自身的数据结构和相关信息,不包括数据

为什么各种服务器所分配的线程内存不一样,这个是操作系统分配的,SQLSERVER并没有做特别的设置!

如果你设置最大的工作线程数为10个,服务器是X86,刚好服务器用尽了10个线程,那么占用的内存是10*0.5MB=5MB内存

(3)1GB的 multi-page 内存占用,链接服务器和其他SQLSERVER外围的程序占用

(4)运行在服务器上的程序可能占用1~3GB内存,例如备份程序

例子

 例如,一个8核服务器,16GB内存,运行着SQLSERVER2012 X64,上面运行着第三方的备份程序,你可以参照下面的清单

 (1)3GB 给 Windows (2GB for 32 Bit Windows)

 (2)1GB 给 SQLSERVER 工作线程 (576 × 2MB 大概)

 

各种CPU和SQLSERVER版本组合自动配置的最大工作线程数
CPU数       32位计算机      64位计算机
8                 288               576
16               352                704
32               480                960

(3)1GB for MPAs, etc. (multi-page apply)

(4)1~2 GB 给 备份程序.

 

您能够找到更多信息关于“最大工作线程选项”http://technet.microsoft.com/en-us/library/ms187024(v=sql.105).aspx

(For SQL Server 2008).

 

开启Lock Pages in Memory 选项

Windows组策略决定哪个Windows账户能使进程将他的数据逗留在物理内存里,防止操作系统把程序数据从物理内存换页换出磁盘上的虚拟内存
SQLSERVER 数据库性能的的基本

这能够给您带来性能上的提升,特别遇到内存压力的时候


TempDB 数据库的优化

默认,Tempdb数据库只有一个数据文件和事务日志文件。然而,为了性能的优化,跟着下面给出的建议最佳实践

 

TempDB数据库的存储计划

(1)设置Tempdb数据库的恢复模式为简单(默认就是简单的),简单模式能够自动回收日志空间使日志空间的需求保持最小

(2)不要让Tempdb的数据文件自动增长,这可以减少管理动态文件增长的CPU开销

 对于Tempdb数据库,可以分开多个数据文件(总的Tempdb数据库数据文件的数量=CPU逻辑处理器的数量,比如8核服务器可以分8个数据文件)

每个数据文件的大小要一样

(3)尝试将这些数据文件存放在不同的磁盘驱动器上以利用并行I/O

(4)TempDB 数据文件和 日志文件应该存放在较快速度的磁盘上(如果可能推荐放在做了RAID 1的磁盘上)

(5)使用RAID-10 或者 SSD 磁盘

(6)预先定义好Tempdb数据库的文件大小

(7)设置Tempdb总的大小为当前数据库实例中最大的那个数据库的25% 

(8)设置Tempdb数据文件自动增长的固定大小小于200MB

(9)你应该设置Tempdb数据库的数据文件数量跟逻辑CPU的数量一致,最多不超过8个数据文件



CPU的优化

设置最大并行度(Max Degree of Parallelism)

定义多少个逻辑CPU能并行执行查询

SQLSERVER 数据库性能的的基本

 

很多微软的产品,例如SharePoint 和 Dynamics CRM都把这个设置设置为1,这个是推荐的设置


对于 SharePoint  的LOB 应用程序,当你看到有很多CXPACKETS 的等待类型在你的SQLSERVER服务器里,

你应该考虑一下将这个设置(Max Degree of Parallelism)设置为1

 


索引填充因子

如果你的SQLSERVER服务器有非常高的事务量TPS (transaction per second)

你的索引有比较高碎片级别,考虑一下将填充因子设置为“80%”

并且使用下面的SQL语句检测一下索引碎片

<span>SELECT</span>  <span>DB_NAME</span>(ps.database_id) <span>AS</span> <span>'</span><span>Database Name</span><span>'</span><span> ,
        </span><span>OBJECT_NAME</span>(ps.<span>OBJECT_ID</span>) <span>AS</span> <span>'</span><span>Database Object</span><span>'</span><span> ,
        ps.index_id ,
        b.name ,
        ps.avg_fragmentation_in_percent
</span><span>FROM</span>    sys.dm_db_index_physical_stats(<span>DB_ID</span>(), <span>NULL</span>, <span>NULL</span>, <span>NULL</span>, <span>NULL</span>) <span>AS</span><span> ps
        </span><span>INNER</span> <span>JOIN</span> sys.indexes <span>AS</span> b <span>ON</span> ps.<span>OBJECT_ID</span> <span>=</span> b.<span>OBJECT_ID</span>
                                       <span>AND</span> ps.index_id <span>=</span><span> b.index_id
</span><span>WHERE</span>   ps.database_id <span>=</span> <span>DB_ID</span>(<span>'</span><span>ReportServerTempDB</span><span>'</span><span>)
</span><span>ORDER</span> <span>BY</span> ps.avg_fragmentation_in_percent <span>DESC</span>
<span>GO</span>
 
로그인 후 복사

SQLSERVER 数据库性能的的基本

 


使用Performance Monitor (Perfmon.exe)来监控系统性能

为了捕获SQLSERVER特定的性能指标,你需要使用下面的计数器

Processor: % Processor Time  :平均应该低于75% (最好低于50%)   

System: Processor Queue Length:平均每个逻辑CPU应该低于2,例如在一个2逻辑CPU的机器上,他应该保持在4

Memory—Pages/sec:平均应该低于20(最好低于15%)

Memory—Available Bytes :可用内存应该保持在50MB以上

Physical Disk—% Disk Time:
Physical Disk—Avg. Disk Queue Length :每个磁盘平均应该低于2,例如:一个RAID5磁盘,这个指标应该平均低于10

Physical Disk—Avg. Disk Reads/sec :取决于CPU和磁盘的大小,应该低于相对应磁盘的吞吐量的85%

Network Interface—Bytes Total/sec :用于统计网络带宽方


SQL Server: Buffer Manager—Page Life Expectancy:用于统计内存,应该保持在300秒
SQL Server: 一般统计用户的连接数 来估计大概使用的内存
SQL Server: Databases— Transactions/sec :每秒的事务数
SQL Server: Databases—Data File(s) Size KB:用于统计数据库数据文件的大小,衡量磁盘子系统的性能
SQL Server: Databases—Percent Log :衡量磁盘子系统的性能

如有不对的地方,欢迎大家拍砖o(∩_∩)o 

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

다양한 Java 프레임워크의 성능 비교 다양한 Java 프레임워크의 성능 비교 Jun 05, 2024 pm 07:14 PM

다양한 Java 프레임워크의 성능 비교: REST API 요청 처리: Vert.x가 최고이며 요청 속도는 SpringBoot의 2배, Dropwizard의 3배입니다. 데이터베이스 쿼리: SpringBoot의 HibernateORM은 Vert.x 및 Dropwizard의 ORM보다 우수합니다. 캐싱 작업: Vert.x의 Hazelcast 클라이언트는 SpringBoot 및 Dropwizard의 캐싱 메커니즘보다 우수합니다. 적합한 프레임워크: 애플리케이션 요구 사항에 따라 선택하세요. Vert.x는 고성능 웹 서비스에 적합하고, SpringBoot는 데이터 집약적 애플리케이션에 적합하며, Dropwizard는 마이크로서비스 아키텍처에 적합합니다.

iOS 18에는 손실되거나 손상된 사진을 검색할 수 있는 새로운 '복구된' 앨범 기능이 추가되었습니다. iOS 18에는 손실되거나 손상된 사진을 검색할 수 있는 새로운 '복구된' 앨범 기능이 추가되었습니다. Jul 18, 2024 am 05:48 AM

Apple의 최신 iOS18, iPadOS18 및 macOS Sequoia 시스템 릴리스에는 사진 애플리케이션에 중요한 기능이 추가되었습니다. 이 기능은 사용자가 다양한 이유로 손실되거나 손상된 사진과 비디오를 쉽게 복구할 수 있도록 설계되었습니다. 새로운 기능에는 사진 앱의 도구 섹션에 '복구됨'이라는 앨범이 도입되었습니다. 이 앨범은 사용자가 기기에 사진 라이브러리에 포함되지 않은 사진이나 비디오를 가지고 있을 때 자동으로 나타납니다. "복구된" 앨범의 출현은 데이터베이스 손상으로 인해 손실된 사진과 비디오, 사진 라이브러리에 올바르게 저장되지 않은 카메라 응용 프로그램 또는 사진 라이브러리를 관리하는 타사 응용 프로그램에 대한 솔루션을 제공합니다. 사용자는 몇 가지 간단한 단계만 거치면 됩니다.

PHP에서 MySQLi를 사용하여 데이터베이스 연결을 설정하는 방법에 대한 자세한 튜토리얼 PHP에서 MySQLi를 사용하여 데이터베이스 연결을 설정하는 방법에 대한 자세한 튜토리얼 Jun 04, 2024 pm 01:42 PM

MySQLi를 사용하여 PHP에서 데이터베이스 연결을 설정하는 방법: MySQLi 확장 포함(require_once) 연결 함수 생성(functionconnect_to_db) 연결 함수 호출($conn=connect_to_db()) 쿼리 실행($result=$conn->query()) 닫기 연결( $conn->close())

PHP에서 데이터베이스 연결 오류를 처리하는 방법 PHP에서 데이터베이스 연결 오류를 처리하는 방법 Jun 05, 2024 pm 02:16 PM

PHP에서 데이터베이스 연결 오류를 처리하려면 다음 단계를 사용할 수 있습니다. mysqli_connect_errno()를 사용하여 오류 코드를 얻습니다. 오류 메시지를 얻으려면 mysqli_connect_error()를 사용하십시오. 이러한 오류 메시지를 캡처하고 기록하면 데이터베이스 연결 문제를 쉽게 식별하고 해결할 수 있어 애플리케이션이 원활하게 실행될 수 있습니다.

C++에서 멀티스레드 프로그램의 성능을 최적화하는 방법은 무엇입니까? C++에서 멀티스레드 프로그램의 성능을 최적화하는 방법은 무엇입니까? Jun 05, 2024 pm 02:04 PM

C++ 다중 스레드 성능을 최적화하기 위한 효과적인 기술에는 리소스 경합을 피하기 위해 스레드 수를 제한하는 것이 포함됩니다. 경합을 줄이려면 가벼운 뮤텍스 잠금을 사용하세요. 잠금 범위를 최적화하고 대기 시간을 최소화합니다. 동시성을 향상하려면 잠금 없는 데이터 구조를 사용하세요. 바쁜 대기를 피하고 이벤트를 통해 스레드에 리소스 가용성을 알립니다.

Java 프레임워크의 성능 비교 Java 프레임워크의 성능 비교 Jun 04, 2024 pm 03:56 PM

벤치마크에 따르면 소규모 고성능 애플리케이션의 경우 Quarkus(빠른 시작, 낮은 메모리) 또는 Micronaut(TechEmpower 우수)가 이상적인 선택입니다. SpringBoot는 대규모 풀 스택 애플리케이션에 적합하지만 시작 시간과 메모리 사용량이 약간 느립니다.

Golang에서 데이터베이스 콜백 함수를 사용하는 방법은 무엇입니까? Golang에서 데이터베이스 콜백 함수를 사용하는 방법은 무엇입니까? Jun 03, 2024 pm 02:20 PM

Golang의 데이터베이스 콜백 기능을 사용하면 다음을 달성할 수 있습니다. 지정된 데이터베이스 작업이 완료된 후 사용자 정의 코드를 실행합니다. 추가 코드를 작성하지 않고도 별도의 함수를 통해 사용자 정의 동작을 추가할 수 있습니다. 삽입, 업데이트, 삭제, 쿼리 작업에 콜백 함수를 사용할 수 있습니다. 콜백 함수를 사용하려면 sql.Exec, sql.QueryRow, sql.Query 함수를 사용해야 합니다.

JSON 데이터를 Golang의 데이터베이스에 저장하는 방법은 무엇입니까? JSON 데이터를 Golang의 데이터베이스에 저장하는 방법은 무엇입니까? Jun 06, 2024 am 11:24 AM

JSON 데이터는 gjson 라이브러리 또는 json.Unmarshal 함수를 사용하여 MySQL 데이터베이스에 저장할 수 있습니다. gjson 라이브러리는 JSON 필드를 구문 분석하는 편리한 방법을 제공하며, json.Unmarshal 함수에는 JSON 데이터를 비정렬화하기 위한 대상 유형 포인터가 필요합니다. 두 방법 모두 SQL 문을 준비하고 삽입 작업을 수행하여 데이터를 데이터베이스에 유지해야 합니다.

See all articles