zoukankan      html  css  js  c++  java
  • SQL大数据优化

    对SQL的了解,其实已经有些年头,但一直的应用都是建表,各种范式也是知道的。使用视图,存储过程,建立索引,触发器,使用游标,自建函数,这些东东感觉对数据库的了解还算可以,日常的工作需要都可以处理。但伴随着项目的深入和理解的增加,发现所知道的竟是SQL知识的皮毛,接下来将对最近一段时间对数据库的操作和认识,记录成档,以便日后查阅,同时也供需要的朋友参看。

    建表知识

    对于建表大家都不陌生,这里主要说明一下几点注意实现:

    1、大数据字段最好剥离出单独的表,以便影响性能

    2、使用varchar,代替char,这是因为varchar会动态分配长度,char指定为20,即时你存储字符“1”,它依然是20的长度

    3、给表建立主键,看到好多表没主键,这在查询和索引定义上将有一定的影响

    4、避免表字段运行为null,如果不知道添加什么值,建议设置默认值,特别int类型,比如默认值为0,在索引查询上,效率立显。

    5、建立索引,聚集索引则意味着数据的物理存储顺序,最好在唯一的,非空的字段上建立,其它索引也不是越多越好,索引在查询上优势显著,在频繁更新数据的字段上建立聚集索引,后果很严重,插入更新相当忙。

    6、组合索引和单索引的建立,要考虑查询实际和具体模式

    SQL语句

    熟悉SQL的人,都会写SQL语句,但到底效率如何,十万以下的数据量,根本没任何区别,但一些基础性的东西,还是得点滴做起

    1、where语句的书写,当有多个查询条件时,sql是按照从右往左的顺序进行执行,也就是说写在最后的条件会最早被执行,这就意味着过滤数据量最多的

    添加应该写在最后,这样才能在性能上达到最优

    2、join语句,如果A表1000w,B表30条记录,则应该是A join B,sql执行会以B为准去关联A,性能显著

    3、表变量和临时表 ,这个问题可能有些同学稍陌生,所谓表变量就是declare @dd  table类似这样的声明,而临时表多见#tt,这样的格式这二者在sql内是区别对待的表变量功能有限,使用完自动释放,临时表计划就是有数据表的大部分功能,使用完毕后需要删除,在数据库tempdb也有对应的操作记录,使用时应该综合考虑。

    4、注意聚合函数,is null,<>等的使用,当我们在这样使用的时候,可能习以为常,在大数据量处理上,本有的索引将不再被使用,而变成全表扫描,So ga等吧,性能大大的慢,如where  len(studentId)=0,本来在studentid上的索引变成全表扫描了。

    5、使用exist代替not in,这个大家都知道,但还是希望大家注意下

    6、select AA,BB,代替Select * ,这是大部分程序员的通病,总觉得无所谓,其实select * 在sql执行时还是要遍历到具体的字段名进行读取,即使我们要使用全部列,也推荐使用把各个字段都罗列处理,而非使用*

    7、top n 和order by 你了解多少?我一直觉得where条件查询完后order by在此基础上进行排序,其实错了,在有top n和order by一块使用时,order by竟然是全表扫描,具体可以通过查询计划验证。

    好了,今天先写这么多,随后继续对数据库性能和大数据量处理进行整理和一些心得进行书写。

    欢迎大家多交流。

     
    分类: SQL

    在上一篇从个人及其操作实例中总结的SQL知识进行介绍,大家议论很多,在此说明一点SQL优化真没有完全照搬的模式可以查看,由于各自的环境不同,性能瓶颈不同因此对应的效果不同。这也是为什么没有一个模块,大家按照此模块一二三执行下来数据库优化就完成了,查询效率就提高了,只能靠分析自己数据库的实际去解决,在资深惠普架构师汪洋的系列说明中可见一般。具体的知识还要看大家自己去结合说明去实践,一直觉得这样才是提高自我的最好方法.(好多东西,大家都验证过,我也不太懂,只能说自己对SQL执行的内核还不太了解,一些知识点的错误,希望大家多指正,多验证)

    考虑到处理数据一定要结合数据库自身实际,此篇就先从常用的辅助性能分析工具说起,SQL Server Profiler,性能计数器,执行计划,SQL Prompt等工具,也许平时都正在应用,下边结合自身使用进行介绍。

    SQL Server Profiler

        SQL Server提供的监控工具,在运行命令中输入“profiler”,也可以打开。此工具重点是监控在指定服务器上执行的SQL语句,存储过程等一切数据库的操作。对于分析数据库语句执行,死锁,性能瓶颈具有很好的作用。

        打开SQL Server Profiler后,是一个空框架,我们需要添加对应的跟踪(Trace),打开文件中的新建跟踪,则弹出服务器连接信息,此监控支持本地或服务器远程监控,输入对应的身份验证信息后,点击连接则打开“跟踪属性”设置界面,此处是本节要说的重点,好多都是直接点击"运行”,发现监控的内容忽忽闪,刚选定一行,一会又出来很多看不懂得东西,其实这就是缺少跟踪属性的有效设置,对于一个在服务器上运行的Trace,它监控的是好多数据库,好多连接,如果不有效的锁定要查看的对象,那几乎就是在刷屏。另外打开Trace会消耗服务器性能,建议慎重操作。

    下边说跟踪属性设置的几个点吧,个人观点哦:

    1、常规选项卡中,使用模块: Starndard(默认值),选择它就可以,无需更改

    2、打开事件选择选项卡,一般来讲我们打开监控都是有原因的,可能是想查看一个存储过程的执行,可能是T-SQL等等,根据实际锁定目标即可,不用的都可以不选取,这样Trace对这类执行直接Pass,比如我们只看存储过程,则抓图如下:

        这样Trace值跟踪存储过程的执行了,这还是有些不太满足要求,此时可以考虑添加列筛选,点击“列筛选器”,进行设置,当然我一般只做如下筛选,你可以结合自己的实际进行设置筛选条件,设置LoginName根据你查询的登录名,比如sa,设置Duration持续时间,大于等于2000(单位毫秒),这样就可以把大数据量的查询和性能较慢的给罗列出来包括CPU使用情况,Read,Write等参数,然后再分析对应的语句,找出问题所在,使用此工具可以快速锁定目标进行分析。

    性能计数器

         监控数据库的性能此工具也是必不可少,可以有效的监控机器的使用情况。通过SQL Server Profiler工具中的性能监视器进行打开,或者在运行命令中,输入perfmon进行打开。此工具只能查看本机的性能情况,无法监控远程机器。通过性能监控器可以查看当前时间点机器的各项使用指标包括CPU,IO,内存等等分析相关参数,找到是硬件配置过差,还是机器性能没有得到充分的发挥,找到问题的确切原因,然后才能进行对应的优化。

    在性能计数器中,默认机器上有很多计数器,此处重点需要添加如下几个进行观测:

    1、添加计数器,在菜单上,或右键打开,如下图,选择添加计数器

    2、选择你所关注的计数器:

      a、SQLServer:Buffer Manager计数器 ,在里边的参数中重点关注Buffer cache hit ratio,page life expectancy选中后,点击添加,确定后就能看到实时的检测

      b、Memory计数器,关注page reads/sec, pages/sec等

    具体参数和对应数值代表什么意思,可以查看官方的解释,很全面。

    通过计数器的实时检测,可以快捷的分析问题的所在,比如内存持续走高,cpu使用包含,缓存无效等等。找到问题对应的优化,该添加硬件添加硬件,该优化代码优化代码。

    执行计划

    这个很简单了,在SQL Server Studio中直接“查询”菜单下,选择显示执行计划即可,每次的执行就可以看出来,执行计划详细的罗列出来每次执行的cpu使用,消耗时间,逻辑读,物理读等参数,分析对应的数据记录进行优化即可,显示执行计划不难,难在如何对显示结果看明白,然后找到问题所在进行优化,相关的过程需要深入查看对应的内容。

    SQL Prompt 4

    Sql Server一个很不错的插件,值得推荐,通过它在2005及其之前的版本书写语句时会有自动提示,还可以检查语法,高亮显示对应关键字等,其中部分功能已经被集成在SQL Sersver2008及其以后的版本中,有兴趣的可以去下载,书写对应的sql语句方便不少呀。

    抓个图看看效果吧:

    好了,今天就先写这么多,重点都是一些工具的使用,这些在日常分析问题和寻求解决方法时,很有用的,分享给大家。

    非常感谢大家的沟通和交流,有问题多指正。

     
    分类: SQL
  • 相关阅读:
    2019春第十一周作业
    2019春第十周作业
    2019春第九周作业
    2019春第八周作业
    2019春第七周作业
    2019春第六周作业
    寒假作业一:打印沙漏
    寒假作业三:抓老鼠啊亏了~还是赚了?
    寒假作业二:币值转换
    秋季学期学习总结
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/2515277.html
Copyright © 2011-2022 走看看