OVER()를 이용한 집계 처리
한대성
MS SQL Server MVP
에이디컨설팅 책임 컨설턴트 | SQLLeader.com 운영자
Question |
use northwind
go
select
productname,
unitprice,
(select avg(unitprice) from dbo.products) as average,
unitprice - (select avg(unitprice) from dbo.products) as diff
from dbo.products
위 결과와 동일하게, dbo.products라는 테이블을 한번만 읽고 동일한 결과를 만들어 낼수 있을까요?
위 쿼리 경우 dbo.products 테이블이 3번 스캔을 하잖아요? 뭐~ 두번째 부터는 메모리에서 가져온다고 하더라도요...
두번까지는 줄일수 있을것 같은데, 한번 테이블 스캔하고, 위 내용을 만들어 낸다는게....가능할지?
아~ 그리고, SQL도 한방으로 처리해야 합니다. |
1) Products 테이블 3회 읽기
SELECT
productname,
unitprice,
(SELECT avg(unitprice) FROM dbo.products) AS average,
unitprice - (SELECT avg(unitprice) FROM dbo.products) AS diff
FROM dbo.products
--테이블 'Products'. 검색 수 3, 논리적 읽기 수 6, 물리적 읽기 수 0, 미리 읽기 수 0, LOB 논리적 읽기 수 0, LOB 물리적 읽기 수 0, LOB 미리 읽기 수 0.
2) Products 테이블 2회 읽기
SELECT
productname,
unitprice,
average,
(unitprice - average) AS diff
FROM dbo.products
join (SELECT avg(unitprice) AS average FROM dbo.products) b on 1=1
--테이블 'Products'. 검색 수 2, 논리적 읽기 수 4, 물리적 읽기 수 0, 미리 읽기 수 0, LOB 논리적 읽기 수 0, LOB 물리적 읽기 수 0, LOB 미리 읽기 수 0.
3) Products 테이블 1회 읽기 (SQL Server 2005 이상)
SELECT
productname,
unitprice,
(avg(unitprice) OVER()) AS average,
unitprice - (avg(unitprice) OVER()) AS diff
FROM dbo.products
--테이블 'Worktable'. 검색 수 3, 논리적 읽기 수 159, 물리적 읽기 수 0, 미리 읽기 수 0, LOB 논리적 읽기 수 0, LOB 물리적 읽기 수 0, LOB 미리 읽기 수 0.
--테이블 'Products'. 검색 수 1, 논리적 읽기 수 2, 물리적 읽기 수 0, 미리 읽기 수 0, LOB 논리적 읽기 수 0, LOB 물리적 읽기 수 0, LOB 미리 읽기 수 0.
| ||||
| ||||
| ||||
| ||||
|
'연구개발 > DBA' 카테고리의 다른 글
SQL Server 2000 나만의 노하우 & 팁 (0) | 2009.06.29 |
---|---|
동적 SQL의 축복과 저주 (0) | 2009.06.29 |
ISNUMERIC 함수관련 (0) | 2009.06.29 |
T-SQL 작성시 체크리스트 (0) | 2009.06.29 |
프로시져 내에서 sql파일 실행하기. (0) | 2009.06.29 |