sql查询优化问题 望大侠们帮忙解答下~
SELECT * FROM(这一段在库中执行时间一般是2秒,我去掉一个in的查询后居然会要16秒这么久。这个是为什么??
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
SELECT * FROM(orders表是没有索引的。 OrderProducts和Product表都有索引。去掉了没有索引的表的in居然会更慢。。实在是搞不懂为什吗!
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
------解决思路----------------------
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) 上建索引。