子查询作为表时,表外加条件查询效率特别慢。

SELECT M.STOCK_NAME, M.TRADE_DAYS, M.STOCK_COUNT, M.TF
  FROM (SELECT T.STOCK_NAME,
               TIME_TO_MARKET(T.STOCK_NAME) TRADE_DAYS,
               T2.STOCK_COUNT,
               CASE
                 WHEN TIME_TO_MARKET(T.STOCK_NAME) = T2.STOCK_COUNT THEN
                  1
                 ELSE
                  0
               END TF
          FROM (SELECT STOCK_NAME
                  FROM JQDATA.ORDER_ACTIVITIES
                 GROUP BY STOCK_NAME) T
          LEFT JOIN (SELECT STOCK_NAME, COUNT(1) STOCK_COUNT
                      FROM JQDATA.ORDER_ACTIVITIES
                     GROUP BY STOCK_NAME) T2
            ON T2.STOCK_NAME = T.STOCK_NAME) M
 WHERE M.TF = 0

以其它字段作为条件的时候没啥问题,case when字段作为条件字段查询特别慢。

你这sql和下面这个貌似是等价的

SELECT STOCK_NAME,
       TIME_TO_MARKET(T.STOCK_NAME) TRADE_DAYS,
       COUNT(1) STOCK_COUNT,
       CASE  WHEN TIME_TO_MARKET(T.STOCK_NAME) = T2.STOCK_COUNT THEN
          1  ELSE 0  END TF
  FROM JQDATA.ORDER_ACTIVITIES
 GROUP BY STOCK_NAME
having TIME_TO_MARKET(T.STOCK_NAME) <> COUNT(1)

其实效率点应该先考虑一下这个TIME_TO_MARKET自定义函数,毕竟这玩意要作为条件使用,看能不能把逻辑拆开,放到sql里