2011-02-03 10 views
1

내 질문에 여러 부분이있어서 길어질 수 있습니다.접근법 - 성능을위한 LINQ 최적화

저는 LINQ를 사용하여 Silverlight 클라이언트로 데이터를 전달하고 있습니다.

1 부 : 연결 풀링 & 최적화 : LINQ가 데이터베이스에 단 하나의 연결을 설정하고 연결 풀링을 수행하는 방법을 알고 싶습니다. 과거에는 SQL 연결 문자열 자체에 연결 풀링 속성을 사용했습니다. 그래서 DBML 파일에 테이블을 추가 할 때 연결 문자열이 설정된이 설정 파일을 놓으면 LINQ가 해당 데이터를 액세스하는 레이어의 핵심을 이루는 LINQ (DBML)이됩니다. 기본적으로 LINQ 쿼리 인 메서드가있는 클래스를 작성합니다. 데이터 관련 부분을 처리하는 코드에서 "사용"블록에서 DataContext 개체를 사용합니다. LINQ가 다중 연결을 사용하는 이유는 무엇입니까? DataContext를 클래스 수준 변수로 사용하면 하나의 연결 만 보장됩니까?

2 부 : 최적화 ADO.Net 일 전에는 저장 프로 시저를 작성하고 DataReader를 통해 실행 한 다음 DataReader를 반복하고 Model 클래스의 많은 개체를 채우고 전달합니다. DataGrid에 바인딩하기위한 컬렉션입니다. LINQ 일 동안, 나는 훨씬 더 멀리 객체의 컬렉션을 만드는 것과 같은 일을합니다. 하지만 직접 LINQ 문을 직접 실행합니다. SQL 저장 프로 시저가 더 빠른 성능을 제공 할 것이라고 추측 할 수 있지만 LINQ를 사용하여 저장 프로 시저를 실행하면 이전 날짜만큼 빠르며 올바른 접근 방법입니까?

+0

실제 성능 문제는 무엇입니까? – Phill

+0

데이터 액세스 속도가 느리기 때문에 전반적인 성능이 느립니다. –

+0

그래서 문제는 ORM 또는 연결 풀링이 아니라 데이터베이스 자체입니다. – Phill

답변

7

Ohoh .... 너무 많은 나쁜 습관.

제 2 부 : 안 먼 과거 최적화, ADO.Net 일, 나는, 저장 프로 시저 쓰기 DataReader를 통해 실행하고 DataReader를 통해 루프의 많은 개체를 채우는 데 사용 내 모델 클래스를 DataGrid에 바인딩하기위한 컬렉션 컬렉션을 전달하십시오. LINQ 일 동안 나는 멀리 같은 개체의 컬렉션을 만드는 것과 같습니다. . 하지만 직접 LINQ 문을 실행합니다. 내가 저장 프로 시저를 SQL 나에게 빠른 성능을 을 줄 것이다 추측 할 수 있지만,

기본적으로 과거에 당신은 약간의 dlusions했다. 저장 프로 시저에는 10 년 이상 동안 성능상의 이점이 없습니다 (!). 문서에서 명확하게 설명되어 있습니다. SQL 실행은 저장 프로 시저가 아닌 경우만큼 빠르며 쿼리 계획은 캐시되고 두 가지 모두에 대해 다시 사용됩니다.

SP는 왕복을 피하는 경우 (예 : 클라이언트에서 서버로 여러 요청 일괄 전송)의 경우에만 유용합니다 (예 : 절약 시간). 그리고 저축은 그들이 storped 절차라는 사실에 기인 한 것이 아니라 왕복 비용이 소요되는 시간 때문입니다.

슬프게도, 많은 프로그래머들이 망상을 가지고 있습니다. 왜냐하면 10 년 전 스토어드 프로 시저가 본질적인 이점을 가지고 있었을 때 전에는 다른 사람들로부터 얻었 기 때문입니다. 이제 이것이 SQL Server 6.5 시간입니다. 7.0 이후로 이것은 역사입니다.

http://weblogs.asp.net/fbouma/archive/2003/11/18/38178.aspx

은 기본적으로 당신은 손실 개발 시간과 mostlikely 측정 가능한 장점 ....에 대한 쓸모없는 코드를 많이 처리 하였다.

제 1 부 : 연결이 & 최적화를 풀링 : 내가 LINQ는 데이터베이스에 하나의 연결을 설정 있는지, 또한 연결 풀링을 따라 수있는 방법을 알고 싶어요.

너는하지 마라. 기본적으로 당신에게 좋은 것보다 더 똑똑해 지려고 노력하지 마십시오. 다중 연결에 문제가 있습니까?

풀링의 경우, (SQL Server)는 연결 문자열에 아무 것도 넣지 않아도됩니다. 그리고 예, LINQ는 마술처럼 연결 문자열에 정의 된 연결 풀을 무시하지 않습니다. LINQ는 데이타베이스와는 절대 대화를하지 않습니다. ADO.NET을 사용하기 때문에 ADO.NET은 마술처럼 행동을 바꾸지 않았습니다. 상위 ORM이 그것을 대신 사용하기 때문입니다. 연결 문자열에 풀링 항목이 있으면 ADO.NET은 여전히 ​​해당 항목을보고이를 따르게됩니다.

이제 서버 풀에서 단 하나의 데이터베이스 연결을 갖는 것이 STUPID입니다. ou를 한 번에 하나의 트랜잭션으로 제한하고로드가 높아지면 성능을 완전히 파기합니다 (예 : 여러 요청을 동시에 처리해야 함). 나는이 부분 관련 데이터를 처리 곳

나는 내 코드 블록을 "사용" 에서의 DataContext 개체를 사용합니다. 이 LINQ가 복수 연결 을 사용하는 이유는 무엇입니까? DataContext를 클래스 수준 변수로 사용하면 은 단 하나의 연결 만 보장합니까?

Ah -에 달려 있습니다. 그것은 의미가있을 수 있습니다, 그렇지 않을 수도 있습니다. 알다시피, 문제가 있다고 생각하기 전에, 특히 여기에 제공 한 많은 양의 정보 (예 : 없음)를 감안할 때, 유일한 현명한 일을하십시오. 프로파일 러를 가져 와서 가지고 있는지 여부를 측정하십시오. Openng/연결을 100 번 또는 1000 번 닫으면 Profiler에 나타나지 않습니다. 문제는 해결할 필요가 없습니다.

말하자면, 나는 메서드 연결 연결을 좋아하지 않습니다. 일반적으로 나쁜 클래스 디자인을 보여줍니다. 연결은 작업 단위 내에서 재사용되어야합니다.