首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

group by 非常慢 怎么处理

2012-06-10 
group by 非常慢 怎么办SQL codemysql中一万条数据group by非常慢 目前加索引了 还是很慢SELECTIFNULL(FUN

group by 非常慢 怎么办

SQL code
mysql中一万条数据group by非常慢 目前加索引了 还是很慢                                 SELECT                                     IFNULL(FUN_GET_BANK_NAME(CARD_NO), '其他') AS BANKNAME,                                    IFNULL(FUN_GET_CARD_NAME(CARD_NO), '其他') AS CARDNAME,                                    COUNT(*) AS COUNT,                                    SUM(IFNULL(TR_AMT, 0)) AS TR_AMT,                                    SUM(IFNULL(FEE_AMT, 0)) AS FEE_AMT                                                FROM T_MIS_LOG t                                WHERE CONCAT(t.MTI, t.TRAN_TYPE) IN ('0200000000','0290000000')                                GROUP BY FUN_GET_BANK_NAME(CARD_NO) ,FUN_GET_CARD_NAME(CARD_NO) 


[解决办法]
对mysql不太了解,可以转到mysql板块去问一下。
[解决办法]
SELECT 
IFNULL(FUN_GET_BANK_NAME(CARD_NO), '其他') AS BANKNAME,
IFNULL(FUN_GET_CARD_NAME(CARD_NO), '其他') AS CARDNAME,
COUNT(id) AS COUNT
FEE_AMT
FROM T_MIS_LOG t
WHERE CONCAT(t.MTI, t.TRAN_TYPE) IN ('0200000000','0290000000')
GROUP BY FUN_GET_BANK_NAME(CARD_NO) ,FUN_GET_CARD_NAME(CARD_NO)

然后
 SUM(IFNULL(TR_AMT, 0)) AS TR_AMT
SUM(IFNULL(FEE_AMT, 0)) ASFEE_AMT
分别试一下
看下哪个最慢

[解决办法]
我觉得楼主的SQL 慢在了使用了这两个函数FUN_GET_BANK_NAME(CARD_NO) ,FUN_GET_CARD_NAME(CARD_NO)在SQL 中。group by的字段应该使用表字段会快很多。

如果你系统中有相应的表 保存了card no 和bankname以及cardname的信息,你可以直接把这几个表和T_MIS_LOG 这个进行一个left join,然后再group by。这样会快很多。一万条数据不算大。


[解决办法]
FUN_GET_BANK_NAME 是你自定义的函数?

用户自定义函数效率 必须的低。。。
[解决办法]
4.5 楼有理
[解决办法]
select 
IFNULL(FUN_GET_BANK_NAME(CARD_NO), '其他') AS BANKNAME,
IFNULL(FUN_GET_CARD_NAME(CARD_NO), '其他') AS CARDNAME,
SUM(COUNT) AS COUNT,
SUM(TR_AMT) AS TR_AMT,
SUM(FEE_AMT) AS FEE_AMT
FROM (
SELECT CARD_NO,
COUNT(*) AS COUNT,
SUM(IFNULL(TR_AMT, 0)) AS TR_AMT,
SUM(IFNULL(FEE_AMT, 0)) AS FEE_AMT
FROM T_MIS_LOG t
WHERE CONCAT(t.MTI, t.TRAN_TYPE) IN ('0200000000','0290000000')
GROUP BY CARD_NO
) AS prestatic
GROUP BY
IFNULL(FUN_GET_BANK_NAME(CARD_NO), '其他'),
IFNULL(FUN_GET_CARD_NAME(CARD_NO), '其他')

热点排行