Sql Server语句的优化分析

一、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

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

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,816评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,729评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,300评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,780评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,890评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,084评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,151评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,912评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,355评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,666评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,809评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,504评论 4 334
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,150评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,882评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,121评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,628评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,724评论 2 351

推荐阅读更多精彩内容

  • SQL SERVER提供了多种索引。如果以存储结构结构来区分,有聚集索引和非聚集索引;如果以数据的唯一性来区分,则...
    不知名的蛋挞阅读 6,031评论 0 5
  • SQL 优化(载录于:http://m.jb51.net/article/5051.htm) 作者: (一)深入浅...
    yuantao123434阅读 730评论 0 7
  • 如此详细的SQL优化教程,是你需要的吗? 一: 基础数据准备 二:五百万数据插入 上面插入几条测试数据,在使用索引...
    随着风化成雨阅读 394评论 0 0
  • 关系型数据库和SQL SQL语言的三个部分DML:Data Manipulation Language,数据操纵语...
    Awey阅读 1,942评论 0 13
  • 不折腾怎么知道呢,让自己不要后悔就好。 人生有很多种,重点是自己会不会后悔?想想我的内心,我在乎他吗?想嫁给他吗?...
    娟子_35f3阅读 1,050评论 0 1