SQL Server 페이지 별 저장 프로 세 스 연구

5121 단어 SQL Server
http://www.webdiyer.com/Controls/AspNetPager/SpGenerator     SQL Server 페이지 별 저장 프로 세 스 생 성
 
SQL SEVER 2005 이상 버 전:
create procedure GetCasesByProjectID (@projectID  nvarchar(50),@pagesize int,@pageindex int,@docount bit)as
if(@docount=1)select count(*) from GenAccidentCase where gensitebasicid = @projectidelsebegin with temptbl as (SELECT ROW_NUMBER() OVER (ORDER BY AccidentDate desc)AS Row, * from GenAccidentCase O  where gensitebasicid = @projectid) SELECT * FROM temptbl where Row between (@pageindex-1)*@pagesize+1 and (@pageindex-1)*@pagesize+@pagesizeend
SQL SEVER 2000 버 전:
create procedure GetCasesByProjectID (@projectID  nvarchar(50),@pagesize int,@pageindex int,@docount bit)asset nocount onif(@docount=1)select count(*) from GenAccidentCase where gensitebasicid = @projectidelsebegindeclare @indextable table(id int identity(1,1),nid int)declare @PageLowerBound intdeclare @PageUpperBound intset @PageLowerBound=(@pageindex-1)*@pagesizeset @PageUpperBound=@PageLowerBound+@pagesizeset rowcount @PageUpperBoundinsert into @indextable(nid) select genAccidentCaseID from GenAccidentCase  where gensitebasicid = @projectid order by AccidentDate descselect * from GenAccidentCase O,@indextable t where O.genAccidentCaseID=t.nidand t.id between @PageLowerBound+1 and @PageUpperBound order by t.idendset nocount off
기업 참조:CREATE procedure pagination1
(@pagesize int, -- , 20
@pageindex int -- )
as set nocount on
begin
declare @indextable table(id int identity(1,1),nid int) --
declare @PageLowerBound int --
declare @PageUpperBound int --
set @PageLowerBound=(@pageindex-1)*@pagesize
set @PageUpperBound=@PageLowerBound+@pagesize
set rowcount @PageUpperBound
insert into @indextable(nid) select gid from TGongwen where fariqi >dateadd(day,-365,getdate()) order by fariqi desc
select O.gid,O.mid,O.title,O.fadanwei,O.fariqi from TGongwen O,@indextable t where O.gid=t.nid
and t.id>@PageLowerBound and t.id<=@PageUpperBound order by t.id
end
set nocount off

문장 중의 평론:
상기 저장 과정 은 SQL SERVER 의 최신 기술 인 표 변 수 를 활용 했다.이 저장 과정 도 매우 우수한 페이지 저장 과정 이 라 고 해 야 한다.물론 이 과정 에서 표 변 수 를 임시 표 로 쓸 수 있 습 니 다: CREATE TABLE \ # Temp.그러나 SQL SERVER 에 서 는 임시 표를 사용 하 는 것 이 표 변 수 를 사용 하지 않 는 것 이 분명 하 다.그래서 필 자 는 처음에 이 저장 과정 을 사 용 했 을 때 느낌 이 매우 좋 았 고 속도 도 원래 의 ADO 보다 좋 았 다.그러나 나중에 나 는 이 방법 보다 더 좋 은 방법 을 발견 했다.
감각 적 으로 효율 이 그리 높 지 않다.
2. not in 의 방법:
publish 표 에서 n 조 에서 m 조 까지 의 기록 을 꺼 냅 니 다.
  SELECT TOP m-n+1 * FROM publish WHERE (id NOT IN (SELECT TOP n-1 id FROM publish))
id 는 publish 표 의 키워드 입 니 다.
문장 중의 평론:
나 는 당시 에 이 문장 을 보 았 을 때 정말 정신 을 진작 시 켜 생각 이 매우 좋다 고 느 꼈 다.나중에 저 는 사무 자동화 시스템 (ASP. NET + C \ # + SQL SERVER) 을 만 들 때 이 글 이 생각 났 습 니 다. 이 문 구 를 개조 하면 아주 좋 은 페이지 저장 과정 일 것 이 라 고 생각 했 습 니 다. 그래서 저 는 인터넷 에서 이 글 을 찾 았 습 니 다. 생각 지도 못 했 습 니 다. 글 을 찾 지 못 했 지만 이 문구 에 따라 쓴 페이지 저장 과정 을 찾 았 습 니 다.이 저장 과정 도 현재 비교적 유행 하 는 페이지 별 저장 과정 이다.
not in 을 사 용 했 지만 not in 은 색인 을 사용 할 수 없 기 때문에 효율 적 으로 는 조금 떨어진다.
3. max 의 방법:select top * from table1 where id>
(select max (id) from
(select top (( -1)* ) id from table1 order by id) as T)
order by id

문장 중의 평론:
우 리 는 거의 모든 필드 에서 max (필드) 나 min (필드) 을 통 해 특정한 필드 의 최대 또는 최소 값 을 추출 할 수 있다 는 것 을 알 고 있 습 니 다. 따라서 이 필드 가 중복 되 지 않 으 면 중복 되 지 않 는 필드 의 max 나 min 을 분수령 으로 하여 각 페이지 알고리즘 에서 각 페이지 를 나 누 는 참조물 로 만 들 수 있 습 니 다.여기 서 우 리 는 조작 부호 '>' 또는 '<' 호 로 이 임 무 를 완성 하여 검색 어 를 SARG 형식 에 부합 하도록 할 수 있다.예:
  Select top 10 * from table1 where id>200
이 건 좀 고 효율 이 야.하지만 max 의 작업 원 리 를 잘 모 르 겠 어 요. 성능 이 어떤 지 모 르 겠 어 요.
심득:
1. 효율 적 인 페이지 넘 기기 알고리즘 인 포 지 셔 닝 법 을 추구한다.declare @pageSize int --
declare @CurPage int -- ( )0: ;-1 。
declare @Count int
declare @id int
set @pageSize=10
set @CurPage =1
--
if @CurPage = -1
begin
--
set rowcount @pageSize
select @id=newsID from newsTemp order by newsID
end
if @CurPage > 0
begin
set @Count = @pageSize * (@CurPage -1) + 1
set rowcount @Count
select @id=newsID from newsTemp order by newsID desc
end

-- 복귀 기록set rowcount @pageSize
select * from newsTemp where newsID <=@id order by newsID descset rowcount 0

사고방식: 바로 위의 알고리즘 의 연속 이다. 즉, not in 과 max 를 사용 하 는 방법 을 피한다.즉, 이 사고: Select top 10 * from table 1 where id > 200, 포 지 셔 닝 - 즉, '임계 점', 페이지 의 임계 점 을 찾 아야 한 다 는 것 이다.찾 으 면 남 은 일 은 하기 쉽다.
단점: 단일 필드 정렬, 정렬 필드 의 값 은 중복 할 수 없습니다.
2. 통용 법 - 전도 법
어떤 때 는 '포 지 셔 닝 법' 의 단점 을 받 아들 일 수 없 지만 괜찮아 요. 이 걸 로 할 수 있어 요.select * from table where id in
(
select top 10 ID from
(
select top 20 ID,addedDate from table
order by addedDate desc
) as aa order by addedDate
)
order by addedDate desc

ID 는 메 인 키 이 고 addedDate 는 정렬 필드 입 니 다.
단점: 홈 키 가 있어 야 합 니 다.

좋은 웹페이지 즐겨찾기