当前位置: 代码迷 >> Sql Server >> sql查询优化有关问题 去掉了一个嵌套in查询居然更慢了,为什吗
  详细解决方案

sql查询优化有关问题 去掉了一个嵌套in查询居然更慢了,为什吗

热度:58   发布时间:2016-04-24 08:57:31.0
sql查询优化问题 去掉了一个嵌套in查询居然更慢了,为什吗?
本帖最后由 liuhong_0325 于 2015-07-22 11:23:01 编辑
sql查询优化问题  望大侠们帮忙解答下~

SELECT * FROM(
            SELECT ROW_NUMBER() OVER(ORDER BY ProductCode) RN,[dbo].get_DeptCodes('A',Product.productcode) as id,[dbo].get_DeptNames('A',Product.productcode) as deptName,
            [dbo].get_DeptNames('B',Product.productcode) as deptNameB, ProductCode,ProductName,Packing,Manufacturer,OurPrice,PurchasePrice
            ,MerchantManageCode,FinancialType FROM
 Product(NOLOCK)  WHERE ProductCode IN(
            SELECT distinct ProductCode FROM OrderProducts(NOLOCK) WHERE OrdersCode IN(
            SELECT distinct OrdersCode FROM Orders(NOLOCK) WHERE OrderTime BETWEEN CONVERT(DATETIME, CONVERT(varchar(7), dateadd(mm,-1,getdate()) , 120) + '-1') AND GETDATE()
            )) 
            AND 1=1
            ) TB WHERE TB.RN BETWEEN 1 AND 20
 这一段在库中执行时间一般是2秒,我去掉一个in的查询后居然会要16秒这么久。这个是为什么??
SELECT * FROM(
            SELECT ROW_NUMBER() OVER(ORDER BY ProductCode) RN,[dbo].get_DeptCodes('A',Product.productcode) as id,[dbo].get_DeptNames('A',Product.productcode) as deptName,
            [dbo].get_DeptNames('B',Product.productcode) as deptNameB, ProductCode,ProductName,Packing,Manufacturer,OurPrice,PurchasePrice
            ,MerchantManageCode,FinancialType FROM
 Product(NOLOCK)  WHERE ProductCode IN(
            SELECT distinct ProductCode FROM OrderProducts(NOLOCK) WHERE CreationDate BETWEEN CONVERT(DATETIME, CONVERT(varchar(7), dateadd(mm,-1,getdate()) , 120) + '-1') AND GETDATE()
            ) 
            AND 1=1
            ) TB WHERE TB.RN BETWEEN 1 AND 20
    orders表是没有索引的。 OrderProducts和Product表都有索引。去掉了没有索引的表的in居然会更慢。。实在是搞不懂为什吗!
------解决思路----------------------

SELECT * FROM(
            SELECT ROW_NUMBER() OVER(ORDER BY ProductCode) RN,[dbo].get_DeptCodes('A',Product.productcode) as id,[dbo].get_DeptNames('A',Product.productcode) as deptName,
            [dbo].get_DeptNames('B',Product.productcode) as deptNameB, ProductCode,ProductName,Packing,Manufacturer,OurPrice,PurchasePrice
            ,MerchantManageCode,FinancialType 
FROM Product(NOLOCK) x,(SELECT distinct ProductCode FROM OrderProducts(NOLOCK) 
WHERE CreationDate BETWEEN CONVERT(DATETIME, CONVERT(varchar(7), dateadd(mm,-1,getdate()) , 120) + '-1') AND GETDATE()) y 
WHERE  x.ProductCode = y.ProductCode
            ) TB WHERE TB.RN BETWEEN 1 AND 20

试试这个,看效率怎么样↑
------解决思路----------------------
看起来 OrderProducts 是 Orders 的明细,OrderProducts.OrdersCode 应该有索引。
所以 OrdersCode IN 可以走索引;而 CreationDate BETWEEN 要全文检索了,速度当前不行。
第二种写法需要在 OrderProducts(CreationDate) 上建索引。
  相关解决方案