NHibernate가 매개변수화된 SQL을 저장 프로시저만큼 빠르게 생성하는 이유는 무엇입니까?

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

  •  09-06-2019
  •  | 
  •  

문제

동료 중 한 명은 실행 경로가 캐시되어 있더라도 ORM에서 생성된 매개변수화된 SQL이 저장 프로시저만큼 빠르지는 않다고 주장합니다.이 완고한 개발자에게 도움이 되었나요?

도움이 되었습니까?

해결책

이 기사를 읽는 것부터 시작하겠습니다.

http://decipherinfosys.wordpress.com/2007/03/27/using-stored-procedures-vs-dynamic-sql-generated-by-orm/

다음은 둘 사이의 속도 테스트입니다.

http://www.blackwasp.co.uk/SpeedTestSqlSproc.aspx

다른 팁

1라운드 - 프로파일러 추적을 시작하고 실행 시간을 비교할 수 있습니다.

대부분의 사람들에게 그들을 설득하는 가장 좋은 방법은 "증거를 보여주는 것"입니다. 이 경우 동일한 데이터 세트를 검색하기 위해 몇 가지 기본 테스트 사례를 작성한 다음 저장 프로 시저 대 NHibernate를 사용하는 데 걸리는 시간 시간입니다.일단 결과를 얻은 후에 이를 그들에게 넘겨주면 대부분의 회의적인 사람들은 증거에 양보해야 합니다.

Rob의 답변에 몇 가지만 추가하겠습니다.

먼저, 테스트 케이스에 포함된 데이터의 양이 프로덕션 값과 유사한지 확인하십시오.즉, 쿼리가 일반적으로 수십만 개 또는 행이 있는 테이블에 대해 수행되는 경우 그러한 테스트 환경을 만듭니다.

둘째, nHibernate에서 생성된 쿼리와 s'proc 호출을 사용하는 것을 제외하고 다른 모든 것을 동일하게 만드십시오.간단히 공급자를 교체하여 테스트를 실행할 수 있기를 바랍니다.

마지막으로, 저장 프로시저와 저장 프로시저보다 일반적으로 훨씬 더 많은 위험이 있다는 점을 인식하세요.ORM.이를 염두에 두고 테스트에서는 모든 요소를 ​​살펴봐야 합니다.실행 시간, 메모리 소비, 확장성, 디버깅 능력 등

여기서 문제는 당신이 입증 책임을 받아들였다는 것입니다.그런 식으로 누군가의 마음을 바꿀 가능성은 거의 없습니다.좋든 싫든 사람들은 심지어 프로그래머라도 논리에 쉽게 좌우되기에는 너무 감정적입니다.당신은 그에게 증명의 책임을 다시 맡겨야 합니다. 그 사람이 당신에게 다른 방법을 설득하도록 해야 합니다. 그렇게 하면 그 사람이 스스로 조사를 하고 답을 찾도록 강요하게 될 것입니다.

저장 프로시저를 사용하는 데 있어 더 나은 주장은 보안입니다.당신이 사용하는 경우 오직 저장 프로시저 아니요 동적 SQL을 사용하면 애플리케이션 데이터베이스 사용자에 대한 SELECT, INSERT, UPDATE, DELETE, ALTER 및 CREATE 권한을 비활성화할 수 있습니다.이는 대부분의 2차 SQL 주입으로부터 사용자를 보호하는 반면, 매개변수화된 쿼리는 1차 주입에 대해서만 효과적입니다.

측정하되 마이크로 벤치마크가 아닌 방법으로 측정하세요.시스템의 실제 작업을 나타내는 것입니다.저장 프로시저에 대한 성능상의 이점이 아주 작더라도 코드에서 발생하는 다른 비용에 비하면 미미할 것입니다.실제로 데이터를 검색하고 변환하고 표시하는 등의 작업을 수행합니다.저장 프로시저를 사용하면 앱 전체에 논리가 분산된다는 점은 말할 것도 없습니다. 그리고 후자에서는 중요한 버전 제어, 단위 테스트 또는 리팩토링 지원이 없는 데이터베이스입니다.

직접 벤치마킹해보세요.샘플링된 저장 프로시저를 수백 번 실행하는 테스트베드 클래스를 작성하고 동일한 횟수만큼 NHibernate 코드를 실행합니다.각 메서드의 평균 및 중간 실행 시간을 비교합니다.

쿼리가 매번 동일하면 속도도 빠릅니다.Sql Server 2005는 SQL의 출처에 관계없이 일괄 처리의 각 문 수준에서 쿼리 계획을 캐시합니다.

장기적인 차이점은 저장 프로시저가 DBA가 관리하고 조정하기가 훨씬 더 쉬운 반면, 프로파일러 추적에서 수집해야 하는 수백 개의 서로 다른 쿼리는 악몽이라는 점입니다.

나는 이 논쟁을 여러 번 해왔습니다.
거의 항상 나는 정말 좋은 DBA를 확보하고 프로파일러가 실행되는 상태에서 proc과 코드 조각을 실행하고 DBA에게 결과가 무시할 수 있을 정도로 가깝다는 것을 보여주게 됩니다.

측정해 보세요.

실제로 이 주제에 대한 어떤 토론도 측정해 보기 전까지는 아마도 쓸모가 없을 것입니다.

그가 생각하고 있는 특정 사용 사례에 대해서는 그가 옳을 수도 있습니다.임의로 조정할 수 있는 일부 복잡한 SQL 집합의 경우 저장 프로시저가 더 빠르게 실행될 수 있습니다.그러나 최대 절전 모드와 같은 작업을 통해 얻을 수 있는 것은 캐싱입니다.이는 실제 애플리케이션의 수명 동안 훨씬 더 빨라질 수 있습니다.

추가 추상화 계층으로 인해 sproc에 대한 순수 호출보다 속도가 느려집니다.관리되는 힙에 추가 할당이 있고 호출 스택에서 추가 푸시 및 팝이 발생한다는 사실만으로도 문제의 진실은 ORM이 쿼리를 작성하는 것보다 sproc을 호출하는 것이 더 효율적이라는 것입니다. ORM은.

측정 가능하더라도 얼마나 느린지는 논쟁의 여지가 있습니다.이는 대부분의 ORM이 쿼리 수행을 전혀 방지하는 캐싱 메커니즘을 가지고 있다는 사실에서도 도움이 됩니다.

저장 프로시저가 10% 더 빠르더라도(아마도 그렇지 않을 수도 있음) 이것이 실제로 얼마나 중요한지 자문해 볼 수 있습니다.결국 중요한 것은 시스템 코드를 작성하고 유지하는 것이 얼마나 쉬운가입니다.웹 앱을 코딩하고 페이지가 모두 0.25초 안에 반환되는 경우 저장 프로시저를 사용하여 절약된 추가 시간은 무시할 수 있습니다.그러나 NHibernate와 같은 ORM을 사용하면 많은 추가 이점이 있을 수 있습니다. 이는 저장 프로시저만 사용하여 복제하기가 매우 어렵습니다.

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