美文网首页
Sql Server语句的优化分析

Sql Server语句的优化分析

作者: 夏_8a64 | 来源:发表于2020-01-16 15:15 被阅读0次

    一、sql语句的优化分析


    问题所在

         网速不给力,不稳定,服务器内存不够。

        SQL语句设计不合理

        没有相应的索引,索引不合理

        表数据过得,没有有效的分区设计

        数据库设计存在问题,存在大量的数据冗余。

        。。。

    数据太多的表,要分区,缩小查找范围

    分析比较执行时间计划读取情况

    1、查看执行时间和cpu占用时间

        set statistics time on 

        select * from dbo.table 

        set statistics time off

    2、查看查询 I/0的操作情况

        set statistics io on

        select * from dbo.table

        set statistics io off

        执行之后:扫描计数→索引或表扫描次数

                          预读→查询过程中,从磁盘放入缓存的页数

                         物理读取→ 从磁盘中读取,image,text,ntext或大型数据的页数

         如果物理读取次数和预读次数比较多,可以使用索引进行优化

       SELECT查询艺术

             1、保证不查询多余的行和列

                    ###尽量避免select * 的存在,使用具体的列代替 *,避免多余的列

                    ### 使用where限定具体要查询的数据,避免多余的行

                    ### 使用top,distinct关键字减少多余重复的行

                    ### 慎用distinct 

                     distinct 在查询一个字段或者很少字段情况下使用,会避免重复数据的出现,给查询带来优化效果,

                但是查询字段很多的情况下使用,则会大大降低查询效率。

                     原因是查询多字段时,如果使用distinct,数据库引擎就会对数据进行比较,过滤重复数据,这个比较、

                过滤会占用系统资源,cpu时间。

                2、慎用union关键字

                    此关键字主要功能是把各个查询语句的结果并到一个结果集中进行返回,用法:

                    <select 语句1>         

                    union

                    <select 语句2>

                    union

                    <select 语句3>

                    ...

                   满足 union条件:1、列数相同。

                                                2、对应列数的数据类型要保持兼容

                    执行过程:依次执行select语句→合并结果集→对结果集进行排序,过滤重复记录

                    使用union all能对union进行一定优化不执行排序、过滤等操作

                    3、判断表中是否存在数据

                        select count(*) from table

                        select top(1) id from product →执行效率更高

                    4、连接查询的优化及果汁连接的取值大小为:

                        ### 内连接结果集大小取决于左右表满足的条件数量

                        ### 左连接取决于左表大小,右相反

                        完全连接和交叉连接取决于左右两个表的数据总数量

                    5、Insert 插入优化,insert into select 批量插入明显提升效率,所以尽量避免一个个循环插入。

                    6、优化修改删除语句,同时修改或删除过多数据,会造成cpu利用率过高从而影响别人对数据库访问,折中办法:

                        分批操作。

        SqlServer索引的原理与应用

              索引的用途:对竖框查询及处理速度已成为衡量应用系统成败的标准,而采用索引来加快数据处理速度通常是最普遍的方法。

              索引是什么:数据库中的索引类似于一本书的目录,运用目录可以快速找到想要的信息,而不是读取整本书。

              索引的利弊:查询执行的大部分开销是I/O,使用索引提高新的的一个主要目标是避免全表扫描。但是索引并不总是提高系统

              的性能,带索引的表需要在数据库中占用更多的存储空间,用来增删数据的命令运行时间已经维护所以所需的处理更长。

              所以要合理使用索引,及时更新去除次优索引。

               

               数据表的基本机构

                一个新表被创建之时,系统将在磁盘中分配一段以8K为单位的连续空间,当字段的值从内存写入磁盘时,就在这一既定空间

                当一个8K用完,数据库指针会自动分配一个8K的空间,每个8K空间被称为一个数据页2(Page).

               索引的的分类,SQL SERVER中有多种索引类型。

                按存储结构分:聚集索引、分聚集索引

                按数据唯一性区分:唯一索引,非唯一索引

                按键列个数区分:单列索引、多列索引

                聚集索引:是一种对磁盘上实际数据重新组织以按指定的一列或多列值排序。由于聚集索引是给数据排序,不可能有多种排法,

                所以一个表只能建立一个聚集索引。科学统计建立这样的索引需要至少相当于该表120%的附件空间,用来存放该表的副本和

                所以中间页,但是他的性能几乎总是比其他索引要快。

                非聚集索引:sqlserver默认情况下建立的索引是非聚集索引,他不重新组织表中的数据,而是对每一行存储索引列值并用一个

                指针指向数据所在的页面。

                 一个表可以拥有多个非聚集索引,每个非聚集索引根据索引列的不同提供不同的排序顺序。

                创建索引

                CREATE [UNIQUE] [CLUSTERED| NONCLUSTERED ]

                INDEX index_name ON { table | view } ( column [ ASC | DESC ] [ ,...n ] )

                create index命令创建索引各参数说明如下:

                unique:用于指定为表或视图创建唯一索引,即不允许存在索引值相同的两行。

                clustered:用于指定创建的索引为聚集索引。

                nonclustered:用于指定创建的索引为非聚集索引。

                index_name:用于指定所创建的索引的名称。

                table:用于指定创建索引的视图的名称

                asc|desc:用于指定具体某个索引列的升序或降序排序不同

                fillfactor = fillfactor:用于指定创建索引时,每个索引页的数据所占索引页大小的百分比,fillfactor的值为1到100.

                ignore_dup_key:用于控制当往包含于一个唯一聚集索引中的列中插入重复数据时SQL Server所作的反应。

                drop_existing:用于指定应删除并重新创建已命名的先前存在的聚集索引或非聚集索引。

               statistics_norecompute:用于指定过期的索引统计不会自动重新计算。

                sort_in_tempdb:用于指定创建索引时的中间排序结果将存储在tempdb数据库中。

                。。。。

                例子:

                --表table创建一个名为idx_table的非聚集索引,索引字段为idx--

                create index idx_table on table(idx)

                --表table创建一个名为idx_id的唯一聚集索引,索引字段为id--

                --要求成批插入数据时忽略重复值,不重新计算统计信息,填充因子为40--

                create unique clustered index idx_id on table(id) with pad_index,fillfactor = 40,igore_dup_key,statistics_norecompute

              索引的设计原则

                对于一个表来说索引的有无和建立什么样的索引,要取决于where字句和Join表达式中

                一般来说建立索引的原则包括以下内容:

                 ### 系统一般会给逐渐字段自动建立聚集索引。

                ### 有大量重复值且经常有范围查询和排序、分组的列,或者经常频繁访问的列,考虑建立聚集索引。

                ### 在一个经常做插入操作的表中建立索引,应使用fillfactor(填充因子)来减少页分裂,同时提高并发度降低死锁的发生。

                       如果表为只读表,填充因子可设为100

                ### 在选择索引键时,尽可能采用小数据类型的列作为键以使每个索引页能容纳尽可能多的索引键和指针。可使一个查询必

                        须遍历的索引 页面降低到最小,此外,尽可能的使用整数做为键值,因为整数的访问速度最快。

    相关文章

      网友评论

          本文标题:Sql Server语句的优化分析

          本文链接:https://www.haomeiwen.com/subject/kfbthqtx.html