华创证券sqlserver读写性能慢问题(228)
- 格式:docx
- 大小:293.78 KB
- 文档页数:2
SQL Server中存储过程比直接运行SQL 语句慢的原因在很多的资料中都描述说SQLSERVER 的存储过程较普通的SQL 语句有以下优点:1. 存储过程只在创造时进行编译即可,以后每次执行存储过程都不需再重新编译,而我们通常使用的SQL 语句每执行一次就编译一次, 所以使用存储过程可提高数据库执行速度。
2. 经常会遇到复杂的业务逻辑和对数据库的操作,这个时候就会用SP 来封装数据库操作。
当对数据库进行复杂操作时(如对多个表进行Update,Insert,Query,Delete 时),可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。
可以极大的提高数据库的使用效率,减少程序的执行时间,这一点在较大数据量的数据库的操作中是非常重要的。
在代码上看,SQL 语句和程序代码语句的分离,可以提高程序代码的可读性。
3. 存储过程可以设置参数,可以根据传入参数的不同重复使用同一个存储过程,从而高效的提高代码的优化率和可读性。
4. 安全性高, 可设定只有某此用户才具有对指定存储过程的使用权存储过程的种类:A. 系统存储过程:以sp_开头, 用来进行系统的各项设定. 取得信息. 相关管理工作, 如 sp_help就是取得指定对象的相关信息。
B. 扩展存储过程以XP_开头, 用来调用操作系统提供的功能exec master..xp_cmdshell 'ping 10.8.16.1'C. 用户自定义的存储过程, 这是我们所指的存储过程常用格式模版:Create procedure procedue_name [@parameterdata_type][output][with]{recompile|encryption} as sql_statement解释:output :表示此参数是可传回的with {recompile|encryption} recompile:表示每次执行此存储过程时都重新编译一次;encryption:所创建的存储过程的内容会被加密。
影响SQLServer数据库应用性能的几个常见因素性能问题是困扰数据库用户的常见问题之一。
经常会有人因为遇到性能问题,质疑SQL Server处理大型数据应用的能力。
其实,作为一个在市场上经营了二十多年,出了好几代版本的数据库产品,SQL Server作为一个企业级数据库的能力,是毋庸置疑的。
在实际应用中,数据量达到几百GB,甚至上TB级,并发连接数超过1、2千个,每秒钟处理的请求数量超过1000多个的SQL Server,现在已经很多了。
在国内的一些大客户那里,我们也越来越多地看到这样的SQL Server。
那为什么有些SQL Server能跑得那么强劲,而很多用户的数据库还只有几十GB,就感觉跑不动了呢?在谈性能问题的常见原因之前,我们先谈谈SQL Server的几个和性能有关的重要特性。
了解这些特性,对设计一个高效的数据库应用,是非常必要的。
1. SQL Server要访问的数据,是一定要缓冲在内存里的不管是要查询的数据,还是要修改的数据,SQL Server在运行客户端发过来的语句,处理这些数据之前,都要检查其访问的数据是否在内存中。
如果不在内存中,SQL Server会先把存储数据的页面从磁盘调入内存,然后再做真正的数据处理。
数据处理完毕后,SQL Server不会马上把这段数据缓存丢弃。
只要SQL Server不缺内存,先前访问过数据页面就会一直缓存在SQL Server进程的地址空间里。
这样,如果下次有其他用户要访问同样的数据记录,SQLServer就可以马上在内存中进行处理,而不需要再到磁盘上去找。
这样的设计,可以最大程度的重用内存,提高SQL Server的处理速度。
同时也决定了,SQL Server是一个非常喜欢大内存的应用程序。
2. 如果SQL Server没有空闲的内存,而用户需要访问新的数据,SQL会把以前缓存的数据挑选一部分从内存中清除,腾出空间来缓存新的数据SQL Server不会无限制地申请内存。
SQL Server数据库查询速度慢的原因有很多,常见的有以下几种:1、没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷)2、I/O吞吐量小,形成了瓶颈效应。
3、没有创建计算列导致查询不优化。
4、内存不足5、网络速度慢6、查询出的数据量过大(可以采用多次查询,其他的方法降低数据量)7、锁或者死锁(这也是查询慢最常见的问题,是程序设计的缺陷)8、sp_lock,sp_who,活动的用户查看,原因是读写竞争资源。
9、返回了不必要的行和列10、查询语句不好,没有优化可以通过以下方法来优化查询 :1、把数据、日志、索引放到不同的I/O设备上,增加读取速度,以前可以将Tempdb应放在RAID0上,SQL2000不在支持。
数据量(尺寸)越大,提高I/O越重要。
2、纵向、横向分割表,减少表的尺寸(sp_spaceuse)3、升级硬件4、根据查询条件,建立索引,优化索引、优化访问方式,限制结果集的数据量。
注意填充因子要适当(最好是使用默认值0)。
索引应该尽量小,使用字节数小的列建索引好(参照索引的创建),不要对有限的几个值的字段建单一索引如性别字段。
5、提高网速。
6、扩大服务器的内存,Windows 2000和SQL server 2000能支持4-8G的内存。
配置虚拟内存:虚拟内存大小应基于计算机上并发运行的服务进行配置。
运行 Microsoft SQL Server? 2000时,可考虑将虚拟内存大小设置为计算机中安装的物理内存的1.5倍。
如果另外安装了全文检索功能,并打算运行Microsoft搜索服务以便执行全文索引和查询,可考虑:将虚拟内存大小配置为至少是计算机中安装的物理内存的3倍。
将SQL Server max server memory服务器配置选项配置为物理内存的1.5倍(虚拟内存大小设置的一半)。
7、增加服务器CPU个数;但是必须明白并行处理串行处理更需要资源例如内存。
使用并行还是串行程是MsSQL自动评估选择的。
SQLServer数据库性能调优技巧第一章:SQLServer数据库性能调优概述SQLServer是一种常用的关系型数据库管理系统,在大型企业和云计算环境中广泛应用。
为了确保数据库的高性能和可靠性,进行数据库性能调优非常重要。
本章将介绍SQLServer数据库性能调优的概念和目标。
1.1 数据库性能调优的概念数据库性能调优是指通过分析和优化数据库的结构、查询、索引、存储和配置等方面的问题,以提高数据库系统的效率和性能。
优化数据库性能可以显著提升数据的访问速度、减少系统响应时间和提高数据库的处理能力。
1.2 数据库性能调优的目标数据库性能调优的主要目标是提高数据库的运行效率和用户的体验,具体目标包括:- 提高数据的访问速度:通过合理的查询优化和索引设计,加快数据的检索速度。
- 减少系统响应时间:通过调整数据库配置、优化SQL 查询和提高硬件性能等措施,缩短系统响应时间。
- 提高数据库的处理能力:通过合理的分区设计、并行处理和负载均衡等措施,提高数据库的并发处理能力。
第二章:SQLServer数据库性能调优基础在进行SQLServer数据库性能调优之前,有几个基础概念需要了解,包括数据库的结构、查询执行计划和索引等。
2.1 数据库的结构SQLServer数据库由多个表组成,每个表由多个行和列组成。
表有一定的关系,通过主键和外键来建立关联。
了解数据库的结构对于进行性能调优非常重要。
2.2 查询执行计划查询执行计划是SQLServer数据库执行查询语句时的执行路径和操作过程的详细描述。
通过分析查询执行计划,可以找到潜在的性能问题,并进行相应的优化。
2.3 索引索引是一种特殊的数据库对象,用于加快查询速度。
常见的索引类型包括聚集索引、非聚集索引和全文索引等。
合理设计索引可以提高查询的性能。
第三章:SQLServer数据库性能调优技巧本章将介绍一些常用的SQLServer数据库性能调优技巧,包括查询优化、索引优化、配置优化和硬件优化等。
Sqlserver SQL性能优化经验1.选择最有效率的表名顺序(只在基于规则的优化器中有效)SQLSERVER的解析器按照从右到左的顺序处理FROM子句中的表名,因此FROM子句中写在最后的表(基础表driving table)将被最先处理,在FROM子句中包含多个表的情况下,必须选择记录条数最少的表作为基础表,当SQLSERVER处理多个表时,会运用排序及合并的方式连接它们,首先,扫描第一个表(FROM子句中最后的那个表)并对记录进行排序;然后扫描第二个表(FROM子句中最后第二个表);最后将所有从第二个表中检索出的记录与第一个表中合适记录进行合并例如: 表TAB1 16,384 条记录表TAB2 5 条记录,选择TAB2作为基础表(最好的方法) select count(*) from tab1,tab2 执行时间0.96秒,选择TAB2作为基础表(不佳的方法) select count(*) from tab2,tab1 执行时间26.09秒;如果有3个以上的表连接查询,那就需要选择交叉表(intersection table)作为基础表,交叉表是指那个被其他表所引用的表例如:EMP表描述了LOCATION表和CATEGORY表的交集SELECT *FROM LOCATION L,CATEGORY C,EMP EWHERE E.EMP_NO BETWEEN 1000 AND 2000AND E.CAT_NO = C.CAT_NOAND E.LOCN = L.LOCN将比下列SQL更有效率SELECT *FROM EMP E ,LOCATION L ,CATEGORY CWHERE E.CAT_NO = C.CAT_NOAND E.LOCN = L.LOCNAND E.EMP_NO BETWEEN 1000 AND 20002.WHERE子句中的连接顺序SQLSERVER采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前,那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾例如:(低效,执行时间156.3秒)SELECT *FROM EMP EWHERE SAL > 50000AND JOB = ’MANAGER’AND 25 < (SELECT COUNT(*) FROM EMP WHERE MGR=E.EMPNO);(高效,执行时间10.6秒)SELECT *FROM EMP EWHERE 25 < (SELECT COUNT(*) FROM EMP WHERE MGR=E.EMPNO)AND SAL > 50000AND JOB = ’MANAGER’;3.SELECT子句中避免使用’*’。
针对Sqlserver⼤数据量插⼊速度慢或丢失数据的解决⽅法我的设备上每秒将2000条数据插⼊数据库,2个设备总共4000条,当在程序⾥⾯直接⽤insert语句插⼊时,两个设备同时插⼊⼤概总共能插⼊约2800条左右,数据丢失约1200条左右,测试了很多⽅法,整理出了两种效果⽐较明显的解决办法:⽅法⼀:使⽤Sql Server函数:1.将数据组合成字串,使⽤函数将数据插⼊内存表,后将内存表数据复制到要插⼊的表。
2.组合成的字符换格式:'111|222|333|456,7894,7458|0|1|2014-01-01 12:15:16;1111|2222|3333|456,7894,7458|0|1|2014-01-01 12:15:16',每⾏数据中间⽤“;”隔开,每个字段之间⽤“|”隔开。
3.编写函数:CREATE FUNCTION [dbo].[fun_funcname](@str VARCHAR(max),@splitchar CHAR(1),@splitchar2 CHAR(1))--定义返回表RETURNS @t TABLE(MaxValue float,Phase int,SlopeValue float,Data varchar(600),Alarm int,AlmLev int,GpsTime datetime,UpdateTime datetime) AS/*author:hejun licreate date:2014-06-09*/BEGINDECLARE @substr VARCHAR(max),@substr2 VARCHAR(max)--申明单个接收值declare @MaxValue float,@Phase int,@SlopeValue float,@Data varchar(8000),@Alarm int,@AlmLev int,@GpsTime datetimeSET @substr=@strDECLARE @i INT,@j INT,@ii INT,@jj INT,@ijj1 int,@ijj2 int,@m int,@mm intSET @j=LEN(REPLACE(@str,@splitchar,REPLICATE(@splitchar,2)))-LEN(@str)--获取分割符个数IF @j=0BEGIN--INSERT INTO @t VALUES (@substr,1) --没有分割符则插⼊整个字串set @substr2=@substr;set @ii=0SET @jj=LEN(REPLACE(@substr2,@splitchar2,REPLICATE(@splitchar2,2)))-LEN(@substr2)--获取分割符个数WHILE @ii<=@jjBEGINif(@ii<@jj)beginSET @mm=CHARINDEX(@splitchar2,@substr2)-1 --获取分割符的前⼀位置if(@ii=0)set @MaxValue=cast(LEFT(@substr2,@mm) as float)else if(@ii=1)set @Phase=cast(LEFT(@substr2,@mm) as int)else if(@ii=2)set @SlopeValue=cast(LEFT(@substr2,@mm) as float)else if(@ii=3)set @Data=cast(LEFT(@substr2,@mm) as varchar)else if(@ii=4)set @Alarm=cast(LEFT(@substr2,@mm) as int)else if(@ii=5)set @AlmLev=cast(LEFT(@substr2,@mm) as int)else if(@ii=6)INSERT INTO @t VALUES(@MaxValue,@Phase,@SlopeValue,''+@Data+'',@Alarm,@AlmLev,cast(@substr2 as datetime),GETDATE())SET @substr2=RIGHT(@substr2,LEN(@substr2)-(@mm+1)) --去除已获取的分割串,得到还需要继续分割的字符串endelseBEGIN--当循环到最后⼀个值时将数据插⼊表INSERT INTO @t VALUES(@MaxValue,@Phase,@SlopeValue,''+@Data+'',@Alarm,@AlmLev,cast(@substr2 as datetime),GETDATE())END--ENDSET @ii=@ii+1ENDENDELSEBEGINSET @i=0WHILE @i<=@jBEGINIF(@i<@j)BEGINSET @m=CHARINDEX(@splitchar,@substr)-1 --获取分割符的前⼀位置--INSERT INTO @t VALUES(LEFT(@substr,@m),@i+1)-----⼆次循环开始--1.线获取要⼆次截取的字串set @substr2=(LEFT(@substr,@m));--2.初始化⼆次截取的起始位置set @ii=0--3.获取分隔符个数SET @jj=LEN(REPLACE(@substr2,@splitchar2,REPLICATE(@splitchar2,2)))-LEN(@substr2)--获取分割符个数WHILE @ii<=@jjBEGINif(@ii<@jj)beginSET @mm=CHARINDEX(@splitchar2,@substr2)-1 --获取分割符的前⼀位置if(@ii=0)set @MaxValue=cast(LEFT(@substr2,@mm) as float)else if(@ii=1)set @Phase=cast(LEFT(@substr2,@mm) as int)else if(@ii=2)set @SlopeValue=cast(LEFT(@substr2,@mm) as float)else if(@ii=3)set @Data=cast(LEFT(@substr2,@mm) as varchar)else if(@ii=4)set @Alarm=cast(LEFT(@substr2,@mm) as int)else if(@ii=5)set @AlmLev=cast(LEFT(@substr2,@mm) as int)else if(@ii=6)INSERT INTO @t VALUES(@MaxValue,@Phase,@SlopeValue,''+@Data+'',@Alarm,@AlmLev,cast(@substr2 as datetime),GETDATE())SET @substr2=RIGHT(@substr2,LEN(@substr2)-(@mm+1)) --去除已获取的分割串,得到还需要继续分割的字符串endelseBEGIN--当循环到最后⼀个值时将数据插⼊表INSERT INTO @t VALUES(@MaxValue,@Phase,@SlopeValue,''+@Data+'',@Alarm,@AlmLev,cast(@substr2 as datetime),GETDATE())END--ENDSET @ii=@ii+1END-----⼆次循环结束SET @substr=RIGHT(@substr,LEN(@substr)-(@m+1)) --去除已获取的分割串,得到还需要继续分割的字符串ENDELSEBEGIN--INSERT INTO @t VALUES(@substr,@i+1)--对最后⼀个被分割的串进⾏单独处理-----⼆次循环开始--1.线获取要⼆次截取的字串set @substr2=@substr;--2.初始化⼆次截取的起始位置set @ii=0--3.获取分隔符个数SET @jj=LEN(REPLACE(@substr2,@splitchar2,REPLICATE(@splitchar2,2)))-LEN(@substr2)--获取分割符个数WHILE @ii<=@jjBEGINif(@ii<@jj)beginSET @mm=CHARINDEX(@splitchar2,@substr2)-1 --获取分割符的前⼀位置if(@ii=0)set @MaxValue=cast(LEFT(@substr2,@mm) as float)else if(@ii=1)set @Phase=cast(LEFT(@substr2,@mm) as int)else if(@ii=2)set @SlopeValue=cast(LEFT(@substr2,@mm) as float)else if(@ii=3)set @Data=cast(LEFT(@substr2,@mm) as varchar)else if(@ii=4)set @Alarm=cast(LEFT(@substr2,@mm) as int)else if(@ii=5)set @AlmLev=cast(LEFT(@substr2,@mm) as int)else if(@ii=6)INSERT INTO @t VALUES(@MaxValue,@Phase,@SlopeValue,''+@Data+'',@Alarm,@AlmLev,cast(@substr2 as datetime),GETDATE())SET @substr2=RIGHT(@substr2,LEN(@substr2)-(@mm+1)) --去除已获取的分割串,得到还需要继续分割的字符串endelseBEGIN--当循环到最后⼀个值时将数据插⼊表INSERT INTO @t VALUES(@MaxValue,@Phase,@SlopeValue,''+@Data+'',@Alarm,@AlmLev,cast(@substr2 as datetime),GETDATE())ENDSET @ii=@ii+1END-----⼆次循环结束ENDSET @i=@i+1ENDENDRETURNEND4.调⽤函数语句:insert into [mytable] select * from [dbo].[fun_funcname]('111|222|333|456,7894,7458|0|1|2014-01-01 12:15:16;1111|2222|3333|456,7894,7458|0|1|2014-01-01 12:15:16',';','|');5.结果展⽰:select * from [mytable] ;⽅法⼆:使⽤BULK INSERT⼤数据量插⼊第⼀种操作,使⽤Bulk将⽂件数据插⼊数据库Sql代码创建数据库CREATE DATABASE [db_mgr]GO创建测试表USE db_mgrCREATE TABLE dbo.T_Student(F_ID [int] IDENTITY(1,1) NOT NULL,F_Code varchar(10) ,F_Name varchar(100) ,F_Memo nvarchar(500) ,F_Memo2 ntext ,PRIMARY KEY (F_ID))GO填充测试数据Insert Into T_Student(F_Code, F_Name, F_Memo, F_Memo2) select'code001', 'name001', 'memo001', '备注' union all select'code002', 'name002', 'memo002', '备注' union all select'code003', 'name003', 'memo003', '备注' union all select'code004', 'name004', 'memo004', '备注' union all select'code005', 'name005', 'memo005', '备注' union all select'code006', 'name006', 'memo006', '备注'开启xp_cmdshell存储过程(开启后有安全隐患)EXEC sp_configure 'show advanced options', 1;RECONFIGURE;EXEC sp_configure 'xp_cmdshell', 1;EXEC sp_configure 'show advanced options', 0;RECONFIGURE;使⽤bcp导出格式⽂件:EXEC master..xp_cmdshell 'BCP db_mgr.dbo.T_Student format nul -f C:/student_fmt.xml -x -c -T'使⽤bcp导出数据⽂件:EXEC master..xp_cmdshell 'BCP db_mgr.dbo.T_Student out C:/student.data -f C:/student_fmt.xml -T'将表中数据清空truncate table db_mgr.dbo.T_Student使⽤Bulk Insert语句批量导⼊数据⽂件:BULK INSERT db_mgr.dbo.T_StudentFROM 'C:/student.data'WITH(FORMATFILE = 'C:/student_fmt.xml')使⽤OPENROWSET(BULK)的例⼦:T_Student表必须已存在INSERT INTO db_mgr.dbo.T_Student(F_Code, F_Name) SELECT F_Code, F_NameFROM OPENROWSET(BULK N'C:/student.data', FORMATFILE=N'C:/student_fmt.xml') AS new_table_name 使⽤OPENROWSET(BULK)的例⼦:tt表可以不存在SELECT F_Code, F_Name INTO db_mgr.dbo.ttFROM OPENROWSET(BULK N'C:/student.data', FORMATFILE=N'C:/student_fmt.xml') AS new_table_name。
SQL Server 数据库是一种常见的关系型数据库管理系统,它被广泛应用于企业级应用程序和数据管理系统中。
然而,随着数据库规模的增大和日常操作的复杂性增加,数据库的性能和效率往往成为关注的焦点。
提高SQL Server数据库的效率不仅可以显著改善系统的响应速度和稳定性,也可以节约资源和降低成本。
本文将介绍一些提高SQL Server 数据库效率的方法,帮助管理员和开发人员更好地管理和优化数据库系统。
1. 使用合适的索引索引是数据库中用来加快对表中数据的访问速度的结构,它可以通过创建索引来优化查询的性能。
在SQL Server中,通过对经常进行搜索,排序和过滤的数据列创建合适的索引,可以显著提高查询性能。
定期对索引进行维护和优化也是提高数据库效率的关键步骤。
2. 优化查询语句优化SQL查询语句对于提高数据库效率至关重要。
在编写查询语句时,应避免使用全表扫描,尽量减少数据量,避免使用不必要的连接和子查询,合理使用排序和分组等操作,以及避免使用模糊查询和通配符查询等低效操作。
3. 定期备份和恢复定期备份数据库是保障数据库安全的重要手段,同时备份还能够减少数据库维护的风险。
在备份时,管理员应该选择合适的备份策略,并对备份文件进行存储和管理,以确保数据库在出现故障或灾难时能够快速恢复。
4. 使用存储过程和触发器存储过程和触发器是SQL Server中重要的数据库对象,它们可以提高数据库的安全性和可维护性,同时还能减少网络流量和客户端执行开销,提高数据库的效率。
在编写存储过程和触发器时,应遵循一些最佳实践,如避免多次嵌套存储过程和触发器,减少对数据库的锁定和阻塞。
5. 使用物理分区技术SQL Server支持对数据表进行物理分区,这可以帮助管理员更好地管理数据,并根据需求对数据进行调优。
通过物理分区,可以提高查询和数据加载的性能,同时也方便了数据备份和恢复。
总结通过上述方法,可以显著提高SQL Server数据库的性能和效率,使其能够更好地满足企业应用程序和数据管理系统的需求。
SqlServer阻塞的常见原因和解决办法阻塞的常见原因和解决办法:1. 由于语句运⾏时间太长⽽导致的阻塞,语句本⾝在正常运⾏中,只须等待某些系统资源解决办法:a. 语句本⾝有没有可优化的空间b. Sql Server 整体性能如何,是不是有资源瓶颈影响了语句执⾏速度,如内存、硬盘和 CPU 等2. 由于⼀个未按预期提交的事务导致的阻塞这⼀类阻塞的特征,就是问题连接早就进⼊了空闲状态(sysprocesses.status='sleeping'和sysprocesses.cms='awaiting command'),但是,如果检查 sysprocesses.open_tran,就会发现它不为0,以及事务没有提交。
这类问题很多都是因为应⽤端遇到了⼀个执⾏超时,或者其他原因,当时执⾏的语句倍提前终⽌了,但是连接还保留着。
应⽤没有跟随发来的事务提交或回滚指令,导致⼀个事务被遗留在 Sql Server ⾥。
解决办法:应⽤程序本⾝必须意识到任何语句都有可能遇到意外终⽌的情况,做好错误处理⼯作。
这些⼯作包括:· 在做 Sql Server 调⽤的时候,须加上错误捕捉和处理语句:If @@Trancount>0 RollBack Tran;(在程序中设置If @@Error<>0 Rollback Tran; 并不总是能执⾏到该语句)· 设置连接属性"Set XACT_ABORT ON"。
如果没有办法很规范应⽤程序的错误扑捉和处理语句,⼀个最快的⽅法就是在每个连接建⽴以后,或是容易出问题的存储过程开头,运⾏ "Set XACT_ABORT ON"·考虑是否要关闭连接池。
发⼀句 sp_reset_connection 命令清理当前连接上次遗留下来的所有对象,包括回滚未提交的事务。
3. 由于客户端没有及时把结果集取出⽽导致的语句长时间运⾏语句在 Sql Server 内执⾏总时间不仅包含 Sql Server 的执⾏时间,还包含把结果集发给客户端的时间。
SQLServer数据库sql语句性能优化分析⽐较执⾏时间计划读取情况1. 查看执⾏时间和cpuset statistics time onselect * from Bus_DevHistoryDataset statistics time off执⾏后在消息⾥可以看到2. 查看查询对I/O的操作情况set statistics io onselect * from Bus_DevHistoryDataset statistics io off执⾏之后的结果:扫描计数:索引和表执⾏次数逻辑读取:数据缓存中读取的页数物理读取:从磁盘中读取的页数预读:查询过程中,从磁盘放⼊缓存的页数lob逻辑读取:从数据缓存中读取image、text、ntext或⼤型数据的页数lob物理读取:从磁盘中读取image、text、ntext或⼤型数据的页数lob预读:查询过程中,从磁盘放⼊缓存的image、text、ntext或⼤型数据的页数如果物理读取次数和预计次数⽐较多,可以使⽤索引进⾏优化。
上述两种信息的查看如果不想写sql,可以通过设置完成:⼯具->选项3. 查看执⾏计划选中查询语句,点击⼀、数据库设计优化1、不要使⽤游标。
使⽤游标不仅占⽤内存,⽽且还⽤不可思议的⽅式锁定表,它们可以使DBA所能做的⼀切性能优化等于没做。
游标⾥每执⾏⼀次fetch就等于执⾏⼀次select。
2、创建适当的索引每当为⼀个表添加⼀个索引,select会更快,可insert和delete却⼤⼤变慢,因为创建了维护索引需要许多额外的⼯作。
(1)采⽤函数处理的字段不能利⽤索引(2)条件内包括了多个本表的字段运算时不能进⾏索引3、使⽤事务对于⼀些耗时的操作,使⽤事务可以达到很好的优化效果。
4、⼩⼼死锁按照⼀定的次序来访问你的表。
如果你先锁住表A,再锁住表B,那么在所有的存储过程中都要按照这个顺序来锁定它们。
如果某个存储过程先锁定表B,再锁定表A,这可能会导致⼀个死锁。
改善SQL Server数据库查询速度慢的技巧SQL Server数据库是一个关系数据库管理系统,功能强大,但有时候会出现数据库查询速度慢的问题,那么如何解决SQL Server数据库查询速度慢?下文将给出答案。
SQL Server数据库查询速度慢的原因有很多,常见的有以下几种:1、没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷2、I/O吞吐量小,形成了瓶颈效应。
3、没有创建计算列导致查询不优化。
4、内存不足5、网络速度慢6、查询出的数据量过大(可以采用多次查询,其他的方法降低数据量7、锁或者死锁(这也是查询慢最常见的问题,是程序设计的缺陷8、sp_lock,sp_who,活动的用户查看,原因是读写竞争资源。
9、返回了不必要的行和列10、查询语句不好,没有优化可以通过以下方法来优化查询 :1、把数据、日志、索引放到不同的I/O设备上,增加读取速度,以前可以将Tempdb 应放在RAID0上,SQL2000不在支持。
数据量(尺寸越大,提高I/O越重要。
2、纵向、横向分割表,减少表的尺寸(sp_spaceuse3、升级硬件4、根据查询条件,建立索引,优化索引、优化访问方式,限制结果集的数据量。
注意填充因子要适当(最好是使用默认值0。
索引应该尽量小,使用字节数小的列建索引好(参照索引的创建,不要对有限的几个值的字段建单一索引如性别字段。
5、提高网速。
6、扩大服务器的内存,Windows 2000和SQL server 2000能支持4-8G的内存。
配置虚拟内存:虚拟内存大小应基于计算机上并发运行的服务进行配置。
运行Microsoft SQL Server? 2000时,可考虑将虚拟内存大小设置为计算机中安装的物理内存的1.5倍。
如果另外安装了全文检索功能,并打算运行Microsoft搜索服务以便执行全文索引和查询,可考虑:将虚拟内存大小配置为至少是计算机中安装的物理内存的3倍。
将SQL Server max server memory服务器配置选项配置为物理内存的1.5倍(虚拟内存大小设置的一半。
华创证券sqlserver读写性能慢问题处理
【处理时间】2015年6月8日
【客户名称】华创证券
【主机信息】aix
【处理人员】霍新国
【问题说明】现象:
华创证券sqlserver数据库读写慢处理。
事件分析
1.情景提示:
正常服务器连接存储插入:1437笔/秒更新:1410笔/秒读取:45537笔/秒
2.优化参数设置
A 设置锁定内存页点击开始菜单-->选择控制面板-->选择管理工具-->选择本地安全策略-->接着点击用户权限分配-->选择内存锁定页-->接着点击添加用户和组
B 数据库参数设置
数据库服务右键 -->处理器-->勾选提升sqlserver性能
选择数据库(run2/tempdb)文件 -->初始大小修改为1024M,增量为10%
选择数据库(run2/sql2) -->选项-->自动关闭、自动收缩为False
C 数据库属性-->选项-->恢复-->页验证-->修改为CheckSum
D 将数据和日志文件的“Autoshrink”设置为“关”.
3.设置磁盘块大小为4k。
4.设置多路径模式。
如下图
处理建议通过优化相关参数读写性能显著提高
插入:2575笔/秒
更新:2470笔/秒
读取:45330笔/秒。