SQLServer数据库优化的10多种⽅法
巧妙优化sql server数据库的⼏种⽅法,在实际操作中导致查询速度慢的原因有很多,其中最为常见有以下的⼏种:没有索引或者没有⽤到索引(这是查询慢最常见的问题,是程序设计的缺陷)。
  I/O吞吐量⼩,形成了瓶颈效应。
  没有创建计算列导致查询不优化SQL Server数据库。
  内存不⾜。
  ⽹络速度慢。
  查询出的数据量过⼤(可以采⽤多次查询,其他的⽅法降低数据量)。
  锁或者死锁(这也是查询慢最常见的问题,是程序设计的缺陷)。
  sp_lock,sp_who,活动的⽤户查看,原因是读写竞争资源。
  返回了不必要的⾏和列。
  查询语句不好,没有优化。
  可以通过如下⽅法来优化查询 :
  1、把数据、⽇志、索引放到不同的I/O设备上,增加读取速度,以前可以将Tempdb应放在RAID0上,SQL2000不在⽀持。数据量(尺⼨)越⼤,提⾼I/O越重要。
  2、纵向、横向分割表,减少表的尺⼨(sp_spaceuse)。
  3、升级硬件。
  4、根据查询条件,建⽴索引,优化索引、优化SQL Server数据库访问⽅式,限制结果集的数据量。注意填充因⼦要适当(最好是使⽤默认值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⾃动评估选择的。单个任务分解成多个任务,就可以在处理器上运⾏。例如耽搁查询的排序、连接、扫描和GROUP BY字句同时执⾏,SQL SERVER根据系统的负载情况决定最优的并⾏等级,复杂的需要消耗⼤量的CPU的查询最适合并⾏处理。但是更新操作Update,Insert, Delete还不能并⾏处理。
  8、如果是使⽤like进⾏查询的话,简单的使⽤index是不⾏的,但是全⽂索引,耗空间。 like ‘a%’ 使⽤索引 like ‘%a’ 不使⽤索引⽤ like ‘%a%’ 查询时,查询耗时和字段值总长度成正⽐,所以不能⽤CHAR类型,⽽是VARCHAR。对于字段的值很长的建全⽂索引。
  9、DB Server 和APPLication Server 分离;OLTP和OLAP分离。
  10、分布式分区视图可⽤于实现数据库服务器联合体。联合体是⼀组分开管理的服务器,但它们相互协作分担系统的处理负荷。这种通过分区数据形成数据库服务器联合体的机制能够扩⼤⼀组服务器,以⽀持⼤型的多层 Web 站点的处理需要。有关更多信息,参见设计联合数据库服务器。(参照SQL帮助⽂件’分区视图’)在实现分区视图之前,必须先⽔平分区表。
  在创建成员表后,在每个成员服务器上定义⼀个分布式分区视图,并且每个视图具有相同的名称。这样,引⽤分布式分区视图名的查询可以在任何⼀个成员服务器上运⾏。系统操作如同每个成员服务器上都有⼀个原始表的复本⼀样,但其实每个服务器上只有⼀个成员表和⼀个分布式分区视图。数据的位置对应⽤程序是透明的。
  11、重建索引 DBCC REINDEX ,DBCC INDEXDEFRAG,收缩数据和⽇志 DBCC SHRINKDB,DBCC SHRINKFILE. 设置⾃动收缩⽇志.对于⼤的数据库不要设置数据库⾃动增长,它会降低服务器的性能。在T-sql的写法上有很⼤的讲究,下⾯列出常见的要点:⾸
先,DBMS处理查询计划的过程是这样的:
  查询语句的词法、语法检查。
  将语句提交给DBMS的查询优化器。
  优化器做代数优化和存取路径的优化SQL Server数据库。
  由预编译模块⽣成查询规划。
  然后在合适的时间提交给系统处理执⾏。
  最后将执⾏结果返回给⽤户其次,看⼀下SQL SERVER的数据存放的结构:⼀个页⾯的⼤⼩为8K(8060)字节,8个页⾯为⼀个盘区,按照B树存放。
  12、Commit和rollback的区别 Rollback:回滚所有的事物。 Commit:提交当前的事物. 没有必要在动态SQL⾥写事物,如果要写请写在外⾯如: begin tran exec(@s) commit trans 或者将动态SQL 写成函数或者存储过程。[SPAN]
  13、在查询Select语句中⽤Where字句限制返回的⾏数,避免表扫描,如果返回不必要的数据,浪费了服务器的I/O资源,加重了⽹络的负担降低性能。如果表很⼤,在表扫描的期间将表锁住,禁⽌其他的联接访问表,后果严重。
===========================================================================sql语句优化方式
针对⼤数据量表的优化查询
1:索引,我们最先想到的就是创建索引,创建索引可以成倍的提升查询的效率,节省时间。但是如果数据量太过于巨⼤的时候,这个时候单纯的创建索引是⽆济于事的,我们知道假如特别是在⼤数据量中统计查询,就拿1000W数据来说吧,如果使⽤count函数的话,最少要50-100秒以上,当然如果你的服务器配置够⾼,处理够快,或许会少很多但是⼀样会超过10秒。单纯的建⽴索引是⽆济于事的。
我们可以在创建索引的时候给索引加个属性,compress,这个属性可以将所创建的索引进⾏⼀个良好的归类,这样的话,查询速度会提升5-10倍,或者更⾼。但是唯⼀的缺点是,压缩索引只能⼿动创建,对于那些KEY是⽆法进⾏压缩的,因为KEY(主键)是⾃动创建的索引,compress必选的属性,⼀般默认是不创建。所以在创建压缩索引的时候,可以其他的关键字段进⾏压缩,⽐如⼯单表⾥⾯的流⽔号
2:尽量少的使⽤那些函数,⽐如 IS NUll;IS NOT NULL,IN;NOT IN等这样的匹配函数,可以使⽤符号程序进⾏操作
3:尽量少使⽤⼦查询,如果你写个类,⾥⾯模仿⼦查询的效果,你就会发现,简直在要命,我们可以使⽤联合查询,或者是外连接查询,这样速度会⽐⼦查询快很多。
4:在使⽤索引的时候,注意如下:
Where⼦句中有“!=”将使索引失效
select account_name from test where amount != 0  (不使⽤)
select account_name from test where amount > 0  (使⽤)
Where条件中对字段增加处理函数将不使⽤该列的索引
select * from emp where to_char(hire_date,'yyyymmdd')='20080411' (不使⽤)
select * from emp where hire_date = to_char('20080411','yyyymmdd') (使⽤)
避免在索引列上使⽤IS NULL和 IS NOT NULL
select * from emp where dept_code is not null  (不使⽤)
select * from emp where dept_code > 0  (使⽤)
通配符% 的使⽤
select * from emp where name like '%A'  (不使⽤索引)
select * from emp where name like 'A%'  (使⽤索引)

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。