[linq] LINQ-to-SQL 대 저장 프로 시저? [닫은]

StackOverflow ( LINQ 초보자 안내서)의 “LINQ 초보자 안내서”게시물을 살펴 보았지만 후속 질문이있었습니다.

우리는 거의 모든 데이터베이스 작업이 상당히 간단한 데이터 검색 (이미 데이터를 쓰는 프로젝트의 다른 세그먼트가 있음) 인 새 프로젝트를 시작하려고합니다. 지금까지 우리의 다른 프로젝트들 대부분은 그런 것들을 위해 저장 프로 시저를 사용합니다. 그러나 LINQ-to-SQL이 더 합리적이라면 활용하고 싶습니다.

따라서 문제는 다음과 같습니다. 간단한 데이터 검색의 경우 LINQ-to-SQL 또는 저장 프로 시저 중 어떤 방법이 더 좋습니까? 특정 장단점?

감사.



답변

sproc에 비해 LINQ의 몇 가지 장점 :

  1. 타입 안전 : 우리 모두가 이것을 이해한다고 생각합니다.
  2. 추상화 : LINQ-to-Entities에서 특히 그렇습니다 . 이 추상화는 또한 프레임 워크가 쉽게 활용할 수있는 추가 개선 사항을 추가 할 수 있도록합니다. PLINQ 는 LINQ에 멀티 스레딩 지원을 추가하는 예입니다. 이 지원을 추가하기 위해 코드 변경이 최소화됩니다. 단순히 sprocs를 호출하는이 데이터 액세스 코드를 수행하는 것은 훨씬 어렵습니다.
  3. 디버깅 지원 : .NET 디버거를 사용하여 쿼리를 디버깅 할 수 있습니다. sprocs를 사용하면 SQL을 쉽게 디버깅 할 수 없으며 이러한 경험은 주로 데이터베이스 공급 업체와 관련이 있습니다 (MS SQL Server는 쿼리 분석기를 제공하지만 종종 충분하지는 않습니다).
  4. 공급 업체에 구애받지 않음 : LINQ는 많은 데이터베이스에서 작동하며 지원되는 데이터베이스의 수만 증가합니다. Sproc은 다양한 구문 또는 기능 지원 (데이터베이스가 sproc을 전혀 지원하지 않는 경우)으로 인해 데이터베이스간에 항상 이식 가능한 것은 아닙니다.
  5. 배포 : 다른 사람들은 이미 이것을 언급했지만 일련의 sproc을 배포하는 것보다 단일 어셈블리를 배포하는 것이 더 쉽습니다. 이것은 # 4 와도 관련이 있습니다.
  6. 더 쉬움 : 데이터 액세스를 위해 T-SQL을 배우거나 sproc을 호출하는 데 필요한 데이터 액세스 API (예 : ADO.NET)를 배울 필요가 없습니다. 이것은 # 3 및 # 4와 관련이 있습니다.

LINQ vs sproc의 몇 가지 단점 :

  1. 네트워크 트래픽 : sproc은 sproc-name과 인수 데이터를 유선으로 직렬화하면 LINQ는 전체 쿼리를 보냅니다. 쿼리가 매우 복잡한 경우 이것은 정말 나빠질 수 있습니다. 그러나 LINQ의 추상화를 통해 Microsoft는 시간이 지남에 따라이를 개선 할 수 있습니다.
  2. 유연성이 떨어짐 : Sprocs는 데이터베이스 기능 세트를 최대한 활용할 수 있습니다. LINQ는 지원에있어보다 일반적인 경향이 있습니다. 이것은 모든 종류의 언어 추상화에서 일반적입니다 (예 : C # vs 어셈블러).
  3. 재 컴파일 : 데이터 액세스 방식을 변경해야하는 경우 어셈블리를 재 컴파일, 버전 관리 및 재배치해야합니다. sprocs가 수행 할 수 있습니다 때로는 재배포 아무것도 할 필요없이 조정에 DBA에게 데이터 액세스 루틴을 할 수 있습니다.

사람들은 보안 및 관리 효율성에 대해서도 논쟁하고 있습니다.

  1. 보안 : 예를 들어, 테이블에 대한 액세스를 직접 제한하고 sproc에 ACL을 배치하여 민감한 데이터를 보호 할 수 있습니다. 그러나 LINQ를 사용하면 여전히 테이블에 대한 직접 액세스를 제한하고 대신 업데이트 가능한 테이블 에 ACL을 배치 하여 비슷한 결과를 얻을 수 있습니다 (데이터베이스가 업데이트 가능한 뷰를 지원한다고 가정).
  2. 관리 효율성 : 뷰를 사용하면 테이블 정규화와 같은 스키마 변경으로부터 응용 프로그램이 중단되지 않도록 보호 할 수 있습니다. 데이터 액세스 코드를 변경하지 않고도 뷰를 업데이트 할 수 있습니다.

나는 큰 sproc 사람 이었지만 일반적으로 더 나은 대안으로 LINQ에 기대기 시작했습니다. sproc이 더 나은 일부 영역이 있다면 아마도 sproc을 작성하지만 LINQ를 사용하여 액세스 할 것입니다. 🙂


답변

나는 일반적으로 DBA가 수년 동안 해왔 던 모든 이유 때문에 모든 것을 저장 프로 시저에 넣는 것을 제안합니다. Linq의 경우 간단한 CRUD 쿼리로 성능 차이가 없을 것입니다.

그러나이 결정을 내릴 때는 몇 가지 사항을 명심하십시오. ORM을 사용하면 데이터 모델과 밀접하게 연결됩니다. DBA는 컴파일 된 코드를 변경하지 않고 데이터 모델을 자유롭게 변경할 수 없습니다. 스토어드 프로 시저를 사용하면 프로 시저에서 리턴 된 매개 변수 목록 및 결과 세트가 계약을 나타내며 해당 계약이 여전히 충족되는 한 내부 값을 변경할 수 있으므로 이러한 종류의 변경 사항을 범위에서 숨길 수 있습니다. .

또한 Linq를보다 복잡한 쿼리에 사용하면 데이터베이스 튜닝이 훨씬 더 어려운 작업이됩니다. 스토어드 프로 시저가 느리게 실행될 때 DBA는 코드에 전적으로 집중할 수 있으며 많은 옵션을 가질 수 있으므로 계약이 완료 될 때에도 계약이 여전히 충족됩니다.

배포 된 컴파일 된 코드를 변경하지 않고 저장 프로 시저의 스키마 및 코드를 변경하여 응용 프로그램의 심각한 문제를 해결 한 사례가 많이있었습니다.

아마도 Linq와 함께 하이 버드 접근이 좋을까요? 물론 Linq는 저장 프로 시저를 호출하는 데 사용될 수 있습니다.


답변

Linq-Sql

SQL Server는 쿼리 계획을 캐시하므로 sproc의 성능 향상은 없습니다.

반면, linq 문은 논리적으로 응용 프로그램의 일부이며 테스트를 거칩니다. Sproc은 항상 약간 분리되어 있으며 유지 관리 및 테스트가 더 어렵습니다.

지금 처음부터 새로운 응용 프로그램을 작업하고 있다면 Linq를 사용하고 싶었습니다.


답변

기본적인 데이터 검색을 위해 망설이지 않고 Linq를 사용하려고합니다.

Linq로 이사 한 후 다음과 같은 장점을 발견했습니다.

  1. 내 DAL을 디버깅하는 것이 결코 쉽지 않았습니다.
  2. 스키마 변경이 귀중한 경우 컴파일 시간 안전.
  3. 모든 것이 DLL로 컴파일되므로 배포가 더 쉽습니다. 더 이상 배포 스크립트를 관리하지 않아도됩니다.
  4. Linq는 IQueryable 인터페이스를 구현하는 모든 쿼리를 지원할 수 있으므로 동일한 구문을 사용하여 새로운 구문을 배울 필요없이 XML, 객체 및 기타 데이터 소스를 쿼리 할 수 ​​있습니다.

답변

LINQ는 프로 시저 캐시를 팽창시킵니다

응용 프로그램에서 LINQ to SQL을 사용하고 있고 쿼리 길이가 매우 가변적 인 문자열을 사용하는 경우 SQL Server 프로 시저 캐시는 가능한 모든 문자열 길이마다 하나의 쿼리 버전으로 확장됩니다. 예를 들어 AdventureWorks2008 데이터베이스의 Person.AddressTypes 테이블에 대해 생성 된 다음과 같은 매우 간단한 쿼리를 고려하십시오.

var p =
    from n in x.AddressTypes
    where n.Name == "Billing"
    select n;

var p =
    from n in x.AddressTypes
    where n.Name == "Main Office"
    select n;

이러한 쿼리가 모두 실행되면 SQL Server 프로 시저 캐시에 NVARCHAR (7)로 바인딩 된 항목과 NVARCHAR (11)로 바인딩 된 항목이 두 개 표시됩니다. 이제 길이가 다른 수백 또는 수천 개의 다른 입력 문자열이 있는지 상상해보십시오. 프로 시저 캐시는 불필요하게 정확히 동일한 쿼리에 대한 모든 종류의 서로 다른 계획으로 채워질 것입니다.

자세한 내용은 https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=363290


답변

프로 LINQ 논쟁은 데이터베이스 개발에 대한 역사가없는 사람들 (일반적으로)에게서 온 것 같습니다.

특히 VS DB Pro 또는 Team Suite와 같은 제품을 사용하는 경우 여기에 작성된 많은 주장이 적용되지 않습니다.

유지 관리 및 테스트 어려움 : VS는 전체 구문 검사, 스타일 검사, 참조 및 제약 조건 검사 등을 제공합니다. 또한 전체 단위 테스트 기능과 리팩토링 도구를 제공합니다.

LINQ는 ACID 테스트에 실패하여 진정한 단위 테스트를 불가능하게 만듭니다.

LINQ : 디버깅이 더 쉬운 이유는 무엇입니까? VS를 사용하면 관리되는 코드와 SP의 정기적 디버깅을 완벽하게 활용할 수 있습니다.

배포 스크립트가 아닌 단일 DLL로 컴파일 : VS는 다시 한 번 전체 데이터베이스를 구축 및 배포하거나 데이터에 안전한 증분 변경을 수행 할 수 있습니다.

LINQ로 TSQL을 배울 필요가 없습니다. 아니요, LINQ를 배워야합니다. 이점은 어디에 있습니까?

나는 이것이 이것이 유익하다고 생각하지 않습니다. 격리 된 상태에서 무언가를 변경할 수 있다는 것이 이론적으로는 좋은 것처럼 들릴 수 있지만, 변경 사항이 계약을 이행한다고해서 그것이 올바른 결과를 반환한다는 의미는 아닙니다. 올바른 결과가 무엇인지 결정하려면 컨텍스트가 필요하며 호출 코드에서 해당 컨텍스트를 가져옵니다.

음, 느슨하게 결합 된 앱은 유연성을 높이기 위해 모든 훌륭한 프로그래머의 궁극적 인 목표입니다. 개별적으로 변경 사항을 변경할 수 있다는 것은 환상적이며, 여전히 적절한 결과를 반환하는지 확인하는 단위 테스트입니다.

여러분 모두 화를 내기 전에 LINQ는 그 자리에 있으며 미래가 큽니다. 그러나 복잡하고 데이터 집약적 인 애플리케이션의 경우 스토어드 프로 시저를 대신 할 준비가되지 않았다고 생각합니다. 이것은 올해 TechEd에서 MVP에 의해 반향 된 견해였습니다 (그들은 이름이 남지 않을 것입니다).

편집 : LINQ to SQL 저장 프로 시저 측면은 여전히 ​​더 읽을 필요가 있습니다-찾은 내용에 따라 위의 diatribe를 변경할 수 있습니다.)


답변

LINQ는 새롭고 자리가 있습니다. LINQ는 저장 프로 시저를 대체하기 위해 발명되지 않았습니다.

여기서는 “LINQ to SQL”에 대한 성능 신화 및 CONS에 중점을 둘 것입니다. 물론 완전히 잘못되었을 수도 있습니다. 😉

(1) 사람들은 LINQ 통계가 SQL 서버에서 “캐시”될 수 있으므로 성능을 잃지 않는다고 말합니다. 부분적으로 사실입니다. “LINQ to SQL”은 실제로 LINQ 구문을 TSQL 상태로 변환하는 런타임입니다. 따라서 성능 관점에서 하드 코딩 된 ADO.NET SQL 문은 LINQ와 차이가 없습니다.

(2) 예를 들어, 고객 서비스 UI에는 “계정 전송”기능이 있습니다. 이 함수 자체는 10 개의 DB 테이블을 업데이트하고 일부 메시지를 한 번에 반환 할 수 있습니다. LINQ를 사용하면 일련의 문을 작성하여 SQL Server에 일괄 처리로 보내야합니다. 이 변환 된 LINQ-> TSQL 배치의 성능은 저장 프로 시저와 거의 일치하지 않습니다. 이유? 내장 SQL 프로파일 러 및 실행 계획 도구를 사용하여 스토어드 프로 시저에서 명령문의 최소 단위를 조정할 수 있으므로 LINQ에서는이를 수행 할 수 없습니다.

요점은 단일 DB 테이블과 작은 데이터 CRUD 세트를 말할 때 LINQ가 SP만큼 빠릅니다. 그러나 훨씬 더 복잡한 논리의 경우 저장 프로시 저는 성능을 더 조정할 수 있습니다.

(3) “LINQ to SQL”은 초보자가 쉽게 성능 호그를 도입하도록합니다. 수석 TSQL 담당자는 CURSOR를 사용하지 않을 때 알려줄 수 있습니다 (기본적으로 대부분의 경우 TSQL에서 CURSOR를 사용해서는 안됩니다). LINQ와 쿼리가 포함 된 매력적인 “foreach”루프를 사용하면 초보자가 그러한 코드를 작성하는 것이 매우 쉽습니다.

foreach(Customer c in query)
{
  c.Country = "Wonder Land";
}
ctx.SubmitChanges();

이 쉬운 코드가 너무 매력적이라는 것을 알 수 있습니다. 그러나 .NET 런타임은 이것을 업데이트 배치로 변환합니다. 500 줄만 있으면 500 줄 TSQL 배치입니다. 백만 줄이 있다면 이것은 히트입니다. 물론 숙련 된 사용자는이 방법으로이 작업을 수행하지 않지만 요점은이 방법으로 넘어지기가 쉽다는 것입니다.