with_select

本文除了会讲with select,还会讲with delelte等其他,与with有关的语句。

使用

with查询

貌似速度还慢了一点,不是说是临时表,放到内存里面的吗?貌似没有什么变化,查看执行计划的时候,使用的是hash连接。

DROP TABLE IF EXISTS marked_ship_unqi2;
CREATE TABLE marked_ship_unqi2 WITH ( 
    APPENDONLY = TRUE,
    COMPRESSLEVEL = 5,
    ORIENTATION = COLUMN,
    COMPRESSTYPE = ZLIB 
) AS 
WITH get_ship_ids AS (
    SELECT
        ship_id
    FROM
        test_scan_qian
) 
SELECT
    ship_id,
    string_agg (ship_type, '|') AS ship_type
FROM
    (
        SELECT
            ship_id,
            ship_type
        FROM
            marked_ship
        WHERE
            ship_id IN (SELECT * FROM get_ship_ids)
        GROUP BY
            ship_id,
            ship_type
    ) AS f
GROUP BY
    ship_id
DISTRIBUTED BY (ship_id);

两次结果

SELECT 11897739
Time: 71646.131 ms


SELECT 11897739
Time: 60675.651 ms

普通的查询

DROP TABLE IF EXISTS marked_ship_unqi2;
CREATE TABLE marked_ship_unqi2 WITH ( 
    APPENDONLY = TRUE,
    COMPRESSLEVEL = 5,
    ORIENTATION = COLUMN,
    COMPRESSTYPE = ZLIB 
) AS SELECT
    ship_id,
    string_agg (ship_type, '|') AS ship_type
FROM
    (
        SELECT
            ship_id,
            ship_type
        FROM
            marked_ship
        WHERE
            ship_id IN (
                SELECT
                    ship_id
                FROM
                    test_scan_qian
            )
        GROUP BY
            ship_id,
            ship_type
    ) AS f
GROUP BY
    ship_id
DISTRIBUTED BY (ship_id);
SELECT 11897739
Time: 61671.782 ms

迁移数据

将删除数据保存到临时表,然后再从临时表内,将数据插入到新表中。

WITH tmpdel AS
(DELETE FROM emp_order_insurance WHERE empid =1002 RETURNING *) INSERT INTO emp_order_insurance_his
SELECT* FROM tmpdel;