말보다 먼저 글로 보자.

select object_name(id) , rows from sysindexes
where id in (select id  from sysobjects where name = '****')
and indid in (0,1)



요게 무엇인고..

윗 문장은 다음과 같은 역할을 한다.

"****란 테이블에 들어가 있는 카운트 수를 리턴 해 준다."

엥?? 그럼 위의 쿼리문이 select count(*) from **** 과 도대체 다른게 모냥??
라고 반문하시는 분은 개발자 분들일 듯..

MS-SQL에는 (뭐 다른 DB도 마찬가지겠지만) 시스템이 가지고 있는 정보 중 참조해 볼 만한 정보를 가진 녀석이 바로 sysindexes와 sysobjects란 테이블이다.
sysindexes는 테이블이 가지고 있는 여러개의 정보.. 특히 해당 테이블에 적재된 아이템의 갯수를 가지고 있다.
단, 이곳에는 테이블을 하나의 ID로 보유하고 있는데, 이 ID를 확인할 수 있는 테이블이 바로 sysobjects 이다.

먼저 위의 문장을 하나하나 설명 해 본다.

select object_name(id) , rows from sysindexes
아이디의 이름과 로우수를 sysindexes에서 쿼리 할 것.

where id in (select id  from sysobjects where name = '****') and indid in (0,1)
그 조건으로는 sysobjects를 보았을 때 ****이란 이름을 가진 테이블일 것. 또한 index id가 0이나 1인놈만 - 중복 표현을 방지 해 준다.

자.. 하나를 볼 때는 굳이 저렇게 쓸 필요 없이 select count(*) from **** 를 사용해도 된다.
단, 카운트 수가 많을수록 시스템에 부하를 주는 것은 당연한 것이겠지만..
정보가 있는데 놔두고 굳이 처음부터 숫자를 다시 세도록 시킨다면 그건 작업을 시키는 사람이 잘못된 넘이다.

위 문장을 응용해 보자.

select object_name(id) , rows from sysindexes
where id in (select id  from sysobjects where name >= '****' and name <= '$$$$')
and indid in (0,1)

order by 1

하나의 테이블일 경우에는 굳이 위와 같이 할 필요가 없을지도 모른다.
그러나 위의 문장처럼 여러개의 테이블을 다 검토 해 보고자 한다면 sysindexes와 sysobjects를 아는사람과 모르는 사람의 차이는 어마어마 할 것이라 생각된다.
Posted by hopi
,