翻译:魏波 审核:刘彦红

前言
PostgreSQL中的临时表
CREATE TEMPORARY TABLE tt_customer(customer_id INTEGER)ON COMMIT DELETE ROWS;
creation index tt_cusomer_idx_1 on tt_customer(customer_id);
VACUUM VERBOSE tt_customer;
ANALYZE VERBOSE tt_customer;
web_db=# BEGIN TRANSACTION;BEGINweb_db=# SELECT COUNT(*) FROM customers;count---------1030056(1 row)web_db=# CREATE TEMPORARY TABLE customers(web_db(# id INTEGERweb_db(# )web_db-# ON COMMIT PRESERVE ROWS;CREATE TABLEweb_db=# INSERT INTO customers(id) VALUES(1023);INSERT 0 1web_db=# SELECT COUNT(*) FROM customers;count-------1(1 row)web_db=# \dt *customers*List of relationsSchema | Name | Type | Owner-----------+----------------------+-------+----------pg_temp_5 | customers | table | postgresweb_app | customers | table | postgresweb_app | customers_historical | table | postgres(3 rows)web_db=# DROP TABLE customers;DROP TABLEweb_db=# \dt *customers*List of relationsSchema | Name | Type | Owner---------+----------------------+-------+----------web_app | customers | table | postgresweb_app | customers_historical | table | postgres(2 rows)web_db=# SELECT COUNT(*) FROM web_app.customers;count---------1030056(1 row)web_db=# SELECT COUNT(*) FROM customers;count---------1030056(1 row)
临时表的开发人员提示
web_db=# BEGIN TRANSACTION;BEGINweb_db=# CREATE TEMPORARY TABLE tt_customers(web_db(# id INTEGERweb_db(# )web_db-# ON COMMIT DELETE ROWS;CREATE TABLEweb_db=# SELECT COUNT(*) FROM tt_customers;count-------0(1 row)web_db=# INSERT INTO tt_customers(id)web_db-# SELECT customer_idweb_db-# FROM web_app.ordersweb_db-# WHERE order_dt <= NOW()-INTERVAL '6 MONTH';INSERT 0 1030056web_db=# SELECT COUNT(*) FROM tt_customers;count---------1030056(1 row)web_db=# DELETE FROM tt_customers cweb_db-# WHERE EXISTS(SELECT 1web_db(# FROM web_app.users u JOIN web_app.login lweb_db(# ON (l.user_id=u.user_id)web_db(# WHERE u.customer_id=c.idweb_db(# AND l.login_dt > NOW()-INTERVAL '6 MONTH'web_db(# );DELETE 194637web_db=# SELECT COUNT(*) FROM tt_customers;count--------835419(1 row)web_db=# UPDATE web_app.customers as c SET BONUS=5web_db-# FROM tt_customers tweb_db-# WHERE t.id = c.id;UPDATE 835419web_db=# SELECT COUNT(*) FROM tt_customers;count--------835419(1 row)web_db=# COMMIT TRANSACTION;COMMITweb_db=# SELECT COUNT(*) FROM tt_customers;count-------0(1 row)
临时表的DBA技巧
CREATE TEMPORARY TABLE tt_customer(customer_id INTEGER)ON COMMIT DROP;
Oracle中的全局临时表(GTT)
CREATE GLOBAL TEMPORARY TABLE tt_customer(customer_id NUMBER)ON COMMIT DELETE ROWS;
creation index tt_cusomer_idx_1 on tt_customer(customer_id);
exec dbms_stats.set_table_prefs(USER,’TT_CUSTOMER’,’GLOBAL_TEMP_TABLE_STATS’,’SESSION’);
exec dbms_stats.gather_table_stats(USER,’TT_CUSTOMER’);
select table_name from all_tables where temporary = 'Y';
全局临时表(GTT)的开发人员提示
SQL> SELECT COUNT(*) FROM tt_customers;COUNT(*)----------0SQL>SQL> INSERT INTO tt_customers(id)2 SELECT customer_id3 FROM orders4 WHERE order_dt <= ADD_MONTHS(SYSDATE,-6);1030056 rows created.SQL>SQL> SELECT COUNT(*) FROM tt_customers;COUNT(*)----------1030056SQL>SQL> DELETE FROM tt_customers c2 WHERE EXISTS(SELECT 13 FROM users u JOIN login l4 ON (l.user_id=u.user_id)5 WHERE u.customer_id=c.id6 AND l.login_dt > ADD_MONTHS(SYSDATE,-6)7 );194637 rows deleted.SQL>SQL> SELECT COUNT(*) FROM tt_customers;COUNT(*)----------835419SQL>SQL> UPDATE CUSTOMERS c SET BONUS=52 WHERE EXISTS(SELECT 1 FROM tt_customers tc WHERE tc.id=c.id);835419 rows updated.SQL>SQL> SELECT COUNT(*) FROM tt_customers;COUNT(*)----------835419SQL>SQL> COMMIT;Commit complete.SQL>SQL> SELECT COUNT(*) FROM tt_customers;COUNT(*)----------0SQL>
全局临时表(GTT)的DBA技巧
CREATE GLOBAL TEMPORARY TABLE tt_customer(customer_id NUMBER)ON COMMIT DELETE ROWS;
SQL> INSERT INTO tt_customers(id)2 SELECT l.user_id3 FROM users u JOIN login l4 ON (l.user_id=u.user_id)5 WHERE l.login_dt < ADD_MONTHS(SYSDATE,-12);194637 rows created.SQL>SQL> INSERT INTO tt_customers(id)2 SELECT user_id3 FROM web_deactive;2143 rows created.SQL>SQL> INSERT INTO tt_customers(id)2 SELECT user_id3 FROM web_black_list;4234 rows created.SQL>SQL> INSERT INTO customers_historical(id,name)2 SELECT c.id,c.name3 FROM customers c,4 tt_customers tc5 WHERE tc.id = c.id;201014 rows created.SQL>SQL> DELETE FROM customers c2 WHERE EXISTS (SELECT 1 FROM tt_customers tc WHERE tc.id = c.id );201014 rows deleted.
pg_global_temp_tables库
SELECT c.id,c.namFROM web_app.tt_customers tc,Web_app.customers cWHERE c.id = tc.id
CREATE OR REPLACE VIEW WEB_APP.TT_CUSTOMERS ASSELECT * FROM WEB_APP.SELECT_TT_CUSTOMERS();
CREATE OR REPLACE FUNCTION WEB_APP.SELECT_TT_CUSTOMERS() RETURNS TABLE(ID INR, NAME VARCHAR) AS $$BEGINCREATE TEMPORARY TABLE IF NOT EXISTS TT_CUSTOMERS(ID INT, NAME) ON COMMIT DROP;RETURN QUERY SELECT * FROM TT_CUSTOMERS;END;$$ LANGUAGE PLPGSQL;
摘要

最后修改时间:2019-11-06 10:14:57
文章转载自开源软件联盟PostgreSQL分会,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




