PK(인덱스)를 2개 컬럼에 지정했을경우 Select 할때도 2개컬럼을 지정해주어야 하나요? 0 5 960

by 곰장어 [SQL Query] [2021.04.27 11:24:01]


컬럼1에는 중복되는 값이 들어있고

컬럼2에는 유니크한 값이 들어있는데

컬럼1,컬럼2 를 묶어서 하나의 PRIMARY KEY 로 지정하였습니다. (컬럼1,컬럼2에 자동으로 인덱스 생성)

이때 쿼리문 작성시 Select * FROM 테이블명 WHERE 컬럼1=값 AND 컬럼2=값 

이런식으로 작성해주어야 하는지

아니면 그냥 Select * FROM 테이블명 WHERE 컬럼2=값 

이렇게만 해주어도 되는지 질문드립니다 감사합니다.

 

by pajama [2021.04.27 12:41:36]

컬럼1, 컬럼2 순서로 인덱스를 만드셨다면, WHERE절에 컬럼1 조건이 포함되어야 인덱스를 사용할 수 있습니다.

플랜을 보시면 명확합니다.


by 곰장어 [2021.04.27 13:35:02]

그럼 

Select * FROM 테이블명 WHERE 컬럼1=값 AND 컬럼2=값  

이렇게 작성해야 인덱스 효과를 볼수있다는 말씀인가요?

제가 입문자라 플랜을 본다는게 뭔지 몰라서 구글링을 해보겠습니다,,

 


by pajama [2021.04.27 14:27:48]

WHERE 컬럼1=값 AND 컬럼2=값

또는 

WHERE 컬럼1=값

이어야 겠죠.

아래는 플랜을 확인하는 예시입니다. 여기 강좌나 인터넷을 찾아보시면 다른 방법도 있습니다~

 

SQL> create table t as
select 1 a, level b, level + 2 c from dual connect by level < 10
union all
select 2 a, level b, level + 2 c from dual connect by level < 10
union all
select 3 a, level b, level + 2 c from dual connect by level < 10
union all
select 4 a, level b, level + 2 c from dual connect by level < 10

Table created.

SQL> create unique index pk_t on t (a,b);

Index created.

SQL> alter table t add constraint pk_t primary key (a,b) using index pk_t;

Table altered.

SQL> explain plan for select a,b,c from t where b=2;

Explained.

SQL> select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 2153619298

--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |     1 |    39 |     3   (0)| 00:00:01 |
|*  1 |  TABLE ACCESS FULL| T    |     1 |    39 |     3   (0)| 00:00:01 |
--------------------------------------------------------------------------

SQL> explain plan for select a,b,c from t where a=2;

Explained.

SQL> select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 742638319

------------------------------------------------------------------------------------
| Id  | Operation                   | Name | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |      |     9 |   351 |     2   (0)| 00:00:01 |
|   1 |  TABLE ACCESS BY INDEX ROWID| T    |     9 |   351 |     2   (0)| 00:00:01 |
|*  2 |   INDEX RANGE SCAN          | PK_T |     9 |       |     1   (0)| 00:00:01 |
------------------------------------------------------------------------------------

 


by 마농 [2021.04.27 14:51:43]

c2 만으로 유니크 한가요? c1,c2 결합이어야 유니크 한가요?
c2 만으로 유니크 하다면? PK 는 c2 만으로 충분합니다.
c1,c2 결합이어야 유니크 하다면? 결합인덱스 PK 를 만드는게 맞습니다.
다만 c2 조건만 들어오는 경우가 c1 조건만 들어오는 경우보다 더 빈번하다면?
PK 순서 조정이 필요해 보입니다.


by 곰장어 [2021.04.27 17:47:43]

점검해보니 c2만으로 유니크해서 조언주신대로 c2만 pk로 설정하는걸로 수정했습니다

감사드립니다

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입