2010-02-12 4 views
6

ASP.NET MVC 및 LINQ to SQL을 사용하여 작업 한 적이 있다면 많은 사람들이 익숙한 PagedList 클래스를 웹 응용 프로그램에서 사용하고 있습니다. Rob Conery에 의해 블로깅되었으며, 비슷한 화신이 Nerd Dinner 등과 같이 포함되었습니다. 훌륭하게 작동하지만 내 DBA는 향후 성능 문제에 대한 우려를 제기했습니다.LINQ to SQL 페이지 매기기 및 COUNT (*)

그의 문제는이 라인의 결과로 발행 가져옵니다 SELECT COUNT (*) 주위 :

TotalCount = source.Count(); 

결과로 데이터 (아래처럼) 추가 쿼리를 실행됩니다 페이징했다 조치 IQueryable.Count() 메서드 호출 중 :

SELECT COUNT(*) AS [value] FROM [dbo].[Products] AS [t0] 

더 좋은 방법이 있습니까? 항목 수를 얻기 위해 PagedList 클래스의 Count 속성을 사용하는 것을 고려했지만 현재 표시된 항목의 수 (총 수는 아님)를 계산하기 때문에 작동하지 않습니다.

데이터베이스에 많은 양의 데이터가있을 때 얼마나 많은 성능 저하가 발생합니까?

답변

8

iirc이 항목은 색인 통계의 일부이며 매우 효율적이어야합니다. DBA에게 조기에 최적화하지 말고 자신의 우려를 집중시켜달라고 요청해야합니다.

+2

Upvoted 그렇게 열심히 인터넷을 끊었다. ;) 추가 카운트 쿼리가 데이터베이스 성능을 떨어 뜨리는 경우 심각한 문제가 발생할 수 있습니다. – jfar

1

일부 데이터베이스 (Oracle, Postgresql, SQL Server)는 시스템 테이블에 행 수를 기록합니다. 이러한 통계는 통계가 마지막으로 새로 고쳐진 시점 (Oracle)으로 만 정확한 경우도 있습니다. 상당히 정확한 통계 만 필요로한다면이 방법을 사용할 수 있습니다.

어떤 데이터베이스를 사용하고 있습니까? 아니면 어떤 데이터베이스가 다른가요?

+0

SQL 서버를 기반으로 2005 –

2

사실, 이것은 Linq의 일반적인 문제입니다.

그렇습니다. 인덱스 통계가 SELECT COUNT(*) AS [value] FROM [dbo].[Products] AS [t0]인데도 WHERE 절이 포함되는 시간이 99 %에 불과할 경우 인덱스 통계가 사용됩니다.

은 그래서 기본적으로 두 개의 SQL 문이 실행됩니다 테이블이 처음에 반환 된 COUNT(*)으로 자주 업데이트되는 경우

  1. SELECT COUNT(*) AS [value] FROM [dbo].[Products] AS [t0] WHERE blah=blah and someint=500

  2. SELECT blah, someint FROM [dbo].[Products] AS [t0] WHERE blah=blah and someint=500

당신은 수신 문제를 시작합니다 명령문이 두 번째 명령문과 동일하지 않습니다 ... 이것은 '행을 찾을 수 없거나 변경되었습니다.'라는 오류 메시지를 반환 할 수 있습니다.

1

(PS 나는 당신이 그러나 MSSQL에 대해 얘기하는 것을 알고)

나는 더 DBA 오전 없지만 MySQL의 실제 성능 히트에 (*) 계산합니다. 카운트 (ID)로 변경하는 것만으로 속도가 향상됩니다.

매우 큰 GLOB (이미지) 데이터가있는 테이블을 쿼리 할 때이 문제가 발생했습니다. 쿼리 도구가로드 될 약 15 초. 개수 (ID)를 변경하면 쿼리가 0.02로 줄어 듭니다. 아직도 조금 느리지 만 지옥이 훨씬 낫다.

저는 이것이 DBA가 무엇을 얻고 있는지 생각합니다. 나는 Linq가 다음 문장으로 넘어 가기 위해 매우 긴 시간 (1 초)이 걸린다고 디버그 할 때 알아 차렸다.

내가 DBA의 conserns에 동의해야 내 발견 ...