2013-02-08 3 views
1

는이 전 다음을 수행 plpgsql 기능을 작성했습니다 가정 해 봅시다 :

CREATE OR REPLACE FUNCTION foobar (_foo_data_id bigint) 
RETURNS bigint AS $$ 
BEGIN 

    DROP TABLE IF EXISTS tmp_foobar; 

    CREATE TEMP TABLE tmp_foobar AS 
    SELECT * 
    FROM foo_table ft 
    WHERE ft.foo_data_id = _foo_data_id; 

    -- more SELECT queries on unrelated tables 

    -- a final SELECT query that invokes tmp_foobar 

END; 

첫 번째 질문 : 나는 동시에 두 번이 함수를 호출하면

, 그것은 가능합니다 foobar()의 두 번째 호출이 tmp_foobar 테이블을 삭제하는 동안 foobar()의 첫 번째 호출이 아직 실행 중입니까?

나는 SELECT 문이 ACCESS SHARE 잠금을 만드는 것이 이해하지만 그 잠금 장치는 SELECT 문이 완료 또는 함수의 끝에서 암시 COMMIT 때까지 때까지 지속됩니다?

두 번째 질문 :

후자가 true의 경우, 잠금이 삭제 될 때까지 foobar()의 두 번째 호출이 무기한 DROP TABLE IF EXISTS tmp_foobar;을 다시 시도 할 것이다 또는 어떤 시점에서 실패?

+0

나는 이것을 시작하기 위해 임시 테이블을 사용하지 않을 것이다. 하나의 (큰) SELECT가 더 빠르다면 놀랄 일이 아닙니다. SQL Server 배경에서오고 있습니까? –

+0

@a_horse_with_no_name 제 질문은 소규모 사례이며 실제 코드를 나타내지는 않습니다. 임시 테이블을 사용하는 이유는이 질문의 범위를 벗어납니다. –

답변

3

동시에 두 번 함수를 호출하면 두 개의 별도 세션을 사용하여 함수를 호출하는 것입니다. 임시 테이블은 세션간에 공유되지 않으므로 두 번째 세션은 첫 번째 세션에서 tmp_foobar를 "보지"않으며 상호 작용이 발생하지 않습니다. http://www.postgresql.org/docs/9.2/static/sql-createtable.html#AEN70605 ("임시 테이블")을 참조하십시오.

잠금이 (상관없이 당신이 그들을 취득 방법.; 예외가 자문 잠금하지만, 그건 당신이 무슨 일을하는지 아니다) 트랜잭션이 끝날 때까지 지속

두 번째 질문 대답을 필요로하지 않는다, 전제가 거짓이기 때문입니다.

한 가지 더. 임시 테이블에 인덱스를 작성하고 분석하는 것이 유용 할 수 있습니다. 최종 쿼리가 빨라질 수 있습니다.