SQL一个自定义表函数。
用Select 进行查询,group by 分组,SQL大致如下:
select sdorgname,sum(digit) from fn_[freeperiodmatstledger_single]() group by sdorgname
执行速度很慢,查看实际执行计划,78%都耗在对sdorgname排序上了,而我代码中(包含函数中的代码)都没有任何排序,没有Order by或Merge join这些东西,返回的实际结果却是排过序的,耗了这么多资源,这是怎么回事?函数到底是怎么执行的?

解决方案 »

  1.   

    sum(digit)因为你要合并求和,所以会先排好序,然后进行合并,你可以考虑加索引
      

  2.   

    group by sdorgname
    的结果是按照sdorgname进行排序.建议你对sdorgname建立索引再试试.
      

  3.   

    建议你对函数内对应原表的sdorgname字段建立索引
      

  4.   

    根据猜测改一下select sdorgname,digit INTO #tmp from fn_[freeperiodmatstledger_single]() 
    select sdorgname,sum(digit)  from #tmp
    group by sdorgnamedrop table #tmp
      

  5.   

    group by会自动排序?想不明白。
    从函数里边查询结果要怎么建索引啊?
    我对函数内表的sdorgname字段建立聚集索引,结果还是一样的啊。
    先将函数结果全部插入到临时表再分组不太好,因为函数返回的数据太多了,插入临时表速度很很慢,何况还要再查询一次 效率还不如直接查让它排序快了
      

  6.   

    我理解的表值函数处理过程是这样的:
    函数执行时,将返回的结果集写入至一个临时表。
    再对函数进行查询时,其实就是对这个临时表进行查询。
    不能对这个临时表创建索引。
    更不清楚为什么会自动排序,sum和group by 都不会干这勾当吧,觉得也没必要啊