zoukankan      html  css  js  c++  java
  • 细心很重要---猜猜这个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。

        总结: 细心很重要!

  • 相关阅读:
    《软件需求十步走》阅读笔记一
    专业实训项目需求分析
    2015秋季学期个人阅读计划
    最后期限阅读笔记3
    最后期限阅读笔记2
    最后期限阅读笔记1
    你的灯亮着么阅读笔记3
    DPDK(二):准备知识7---linux虚拟网络设备
    DPDK(二)准备6---PMD
    DPDK(二):准备知识4 --- 无锁FIFO环形队列
  • 原文地址:https://www.cnblogs.com/double-K/p/5532621.html
Copyright © 2011-2022 走看看