데이터베이스 엔진 독립적 페이징을 구현하는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/61750

  •  09-06-2019
  •  | 
  •  

문제

일:다양한 RDBMS에 적합한 데이터베이스 레코드의 페이징을 구현합니다.이 방법은 MSSQL2000+, Oracle, MySql 등의 주류 엔진에서 작동해야 합니다.

RDBMS 관련 솔루션을 게시하지 마십시오. 저는 대부분의 최신 데이터베이스 엔진에 대해 이를 구현하는 방법을 알고 있습니다.저는 보편적인 해결책을 찾고 있습니다.지금은 임시 테이블 기반 솔루션만 떠오릅니다.

편집하다:
타사 라이브러리가 아닌 SQL 솔루션을 찾고 있습니다.

도움이 되었습니까?

해결책

SQL 사양에 페이징이 표준으로 포함되어 있었다면 범용 솔루션이 있었을 것입니다.RDBMS 언어라고 불리는 RDBMS 언어에 대한 요구 사항에는 페이징 지원도 포함되지 않습니다.

많은 데이터베이스 제품은 표준 언어에 대한 독점 확장을 통해 SQL을 지원합니다.그 중 일부는 MySQL과 같은 제한 절, Rowid와 Oracle과 같은 페이징을 지원합니다.각각 다르게 처리됩니다.다른 DBMS에서는 rowid 또는 이와 유사한 필드를 추가해야 합니다.

나는 그것이 데이터베이스 시스템 자체에 내장되어 있지 않거나 Oracle, MySQL, SQL Server를 사용하는 ABC라고 말하는 회사가 없는 한 보편적인 솔루션을 가질 수 있다고 생각하지 않습니다. 모든 다양한 데이터베이스 시스템이 이를 사용하는 코드에 대한 범용 인터페이스를 제공하는 데이터베이스 개발자가 자체 페이징 구현을 제공하도록 하기로 결정했습니다.

다른 팁

페이징을 수행하는 가장 자연스럽고 효율적인 방법은 LIMIT/OFFSET(Sybase 세계에서는 TOP) 구문을 사용하는 것입니다.DB 독립적인 방식은 어떤 엔진에서 실행되고 있는지 알고 적절한 SQL 구성을 적용해야 합니다.

적어도 그것이 DB 독립 라이브러리의 코드에서 본 방식입니다.특정 쿼리를 사용하여 엔진에서 데이터를 가져온 후에는 페이징 논리를 추상화할 수 있습니다.

정말로 단일 SQL 문장 솔루션을 찾고 있다면 염두에 두고 있는 것이 무엇인지 보여줄 수 있습니까?임시 테이블 솔루션의 SQL과 같습니다.그러면 아마도 더 관련성이 높은 제안을 얻을 수 있을 것입니다.

편집하다:

임시 테이블을 사용하여 엔진별 구성을 사용하지 않고 이를 수행하는 방법을 볼 수 없었기 때문에 여러분이 무슨 생각을 하고 있는지 알고 싶었습니다.예제에서는 특정 구성을 사용했습니다.(구현된) 표준 SQL만 사용하여 데이터베이스에서 페이징을 구현하는 방법은 아직 없습니다.전체 테이블을 표준 SQL로 가져와서 애플리케이션에 페이지를 표시할 수 있지만 이는 분명히 어리석은 일입니다.

따라서 문제는 이제 "제한/오프셋 또는 이와 동등한 것을 사용하지 않고 페이징을 구현할 수있는 방법이 있습니까?" 그리고 나는 그 대답이 "Sanely, no"라고 생각합니다. 커서를 사용해 볼 수는 있지만 데이터베이스 특정 문장/동작에도 먹이를 줄 것입니다.

방금 나에게 떠오른 멍청한 아이디어는 테이블에 페이지 열을 추가하는 것입니다. 예를 들어 테이블 생성 테스트(id int, 이름 varchar, 전화 varchar, 페이지 int)를 입력한 다음 select *를 사용하여 페이지 1을 얻을 수 있습니다. 페이지 = 1인 테이블에서.그러나 이는 해당 열을 유지하기 위해 코드를 추가해야 함을 의미하며, 이는 전체 데이터베이스를 가져오거나 데이터베이스별 구성을 사용해야만 수행할 수 있습니다.가능한 각 순서마다 다른 열을 추가해야 하는 것 외에도 많은 다른 결함이 있습니다.

증거를 제시할 수는 없지만 제정신으로는 할 수 없는 것 같아요.

평소대로 진행하세요:
표준에 따라 구현하는 것부터 시작하세요.그런 다음 코너 케이스를 처리합니다.표준을 구현하지 않는 DBMS.코너 케이스를 처리하는 방법은 개발 환경에 따라 다릅니다.

당신은 "보편적" 접근 방식을 찾고 있습니다.페이지를 매기는 가장 보편적인 방법은 커서를 사용하는 것이지만 커서 기반 페이지 매기기는 웹 애플리케이션과 같은 비상태 저장 환경에는 잘 맞지 않습니다.

여기에 표준 및 구현(커서 포함)에 대해 작성했습니다.http://troels.arvin.dk/db/rdbms/#select-limit-offset

오픈 소스를 용인할 수 있다면 SubSonic이 이 작업을 수행할 수 있습니다...http://subsonicproject.com/querying/webcast-using-paging/

그 외에는 NHib도 마찬가지인 것으로 알고 있습니다.

JPA를 사용하면 Query 클래스를 사용하여 이를 수행할 수 있습니다.

Query q = ...;
q.setFirstResult (0);
q.setMaxResults (10);

결과 세트의 처음 10개 결과를 제공합니다.

DBMS 독립적인 원시 SQL 솔루션을 원한다면 운이 없을 것 같습니다.판매업체마다 다르게 처리합니다.

@Vinko Vrsalovic,

내가 질문에 쓴 것처럼 대부분의 DB에서 이를 수행하는 방법을 알고 있습니다.보편적인 해결책을 찾거나 그것이 존재하지 않는다는 증거를 얻으려면 어떻게 해야 할까요?

다음은 임시 테이블을 기반으로 한 어리석은 솔루션입니다.분명히 나쁜 내용이므로 댓글을 달 필요가 없습니다.

N - upper bound
M - lower bound

create #temp (Id int identity, originalId int)

insert into #temp(originalId)
select top N KeyColumn from MyTable
where ...

select MyTable.* from MyTable
join #temp t on t.originalId = MyTable.KeyColumn
where Id between M and M
order by Id asc

drop #temp
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top