细心很重要---猜猜这个SQL执行的什么意思

  今天在帮客户做语句优化的时候,突然遇到这样一个语句,类似下面的例子(原语句是个update)

  例子中使用AdventureWorks数据中的两个表。

  productID 是[Production].[Product] 表的主键,在[Purchasing].[PurchaseOrderDetail] 中也建立了非聚集索引

select name,(select count(*) from [Purchasing].[PurchaseOrderDetail] where ProductID = ProductID)
from [Production].[Product]
where ProductID = 341

  

-----------------------------------此处请在心中默念 执行语句的意思,会选择什么样的索引?-----------------------------------------

    

    首先来看一下 执行计划

    

    [Purchasing].[PurchaseOrderDetail]  为什么走索引扫描? 这明显应该索引查找啊!

    仔细看一下索引扫描的谓词

    

    我靠自己和自己匹配去了  ? 和你想的一样么?

    修改下代码~看看问题的所在

    

select name,(select count(*) from [Purchasing].[PurchaseOrderDetail] 

where ProductID =[Production].[Product].ProductID) 
from [Production].[Product] where ProductID = 341

    

    

    这是一个由于粗心而犯下的错误,例子中是一个查询,实际中却是一个update 影响可想而知,而这个影响在存储过程中久久没能发现,要不是优化查看了执行计划关系开销,我扫一眼代码也想当然的觉得完全没问题!

    问题得到解决,即解决的语句运行速度慢的问题,又找出了程序的BUG。

    总结: 细心很重要!

时间: 2024-12-13 10:59:31

细心很重要---猜猜这个SQL执行的什么意思的相关文章

SQL监控:mysql及mssql数据库SQL执行过程监控审计

最近生活有很大的一个变动,所以博客也搁置了很长一段时间没写,好像写博客已经成了习惯,搁置一段时间就有那么点危机感,心里总觉得不自在.所以从今天起还是要继续拾起墨笔(键盘),继续好好维护这个博客,写出心里最真实的想法,写出平时接触到的一些人和事以及一些新的技术.当然写博客也不是单纯的为了记录,也想通过博客来结交更多的朋友,今天在公司图书馆看到一句话大致说的是“在今天这个年代,已经很难等到三顾茅庐,诸葛亮也需要博客.微博和影响力”,在一年前就曾想过写一篇关于怎样通过博客来提高个人影响力的文章,我会尽

in和exists的区别与SQL执行效率

in和exists的区别与SQL执行效率最近很多论坛又开始讨论in和exists的区别与SQL执行效率的问题,本文特整理一些in和exists的区别与SQL执行效率分析 SQL中in可以分为三类: 1.形如select * from t1 where f1 in ('a','b'),应该和以下两种比较效率 select * from t1 where f1='a' or f1='b' 或者 select * from t1 where f1 ='a' union all select * fro

【分享】小工具大智慧之Sql执行工具

工具概况 情况是这样的,以前我们公司有很多Sql用于完成一些很不起眼但又不得不完成的业务,出于方便就直接在Sql查询分析器里执行,按理说应该写一些专门的工具的,但是这些脚本很多,于是我就写了这样一个小工具,只要Sql可以解决的问题就能用到它了,那么它有什么优点呢 一.以前写好的Sql可以不用怎么更改,只需要将参数部分提取出来按照定好的规范改成一个模版即可,使用工具加载模版时,工具会自动将模块要求的参数提供给用户填写. 二.模版文件里可以配置好连接字符串,这样不用每次都连接数据库,也避免连接错误的

基本sql语句--sql执行流程及调优

SQL分类 和大多数关系型数据库一样,mysql也具有以下几种类型的SQL语句: DML语句:主要用于新增,修改,删除和查询数据库的记录,关键字:insert,update,delete和select DCL语句:主要用于控制数据库对象(库,表,字段.用户等对象)的访问,关键字:grant,revoke DDL语句:主要用于定义和修改数据库对象的结构,常用关键字:create,drop,alter 注:DML(DELETE,UPDATE,SELECT)才 是我们关注的重点,而其中DELETE,U

Farseer.net轻量级开源框架 中级篇:SQL执行报告

导航 目   录:Farseer.net轻量级开源框架 目录 上一篇:Farseer.net轻量级开源框架 中级篇: 数据库切换 下一篇:Farseer.net轻量级开源框架 中级篇: 探究ORM(Mapping) 很多时候,我们希望能知道我们写的项目在运行过程中到底执行了哪些SQL语句,或者说一个页面中访问了几次数据库.好让我们在优化的时候提供一些方向. 举个例子,作者在有时候,会自信的认为这个页面很简单,估计也就顶多5条SQL语句就可以了.可是当打开SQL报告之后才吓傻眼,几十条SQL,看的

总有一种SQL执行计划绑定方式合适你

需要绑定SQL执行计划常见的几种情况: SQL执行计划突变,导致数据库性能下降,从历史执行计划找一个合理的,进行绑定. SQL无法使用更优的执行计划,且无历史执行计划,可通过hint手工构造的方式,进行绑定. 某些Bug引起优化器生成较差的执行计划.在bug修复前,进行绑定. ORACLE固定执行计划的3种方式: Oracle 9i使用outline (可跨版本10,11g均可使用) Oracle 10g使用sql profile (11g也可使用) Oracle 11g使用sql plan m

SQL 执行计划(一)

缓存执行计划  SQL Server 2008提供了一些服务器对象来分析执行计划Sys.dm_exec_cached_plans:    包含缓存的执行计划,每个执行计划对应一行.Sys.dm_exec_plan_attributes: 这是一个系统函数,每一个执行计划都对应着一些属性,在这个系统函数中包含着这些属性.Sys.dm_exec_sql_text:             这是一个系统函数,返回文字格式的执行计划.Sys.dm_exec_query_plan:        这是一个

Spring AOP监控SQL执行

对数据库连接池Proxool比较熟悉的读者,都知道Proxool可以记录SQL执行内容和时间等信息日志.我们可以将该日志记录专门的SQL日志文件,对于查找执行特别耗时的SQL起了不小的作用.对于一些其他连接池,没有该特性时,本文介绍Spring AOP切面方法来记录SQL日志. 当然也可以通过数据库提供的特性来查询执行效率较低的SQL,本文不做探讨. 本文介绍使用SpringJdbcTemplate执行SQL,使用其他方法或者ORM思路类似(Hibernate提供了日志记录功能). 使用AOP,

用scala实现一个sql执行引擎-(上)

前言 在实时计算中,通常是从队列中收集原始数据,这种原始数据在内存中通常是一个java bean,把数据收集过来以后,通常会把数据落地到数据库,供后面的ETL使用.举个一个简单的例子,对一个游戏来说,为了统计某个游戏,某个服务器的登陆注册 等事件,原始数据对应的java bean可能会是这样: public class Event { private String userName; private String game; private String server; private Stri