none
求帮助优化下SQL语句 RRS feed

  • 问题

  • 下面的语是查询产品并且把同一家公司的数据放在一起显示取最新的3条产品记录。最后还要把最后发布产品的公司排在最前面。

    select top 20 * from (
    SELECT TOP 100 Percent ReCompanyID,Max(productdatetime) productdatetime From GQ_Product group by ReCompanyID
    ) P left join  
    (
    SELECT TOP 100 Percent * FROM (
    SELECT rid=ROW_NUMBER() OVER(PARTITION BY ReCompanyID ORDER BY productdatetime DESC),* FROM GQ_Product
    ) PP  
    WHERE PP.rid<=3 order by PP.ReCompanyID
    ) PPP ON P.ReCompanyID=PPP.ReCompanyID order by P.productdatetime desc

    2010年8月30日 3:51

答案

  • 索引的问题, 这个要看看执行计划, 在你创建索引后, 变慢了, 这说明执行计划改变了, 这说明新建的索引确实对查询优化器产生了影响, 至于为什么变慢, 那就要看索引添加前后执行计划的差异
    • 已标记为答案 Mog Liang 2010年9月22日 1:11
    2010年8月31日 4:46

全部回复

  • ReCompanyID,productdatetime 上建立复合索引
    2010年8月30日 4:26
  • 另外, 你应该有一张专门的产品表吧?  这样产品的 List 和 productdatetime 可以直到取(如果你经常这样查的话, productdatetime应该设计为在数据变化时更新它)

    2010年8月30日 4:30
  • 加了索引后变得更慢了
    2010年8月30日 5:59
  • 不要用left join,你看看执行计划,变慢是因为执行计划变了,还是缓存的关系?你怎么建的复合索引?
    想不想时已是想,不如不想都不想。
    2010年8月30日 8:31
    版主
  • 如果不带 left join 的效率很好, 那么你先把那 top 20 的数据放入临时表, 然后用临时表去取ReCompanyID 的对应3条

    另外, outer apply 可能会更好一些

     

    select top 20 * 
    from (
    	SELECT
    		ReCompanyID,Max(productdatetime) productdatetime 
    	From GQ_Product 
    	group by ReCompanyID
    ) P 
    	OUTER APPLY(
    			SELECT TOP 3
    				*
    			FROM GQ_Product
    			WHERE ReCompanyID = P.ReCompanyID
    			ORDER BY productdatetime DESC
    	)PP
    ORDER BY P.productdatetime DESC
    
    
    2010年8月31日 4:44
  • 索引的问题, 这个要看看执行计划, 在你创建索引后, 变慢了, 这说明执行计划改变了, 这说明新建的索引确实对查询优化器产生了影响, 至于为什么变慢, 那就要看索引添加前后执行计划的差异
    • 已标记为答案 Mog Liang 2010年9月22日 1:11
    2010年8月31日 4:46