문제

DataGridView에로드하려는 큰 데이터 세트 (10 만 개 이상의 레코드)가 있습니다. 이를 수행하는 저장된 절차는 완료하는 데 10 초 이상이 걸릴 수 있습니다.

지금까지 나는 UI가 잠그는 것을 막는 배경 노동자가 있으며, 기본적인 '기다려 기다려'대화를 구현했습니다.

내가하고 싶은 것은 DataGridView가 데이터베이스에서 어떻게 든 반환 될 때 결과로 DatagridView를 채우는 것입니다. 이를 설명하는 가장 좋은 방법은 SQL Server Management Studio가 수행하는 방법입니다. 쿼리가 실행되면 쿼리가 여전히 실행 되더라도 즉시 행이 돌아옵니다. 쿼리를 중지하고 반환 된 행을 유지하는 버튼도 있습니다.

내 코드로 어떻게 할 수 있습니까?

DataGridView는 데이터 행을 표시하는 데만 사용되며 사용자는 다른 작업을 수행하기 위해 클릭합니다. 데이터베이스에 아무것도 쓰지 않습니다.

도움이 되었습니까?

해결책

DatagridView에서 10 만 행? 그냥 아니라고 말해"!

  1. 사용자는 한 번에 10 만 행을 볼 수 없습니다
  2. 10 만 행을 전송하기위한 네트워크 트래픽은 중요하지 않습니다.
  3. 100,000 DatagridView 행의 메모리 오버 헤드는 중요하지 않습니다.
  4. 사용자는 하나의 행만 선택하고 계속됩니다.
  5. 이 앱이 한 번에 한 명 이상의 사용자가 사용하는 경우 DBA가 귀하를 사냥합니다.

Austin의 조언을 따르고 한 번에 한 페이지 만 표시하십시오.

다른 팁

가장 좋은 옵션은 일종의 페이징 메커니즘을 사용하는 것 같습니다. 따라서 한 번에 한 번에 세트의 데이터 만 표시하는 것입니다. 그러면 데이터를 끌어 당기고 페이지를로드 할 수 있습니다. GridView의 내장 페이징을 사용할 수 있습니다 (레코드 페이지 만 표시하더라도 매번 전체 데이터 세트를 가져 오기 때문에이 접근 방식과 함께 .NET 캐시를 사용하는 것이 좋습니다). 한 번에 한 페이지 만 가져 오는 LINQ에서 SQL로 페이징을 구현할 수도 있습니다. 아래는 최근에 찾은 좋은 기사에 대한 링크입니다.

http://www.dbtutorials.com/display/linq-to-sql-paging-cs.aspx

다른 사람들이 제안한 바와 같이, 그리드에 100k 레코드를 표시하는 것은 나쁜 생각처럼 들리지만, 당신이 정말로해야한다면 ...

배경 작업자 스레드가 올바른 길을 가고 있지만 데이터 리더를 사용하고 반환 할 때 순차적으로 행을 읽어야합니다. 그런 다음 배경 작업자 스레드는 데이터 리더에서 읽은 모든 행에 대해 UI 스레드를 통해 그리드 행 추가를 마샬링해야합니다.

UI 응답을 유지하기 위해 별도의 스레드를 사용함으로써 혜택을 받으면 UI 응답을 유지하는 이점은 어쨌든 끊임없이 줄을 추가 하느라 바쁘기 때문에 무시할 것입니다. 나는 당신이 일종의 배치 접근법을 구현할 것을 제안하고, UI에 새로운 행을 한 번씩 한 번만 추가하도록합니다. 당신은 여기서 매우 조심하고 가능한 인종 조건을 염두에두고 싶을 것입니다. 배경 작업자가 DataReader에서 어떤 종류의 컬렉션에 행을 추가하는 상황이 발생할 수 있으며, UI는 컬렉션을 동시에 읽고 싶을 수도 있습니다. 이는 거의 확실하게 문제가 발생할 것입니다.

DataGridView에서 Management Studio와 같은 방식으로 할 수 있습니다. 저장된 프로 시저 호출이 완료되면 앱의 모든 행을 한 번에 얻을 수 있다고 말하고 싶습니다.

백엔드 튜닝도 조사 할 수도 있습니다. 그러한 경우에 색인을 추가하면 여러 번 도움이되었습니다. "실행 계획"옵션이 활성화 된 SQL Server Management Studio에서 저장된 절차를 실행해보십시오. 저장된 절차가 다운 될 수있는 장소를 찾으십시오 (즉, 높은 실행 비율). 항목 위로 마우스를 떠나면 실행 세부 정보 목록이 표시됩니다. 목록의 맨 아래에서 필드가 비교되는지 확인하십시오. 이들은 인덱싱 후보자에게 죽은 선물입니다.

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