질문하신 글의 답변은 아닙니다.
질문 내용중
오라클의 select 1 from dual처럼 없는 테이블로....
라는 문장에 대해 이해를 돕고자 글을 적습니다.
없는 테이블이라고 말씀하셨는데,
DUAL 역시 테이블 입니다.
Oracle에서 제공하는 더미 테이블입니다.
desc dual;
하시면 확인할 수 있습니다.
DUMMY라는 컬럼을 가지고 있으며, 테이블에 1 건의 데이터가
존재합니다.
값은 'X'입니다. 말그대로 더미죠..
예를 들어
SELECT 1
FROM DUAL;
과
SELECT 1
FROM ALL_OBJECTS
WHERE ROWNUM = 1;
은 동일한 결과를 나타냅니다.
이것은 반드시 DUAL을 통하지 않더라도 적절한 질의문을 던질 수
있다는 이야기입니다.
문제는 각 테이블과 뷰가 가지고 있는 데이터의 건수에 관련이
있습니다.
예를 들어
DELETE DUAL;
SELECT 1
FROM DUAL;
ROLLBACK;
위와 같은 문장을 실행해보면
분명 no data found라는 메세지가 나타날겁니다.
DUAL에 데이터가 존재하지 않으므로 질의를 수행할 수 없다는거죠.
ALL_OBJECTS라는 뷰를 조회할때 1행으로 제약을 두었는데
만일 질의문에서 행제약 조건을 제거한다면
ALL_OBJECTS에 존재하는 데이터의 건수 만큼 1 을 출력하게
됩니다.
요는 해당 테이블에 데이터 존재를 확인하고, 그 데이터와
연관 지어 질의가 수행된다는 것입니다.
이해가 가셨는지..
다음과 같은 문장은 단순하지만 대량의 데이터에 적용할 경우
속도에 큰 차이를 보입니다.
SLECT COUNT(1)
FROM ALL_OBJECTS;
SELECT COUNT(*)
FROM ALL_OBJECTS;
위의 두 문장은 동일한 결과를 나타내지만
결과값을 가져오는 경로는 차이가 있습니다.
첫번째 문장은 ALL_OBJECTS에 접근해서 데이터의 존재만을 확인하고 바로 1을 COUNT
합니다.
하지만 두번째 문장은 ALL_OBJECTS에 접근해서 데이터의 존재를 확인하고 데이터를
직접 엑세스 해서 카운트를 합니다.
당연 첫번째 문장이 빠르겠죠.
그와 비슷한 예로
CREATE TABLE ALL_OBJECTS_TEST
AS SELECT *
FROM 1 = 2;
CREATE TABLE ALL_OBJECTS_TEST
AS SELECT *
FROM ROWNUM = 1;
동일한 스키마를 생성하는 문장입니다.
위의 문장도 해당 테이블에 대량의 데이터가 존재하는 경우 수행 속도의
차이가 보여집니다.
구문 해석의 순서에 의해 데이터를 엑세스 하느냐 그렇지 않느냐의
차이때문이죠.
적다보니 말이 엉뚱한 곳으로 가버렸네요..
어쨌거나 제 생각에는
인터베이스를 접해보지는 않았지만
행제약을 수행할 수 있다면 님께서 원하시는 작업역시
무리 없이 행할 수 있을것이라 추측 됩니다. ^^a
|