`
yefeishan
  • 浏览: 108731 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
最近访客 更多访客>>
社区版块
存档分类
最新评论

写有效率的sql

阅读更多

目的:SQL的执行次数、逻辑IO、物理IO、执行消耗CPU时间等

方法:

  • where 条件下面使用索引字段,无法估算不同查询计划开销优劣,而只能采用最稳妥的Scan(不管是table scan还是clustered index scan)。
  • 尽量不使用不等于(!=)或者NOT逻辑运算符,索引是一颗B树,index seek是查找从B树的根节点开始,一级一级找到目标行。index scan则是从左到右,把整个B树遍历一遍。假设唯一的目标行位于索引树(假设是非聚集索引,树深度2,叶节点占用k页物理存储)最右的叶节点上,index seek引起的IO4,而index scan引起的IOK,性能差别巨大。关于索引,可以仔细读读联机文档关于物理数据库体系结构部分
  • 查询条件中不要包含运算,

    这些运算包括字符串连接(如:select * from Users where UserName + ‘pig’ = ‘张三pig’),通配符在前面的Like运算(如:select * from tb1 where col4 like ‘%aa’),使用其他用户自定义函数、系统内置函数、标量函数等等(如:select * from UserLog where datepart(dd, LogTime) = 3)。

             在处理以上语句时,一样没办法估算开销。最终结果当然是clustered index scan或者table scan

  • 查询条件中不要包含同一张表内不同列之间的运算,

    所谓的“运算”包括加减乘除或通过一些function(如:select * from tb where col1 – col2 = 1997),也包括比较运算(如:select * from tb where col1 > col2)。这种情况下,一样没办法估算开销。不论col1col2上都有索引还是创建了col1col2上的覆盖索引还是创建了col1 include col2的索引。

    但是这种查询有解决办法,可以在表上多创建一个计算字段,其值设置为你的“运算”结果,再在该字段上创建一个索引,就Ok

  • Log类的表,不要有事没事加个自增的Id列。这事相信干过的人很多,哈,而且一般还会顺手在这个Id列上加上个primary key的约束,聚集索引也就被无意识的建上了。就像一个记录用户活动的日志表,一般会有这么几个典型字段:IdLogTimeUserId。实际上对这种表的查询,大多集中在LogTimeUserId上,Id完全没有实际意义。你的客服系统查找的,可能仅仅是某个用户的操作记录(一般按时间排序的),或者你的报表系统要生成每天的用户操作统计。想想看,如果干脆砍了Id列,并直接把聚集索引创建在LogTime上多爽。

  • 不要是个表就给加个primary key约束就像上面的例子,primary完全没必要。呵呵,这条看着简单是简单了,犯这错误的人,那也不比3

  • where条件里对同一个表中的列做运算或比较,以为创建某种类型的索引可以提高效率。(这种情况下,任何索引都无法提升性能。见过了无数的这种写法。最常见的,如:一张用户表里有用户注册时间(t1,YYYYDD),有退订时间(t2,YYYYDD),现在让你获取存活时间大于3天的用户总数:很多人一不注意,就整一个select count(*) from Users where t1 – t2 > 3出来。而且常常会臆测在t1t2上建个涵盖索引(或者分别在t1t2上建索引)会让性能提升。

  • 在表上创建了col1col2顺序的涵盖索引(聚集的或非聚集的),但是where条件里就一个col2 > XXX。这种情况下,就不如分别在col1col2上创建索引

  • 存储过程中使用局部变量而不使用参数变量(就是存储过程输入参数)做where条件

  • 查询条件中的类型不匹配。所谓的类型不匹配是说,查询条件where AAA = @var,列AAA的定义和@var不同。例如,AAAvarchar(64)@varbigint。这种情况下,非常有可能让本来是index seek的运算变成index scan,在大数据量表中,性能差距会非常明显

分享到:
评论

相关推荐

    让数据库更有效率(SQL)

    "让数据库更有效率(SQL)"这一主题旨在探讨如何优化SQL查询,提高数据库操作的性能和效率。以下是一些关键的知识点,它们对于理解和实践SQL性能优化至关重要。 1. **WHERE子句**:WHERE子句是SQL查询的基础,用于...

    退保率.sql

    《退保率.sql》是一个与保险行业相关的SQL脚本文件,它主要涉及到数据分析和业务统计方面的知识。在保险行业中,退保率是衡量保险公司经营状况和产品吸引力的重要指标。通过这个脚本,我们可以深入理解如何利用...

    2018SqlServer Sql Prompt

    使用"2018 SQL Server Sql Prompt"这款插件,开发者和DBA可以在日常工作中享受到智能化和个性化的便利,降低出错率,提升开发和维护的效率。对于大型项目或复杂数据库环境,它的价值更为显著。因此,无论你是SQL ...

    支持sqlserver2014的自动提示插件SQLPrompt_9.0

    这不仅包括表名、列名,还包括函数、存储过程和其他SQL语句的关键字,极大地减少了手动输入的时间和错误率。 2. **代码片段与模板**:SQLPrompt提供了丰富的预定义代码片段,允许用户快速插入常用的SQL结构,如JOIN...

    SQL Monitor中文版

    1. **实时监控**:SQL Monitor可以实时显示SQL Server的性能指标,如CPU使用率、内存消耗、磁盘I/O等,帮助管理员快速识别性能瓶颈。 2. **健康检查**:工具会定期进行健康检查,评估SQL Server的整体运行状况,...

    Java Sql 格式化工具

    而其内嵌的SQL格式化工具则能够帮助开发者统一SQL语句的风格,使代码更易于阅读和理解,从而降低出错率和团队协作难度。 "SqlFor"标签可能是指这个工具是专门为Java开发者设计的SQL格式化解决方案。在Java编程环境...

    ORACLE SQL性能优化系列

    在 FROM 子句中,选择最有效率的表名顺序非常重要。 四、其他优化技术 除了以上几点以外,ORACLE 还提供了许多其他的优化技术,例如:索引、视图、物化视图、分区表、并行查询等等。这些技术可以帮助开发者和...

    SQL语句编写指导文档

    1. **选择最有效率的表名顺序**:在基于规则的优化器中,查询优化器通常会根据表的顺序进行操作。因此,应将小表放在FROM子句的前面,大表放在后面,以减少排序和连接的开销。 2. **WHERE子句中的连接顺序**:优化...

    SQL Prompt sql语句提示插件

    这款工具适用于SQL Server 2000到2008等多个版本,它以其智能化的代码补全、格式化和优化建议等功能,极大地简化了SQL编写过程,降低了出错率,从而提升了开发人员的工作效率。 首先,SQL Prompt的核心特性之一是...

    SQLMonitor.rar 监控oracle sql

    在使用过程中,要学会识别并理解如执行时间、CPU使用率、读写次数等关键指标,以便进行有效的故障排除和性能优化。 总的来说,SQLMonitor是一款强大的工具,它为Oracle SQL的监控提供了便利,对于提升数据库管理...

    SQL中将日期转换为中文大写

    但如果日期转换是系统的关键部分,或者需要处理大量数据,那么存储过程可能会更有效率。在选择方法时,还需要考虑数据库系统的兼容性,因为不同的SQL方言可能支持不同的函数和语法。 总的来说,SQL中将日期转换为...

    SQLPrompt_7.2.4.291(含注册机+图文安装)完美支持SQL2008R2,2012,2014,2016

    SQL Prompt是立即可用的且能极大的提高生产率。支持SQL 2016 亲测有效!不过我激活的时候是在2008 R2下激活,退掉2008重新打开2006已经生效,有图有真相!(安装完成后请断网激活) 一:顺利的编写SQL代码 根据部分...

    SQLTracker oracle跟踪工具

    SQLTracker就是这样一款工具,它能够帮助我们有效地实现这一目标。 1. **SQL语句跟踪** SQLTracker能够实时追踪数据库中的SQL语句,记录每一条SQL的执行情况,包括执行时间、返回结果、资源消耗等关键信息。这对于...

    SQL专家云1.0

    平台提供实时的数据库监控功能,可以跟踪数据库的运行状态,包括CPU使用率、内存占用、磁盘I/O等关键指标,以及SQL查询的执行时间,帮助用户及时发现和预防性能问题。 3. **SQL诊断与建议**: SQL专家云1.0具有...

    SQL Server 2008内存及IO性能监控

    3. **监视内存使用**:使用`sys.dm_os_performance_counters`动态管理视图,可以查看如“缓冲区缓存命中率”等计数器,评估内存使用效率。此外,`sys.dm_os_memory_clerks`可以显示内存分配的详细信息。 4. **内存...

    sql assistant,sql助手,sql自动提示工具

    通过以上特性,SQL Assistant成为了数据库开发和管理中不可或缺的辅助工具,尤其对于初学者和频繁处理SQL语句的专业人士,它极大地提升了工作效率,降低了出错率。使用这样的工具,用户可以更加专注于业务逻辑,而非...

    Oracle数据库sql语句 跟踪器

    2. **性能指标**:显示每个SQL语句的执行时间、CPU使用率、I/O操作、缓冲区命中率等关键指标,帮助定位性能问题。 3. **等待事件分析**:分析SQL语句等待的事件类型,如 latch、buffer busy waits等,揭示可能导致...

    基于SQL语法树的SQL注入过滤方法研究.pdf

    实验结果表明,这种基于SQL语法树的过滤方法在防止SQL注入攻击方面表现优秀,具有较高的【拦截率】和较低的【误报率】,这对于提升Web应用的安全性至关重要。此外,通过【参考文献】和【专业指导】,该研究也体现了...

    通过分析SQL语句的执行计划优化SQL.doc

    在优化SQL时,使用绑定变量是提高共享SQL利用率的有效手段。绑定变量允许SQL语句中的某些值被动态替换,而不改变语句的结构。例如,`SELECT * FROM people WHERE pin = :blk1.pin`,这里的`:blk1.pin`就是一个绑定...

Global site tag (gtag.js) - Google Analytics