저장된 절차를 더 효율적이,일반적으로,인라인 문서 현대 RDBMS 니까?[중복]

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

  •  09-06-2019
  •  | 
  •  

문제

기존의 지혜국이 저장되어 있는 절차를 항상 빠릅니다.그래서 때문에,그들은 항상 빠르고,그들을 사용하는 모든 시간.

나는 확신 이가에 기초하고 몇 가지 역사적 컨텍스트가 이번 있었다.지금,나는 옹호는 저장되었는 필요하지 않지만,나는 무엇을 알고 싶은 경우에 저장된 절차에 필요한 것은 현대적인 데이터베이스와 같은 MySQL,SQL Server Oracle,또는 <Insert_your_DB_here>.그것은 잔인하여 모든 액세스 저장 프로시저를 통해?

도움이 되었습니까?

해결책

참고 이것은 일반적인 모습에서 저장되는 절차 규제되지 않음을 보시려 DBMS.일부 DBMS(도,다른 버전의 동일한 DBMS!) 작동할 수 있습니다 이에 대하여,그래서 당신이 원 시 확인과의 대상 DBMS 기 전에 가정이 모든 아직도 보유하고 있습니다.

었 Sybase ASE,MySQL,SQL Server DBA 및 이후 거의 십 년간(따라서 응용 프로그램 개발 C,PHP,PL/SQL,C#.NET 고,Ruby).그래서 나는 특별한 분쇄하는 도끼에서 이(가끔)거룩한 전쟁입니다.

역사적 성과의 이익을 저장 프로시저는 일반적으로 다음에서(특별한 순서없이):

  • Pre-SQL 구문 분석
  • Pre-생성되는 쿼리를 실행 계획
  • 네트워크 대기 시간 감소
  • 잠재적인 캐시 혜택

Pre-SQL 구문 분석 --유사한 혜택을 컴파일된 대해석 코드를 제외하고,매우 마이크로 수준입니다.

여전히는 장점이 있나요? 매우 눈에 띄는 모두에서 현대 CPU,그러나 전송하는 경우 하나의 SQL 문을은 매우 큰 eleventy-억 번 두 번째,구문 분석하는 오버헤드를 추가할 수 있습니다.

Pre-생성되는 쿼리를 실행 계획.이 많은 경우가 순열 성장할 수 있는 매우 다루기(현대적인 최적화에 한계가 있고 컷 오프 성능을 위해).그것은 알 수 없음에 대한 매우 복잡한 SQL 가 뚜렷하고,측정(본 복잡한 쿼리고 10 초만을 생성하는 계획을하기 전에,우리는 불통 DBMS)으로 인해 대기 시간을 최적화하고 파악하는"가까운 최고의"실행 계획을 실행합니다.저장 프로시저는 것입니다,일반적으로,이 메모리에서 그래서 그것을 피할 수 있습니다.

여전히는 장점이 있나요? 가장 DBMS'(의 최신 버전)캐시 쿼리에 대한 계획을 개별 SQL 문을 크게 줄 성과 미분이 저장되어 발동 및 ad hoc SQL.거기에 몇 가지 주의 사항 및 케이스에는 그렇지 않은 경우,그래서 당신을 테스트해야에서 대상을 의미한다.

또한,더 많은 DBMS 을 제공할 수 있도록 최적화 프로그램 경로를 계획(초록 쿼리 계획)크게 최적화 시간(모두를 위해 특별히 그리고 저장 프로시저 SQL!!).

경고 캐시 쿼리 계획되지 않는 성능이 아니다.때때로서 쿼리 계획을 생성 sub-optimal.예를 들어,보내는 경우 SELECT * FROM table WHERE id BETWEEN 1 AND 99999999, DBMS 에서 선택할 수 있습니다 체 테이블 대신 스캔의 인덱스 검사 때문에 당신이 잡는 모든 행 테이블(그래서 sayeth 의 통계).는 경우 캐시 전 다음 얻을 수 있습니다 가난한 성능할 때 나중에 보내기 SELECT * FROM table WHERE id BETWEEN 1 AND 2.이 뒤에 이유입니다 의 범위 밖에 이를 게시,하지만 더 읽어보: http://www.microsoft.com/technet/prodtechnol/sql/2005/frcqupln.mspxhttp://msdn.microsoft.com/en-us/library/ms181055.aspxhttp://www.simple-talk.com/sql/performance/execution-plan-basics/

"요약하면,그들은 결정 공급이 아닌 다른 일반적인 값을 경우 컴파일이나 다시 컴파일할을 수행하였 결과 최적화 프로그램 컴파일 및 캐싱 에 대한 쿼리 계획을 특정한 값이 있습니다.아직 때에는 쿼리 계획 재사용에 대한 후 실행 동일한 쿼리에 대한 일반적인 값 ('M','R'이나'T')결과 sub-optimal performance.이 최적의 성능 문제 존재할 때까지 질 다시 컴파일.에서는 점을 기반으로, 는@P1 매개 변수 값을 제공 쿼리가 있거나 없는 성능 문제입니다."

네트워크 대기 시간 감소 A)실행하는 경우에는 동일한 SQL 이상--및 SQL 까지 추가 많 KB 의 코드--바꾸는 간단한"exec foobar"정말로 추가할 수 있습니다.B)저장되었을 이동하는 데 사용될 수 있습 절차 상의 코드를 의미한다.이 저장 셔플 많은 양의 데이터를 해제하여 클라이언트에게만 그것을 보낼 류의 정보(음!).과 유사하고 가입하세에 대 DBMS코드에서(모두가 좋아하는 스포츠 도박에 사용되는 방법이다.)

여전히는 장점이 있나요? A)현대 1 기가바이트(및 10Gb 니다.) 이더넷이 무시할 수 있습니다.B)에 따라 달라집 방법 포화된 네트워크--왜 밀어 여러 가지 메가바이트 데이터의 앞뒤를 위한 더 좋은 이유는?

잠재적인 캐시 혜택 을 수행하 server-side 변환할 수 있는 데이터의 잠재적으로 더 빠르게 수 있는 경우에 충분한 메모리 DBMS 고 필요한 데이터는 메모리에서의 서버입니다.

여전히는 장점이 있나요? 하지 않으면용 공유 메모리에 액세스하는 DBMS 데이터를,가장자리는 항상 저장되었습니다.

물론,아니한 논의는 저장 프로시저를 최적화없이 완전하지 않을 것이 토론의 매개 변수와 특별 SQL.

매개 변수화/비 SQL
종류의 십자가의 사이에 저장된 절차 및 임의 SQL,그들은 임베디드에서 SQL 문을 호스트의 언어를 사용하는"매개 변수는"에 대한 쿼리 값을,예를 들어:

SELECT .. FROM yourtable WHERE foo = ? AND bar = ?

이러한 제공을 일반화 버전을 쿼리의는 현대의 최적화하는 데 사용할 수 있 캐시(그리고 다시 사용)쿼리가 실행 계획의 결과로서 많은 성과의 이익을 저장합니다.

Ad Hoc SQL 기만 하면 콘솔창을 DBMS 및 유형에서 SQL 문입니다.과거에는,이들은"최악의"실연자(평균)이후 DBMS 방법이 없었 pre-을 최적화하는 쿼리를로에서 매개 변수가 있는 저장/proc 방법입니다.

여전히 단점? 아닙니다.가장 DBMS 하는 능력이 있는"초록"ad hoc SQL 으로 매개 변수가 있는 버전이-따라서 더 많거나 적은 부정의 차이입니다.일부 이렇게는 암시적으로 또는 사용할 수 있어야 합 명령으로 설정(SQL server: http://msdn.microsoft.com/en-us/library/ms175037.aspx Oracle: http://www.praetoriate.com/oracle_tips_cursor_sharing.htm).

수업을 배웠습니까? Moore 의 법칙을 계속하고 DBMS 최적화,모든 자료와 더 많은 정교한입니다.확실한 배치할 수 있습니다 매일 바보 같은 조그마한 SQL 문을 내부에 저장된 발동,하지만 단지 알고 있는 프로그래머의 작업에서 최적화가 아주 똑똑하고 지속적으로 찾고있는 방법을 성능을 향상시킬 수 있습니다.결국(지 않는 경우 여기에 이미)ad hoc SQL 성과가 될 것이 구별할 수 없(평균!) 에서 저장되는 절차의 성과,그래서 어떤 종류의 대규모 저장 프로시저를 사용하**전적으로"성능을 이유"**아 조산 최적화하다.

어쨌든 난 생각하는 경우를 피할 경우 상당히 바닐라 SQL,당신이 통지하지 않습 사이의 차이를 임시 저장된 절차에 있습니다.

다른 팁

이유에 대한 저장 프로시저를 사용:

  • 네트워크 트래픽을 줄일 --을 보낼 수 있는 SQL 문 네트워크를 통해.와 sprocs 실행할 수 있습니다 SQL 배치에서는 또한 더 효율적입니다.
  • 캐시 쿼리 계획 --처음 sproc 실행,SQL 서버를 만듭니다 실행하는 계획을 위해 캐시되는 재사용할 수 있습니다.이는 특히 성능에 대한 작은 쿼리가 자주 실행됩니다.
  • 는 기능을 사용하여 출력 매개변수 -만약 당신이 보내 인라인 SQL 반환하는 하나의 행만 얻을 수 있습니다 다시는 레코드 집합.와 sprocs 당신이 그들을 다시 얻을 수 있습으로 출력되며,이러한 매개 변수는 상당히 빠르다.
  • 권한 --전송할 때는 인라인 SQL,당신은 당신에 대한 사용 권한을 부여하는 테이블(s)는 사용자에게 수여하고 있는 많은 것보다 더 많은 액세스는 단지 권한을 부여 실행 sproc
  • 분 로직 --제거 SQL-코드를 생성하고 분리 데이터베이스에서.
  • 편집 할 수있는 기능을 다시 컴파일하지 않고 -이 논란의 여지가 있습니다.편집할 수 있습니다 SQL 에 sproc 지 않고 다시 컴파일할 필요합니다.
  • 찾을 수 있는 테이블이 사용됩 --with sprocs 하려는 경우,모든 SQL 문을 참조하는 특정 테이블,내보낼 수 있습니다 sproc 코드를 검색 할 수 있습니다.이보다 훨씬 쉽게 그것을 찾기 위해 노력하고 있습니다..
  • 최적화 -그것의 쉬우 DBA 을 최적화하는 SQL 고 조정할 때 데이터베이스 sprocs 사용됩니다.그것은 쉽게 찾을 수 없는 인덱스와 같은.
  • SQL injection attacks --제대로 작성된 인라인 SQL 수 있습 공격을 방어하지만,sprocs 을 위해 더 나은 이 보호합니다.

많은 경우에,저장되는 절차가 실제로 느리기 때문에 그들은 더 genaralized.저장 하는 동안 절차를 수 있는 매우 조정,에 경험이 충분히 개발 및 제도적 마찰하는 그들은 왼쪽 장소에서 한 번 그들은 작업,그래서 저장된 절차 자주하는 경향이 많이 반환 열에"단지의 경우"-원하지 않기 때문에 배포하는 새로운 저장 프로시저를 변경할 때마다 응용 프로그램입니다.는 또/M,다른 한편으로는,요청만 열 응용 프로그램을 사용하는 네트워크 트래픽을,불필요한 조인,etc.

그것은 토론되는 격노에와에서(예를 들어, ).

그것은 쉽게 쓰는 나쁜 저장 프로시저를 그대로 쓰는 나쁜 데이터 액세스 논리에 있습니다.

나의 기본 설정이 저장되었지만,그 때문에 나는 일반적으로 작동이 매우 큰 복잡한 응용 프로그램에서는 기업 환경에 있는 Dba 는 누구에 대해 책임을 유지하는 데이터베이스 서버를 실행하는 달콤.

다른 상황에서 나는 행복에 대한 충분의 데이터 액세스와 같은 기술 LINQ 의 돌을 최적화할 수도 있습니다.

순수한 성능을 유일한 고려하지 않습니다,하지만.같은 다양한 측면에 보안 구성 및 관리하는 일반적으로 적어도 중요합니다.

편집:동 Frans 부마의 문서를 참으로 자세한 정보,그리워 포인트와 관련하여 보안입니다.는 사실 그것은 5 년 동안 오래 된 도움이 되지 않의 관련성,중 하나입니다.

가 눈에 띄는 속도의 차이에 대한 저장 프로시저를 매개 변수가 있는 대비에 대한 쿼리는 가장 현대적인 데이터베이스이기 때문에,데이터베이스에도 캐시를 실행하는 계획들에 대한 쿼리를 처리합니다.

참고 매개 변수가 있는 쿼리를 동일하지 않으로 임시 sql.

주요 이유 imo 여전히 부탁을 저장된 절차에 오늘 함께 할 수 security.사용하는 경우에 저장된 절차 , 비활성화할 수 있습니다 삽입,SELECT,UPDATE,DELETE,변경,삭제 및 만들기 등에 대한 사용 권한 응용 프로그램의 사용자만이와 함께 떠나는 실행이 있습니다.

이 제공합금에 대한 추가적인 보호 2 차 sql injection.쿼리만을 보호에 대하여 1 주입입니다.

물론,실제 성능을 해야하에서 측정된 개별 사례,지 않는 것으로 간주됩니다.하지만 경우에도 성능이 저장 프로시저를 통해,좋은 이유가 있을 사용:

  1. 응용 프로그램 개발되지 않고 항상 최고의 SQL 더.저장 프로시저를 숨 깁니다 SQL 응용 프로그램에서.

  2. 저장 프로시저는 자동으로 사용하 bind 변수입니다.응용 프로그램 개발자들은 종종 피 bind 변수하기 때문에 그들처럼 보이는 불필요한 코드와 쇼비에서 작은 테스트 시스템이다.나중에 실패하는 바인딩 변수를 사용할 수 있는 스로틀 RDBMS 성능입니다.

  3. 저장 프로시저를 만들의 층 간접하는 데 유용할 수 있습니다.그것은 변경 가능합 구현 정보(을 포함한 테이블 구조)데이터베이스에 대한 측면을 만지지 않고 응용 프로그램 코드입니다.

  4. 운동을 만드는 저장된 절차를 문서화하는 데 유용할 수 있습니다 모든 데이터베이스 상호 작용에 대한 시스템입니다.그것은 쉽게 업데이트 문서를 때는 것을 변경합니다.

는 말했다,나는 일반적으로 스틱 원 SQL 내 응용 프로그램에서는 내가 통제할 수 있습니다.에 따라 달라집하는 개발 팀과 철학입니다.

하나는 주제 아무도 아직으로 언급된 혜택의 저장 프로시저는 보안입니다.를 구축하는 경우 응용 프로그램이 독점적으로 데이터 액세스를 통해 저장된 절차를 수행할 수 있는 잠금 데이터베이스 그래서 단지를 통해 접근이 그들을 저장합니다.그 때문에,경우에도 누군가가 데이터베이스 ID 및 비밀번호를 제한될 것입에서 그들이 무엇을 볼 수 있습니다 또는지에 대하여는 데이터베이스입니다.

2007 년에서 나는 프로젝트에서,우리가 우리 사용되는 MS SQL 서버를 통해 ORM.We had2 큰 성장하는 테이블했 7-8 초의 부하시간에는 SQL Server.후기 2 대,저장 SQL 절차,그리고 최적화하는 그들을 쿼리로부터 계획,각각의 DB 로딩 시간이 가지고 아래로 20 밀리,그래서 거기에 명확하게는 아직도 효율을 사용하는 이유는 저장 SQL 절차가 있습니다.

즉,우리가 발견한 가장 중요한의 이익을 저장 프로시저였다 추가 maintaince-성,보안,데이터 무결성,그리고 디커플링 비즈니스 논리 미들웨어에서 논리,benefitting 모든 미들웨어-논리에서 재사용의 2 절차가 있습니다.

우리의 ORM 공급업체로 만든 일반적인 주장하는 발사이 많은 작은 SQL 쿼리했을 것 보다 더 효율적이 가져오는 큰 가 데이터를 설정합니다.우리의 경험(놀랍게도)보여주었 다른 뭔가가 있습니다.

이 과정의 사이에 차이는 기계,네트워크,운영체제의 SQL 서버 응용 프로그램 프레임워크,ORM 프레임워크,그리고 언어를 구현,그래서 측정은 어떤 혜택을,당신은 생각에서 얻을 수 있습니다.

까지 그것은 우리가 벤치마킹 우리는 문제를 발견했 사 ORM 및 데이터베이스를 복용하는 모든 짐.

내가 사용하는 것을 선호하 SP 때 그것을 사용합니다.SQL Server 어쨌든 없음 성능 이점을 SP 이상 매개 변수화 쿼리가 있습니다.

그러나서 현재 작업을 보급하는 우리가 사용하도록 강요하는 SP 기 때문에 우리 고객의 필요 합니다.그들은 느끼고 더 안전합니다.내가되지 않은 여기에서 충분히 보면 우리를 구현하는 역할 기반 보안하지만 나는 느낌이 있습니다.

그래서 고객의 감정 트럼프는 모든 다른에서 인수합니다.

나에게 한 가지 이점의 저장 프로시저를 호스트에서는 언어 중립적인:로 전환할 수 있습 C,Python,PHP,어떤 응용 프로그램을 다른 프로그래밍 언어가지 않고 다시 쓰기 코드.또한,일부 기능은 다음과 같은 대량 작업을 개선 정말의 성능을 쉽게 사용할 수 없(지 않나요?) 에서 호스트 언어입니다.

읽 Frans 의 부마 우수한 게시물 (의 경우 바이어스)습니다.

내가 말할 수 있는 SQL server.에서는 플랫폼,저장 프로시저는 사랑하기 때문에 서버에 저장이 실행 계획,대부분의 경우에는 최대 속도 성능이 좋은 비트입니다.내가 말하"대부분의 경우에"때문에,면 SP 는 매우 다양한 경로의 실행을 얻을 수 있습니다 최적의 성능.그러나,이러한 경우에는 일부를 계몽토 SPs 작업 속도를 높일 수 있습니다.

저장 프로시저를 사용하에 대한 CRUD 작업은 아마도 잔지만,그에 따라 달라집니다 도구를 사용하고 당신의 자신의 환경(또는 요구 사항).내가 선호하는 인라인 SQL,그러나 나를 사용할 수 있는지 확인 쿼리 SQL 주입을 방지하기 위해 공격입니다.나는 나의 이 감사화 알림 수 있습니다 무엇을 잘못하지 않은 경우 조심해야합니다.

저장 프로시저를 가질 수 있는 실제 성능과 함께 작업할 때 여러 세트의 데이터를 반환합니다.그것은 일반적으로 더 효율적 프로세스 세트의 데이터 저장 프로시저에 보내는 것보다 그들을 통해 와이어에 처리할 수 있는 클라이언트.

깨닫고 이것은 비트 떨어져 화제를 질문,하지만 당신은 많이 사용하여 저장된 절차가 있는지 확인하는 일관된 방법을 넣어서 어떤 종류의 제어 소스(예를 들어,파괴 또는 git)및 마이그레이션할 수 없 업데이트에서 개발 시스템을 테스트하는 시스템을 생산 시스템입니다.

이 때,손으로 완료하는 방법을 쉽게 감사의 코드는,신속하게 이다.

내가 알지 못하는 그들은 빠릅니다.사 ORM 를 위한 데이터에 액세스(하지 않았습니다 다시 발명의 바퀴)그러나 내가 깨닫는 항상 가능한 옵션이 있습니다.

Frans 부마가 좋은 이 주제에 대한 기사: http://weblogs.asp.net/fbouma/archive/2003/11/18/38178.aspx

저장 프로시저한 경우에는 SQL 코드가 자주 실행하기 때문에 데이터베이스에 저장된 메모리에 있습니다.는 경우 반복적으로 동일한 코드의 외부 저장 proc,당신은 이를 부과 성능 데이터베이스에서 다시 구문 분석 과 동일한 코드습니다.

나는 일반적으로 자라는 코드로 저장되어 발동 또는다.(.NET)체 및 실행으로 많은 시간을 필요합니다.

그렇습니다,그들은 빠른에 관심을 가져 주셔서 감사합니다.SQL 구성은 거대한 성능 튜닝요.면 나는 일을 뒤 사무실 유형의 응용 프로그램 내 건너 뛸 수 있습니다 그들지만 아무것도 생산에 직면 내가 그들을 사용에 대한 확실한 이유 다른 사람 말이 너무...즉 보안입니다.

이럴...

을 제한하는"C_UD"작업을 저장 프로시저를 유지할 수 있는 데이터 무결성 논리는 한 장소에서.이 수행할 수도 있습 제한하여"C_UD"작업의 단일 중 도자기층이다.

읽기 작업을 제공할 수 있는 응용 프로그램에 참가할 수 있는 테이블/열이 그들이 필요합니다.

저장 프로시저를 사용할 수도 있습신의 매개 변수가 있는 쿼리(ad-hoc 쿼리)에 대한 몇 가지 다른 장점:

  • 당신이 뭔가를 해결해야(정렬 순서 등). 당신이 필요하지 않아 다시 컴파일 앱
  • 한 액세스가 거부될 수 있습니다에 대한 모든 테이블에는 사용자 계정만 액세스 권한을 부여하여 저장된 절차 및 일부 액세스는 저장 프로시저를 통해.할 수 있습니다이 방법이 사용자 정의 유효성 검사의 모든 입력이 훨씬 더 유연한 보다 테이블 제약 조건이 있습니다.

네트워크 트래픽 감소--SP 은 일반적으로 더 Dynamic SQL.기 때문에 사람들을 만들지 않는 새로운 SP 에 대한 모든 선택해야 하는 경우 단지 하나의 열 당신은 말을 사용하 SP 있는 열 그들이 필요로하고 나머지는 무시합니다.추가 열고 덜 네트워크 사용량 당신은 그냥 갔습니다.또한 당신이 하는 경향이 많은 클라이언트의 경우 필터링 SP 사용됩니다.

캐싱--MS-SQL 을 처리하지 않습니다 그들에게 어떤 다르게,이후 MS-SQL2000 할 수 있습의되 7 그러나 기억나지 않습니다.

권한 문제 없어-기 때문에 거의 모든 것을 내가 할 웹 또는 일부 중간 응용 프로그램 계층는 모든 데이터베이스에 액세스합니다.는 유일한 소프트웨어와 함께 작동하는 직원이 있는 클라이언트를 데이터베이스에 액세스하는 제 3 자는 제품 설계에 대한 사용자가 직접 액세스를 기반으로 사용자 권한이 있습니다.그리고 예 MS-SQL 사용 권한 보안 모델 SUCKS!!!(하지 않은 시간을 보냈 2008 년에 아직)마지막 부분이 보고 싶의 조사는 얼마나 많은 사람들은 여전히 하고 직접적으로 클라이언트/서버 프로그래밍 vs 웹 응용 프로그램 중 서버 프로그래밍;그리고 만약 그들이 하는 대규모 프로젝트 왜 ORM.

분리--사람들이 질문에 왜 당신은 비즈니스 로직 외부의 계층입니다.도 하고자 하는 경우 별도의 데이터 처리 코드가 있는 방법을 두지 않고 데이터베이스에서.

는 능력을 편집하고 있는 것은 없 테스트 및 버전제어에 대해 걱정할 필요가?또한 단지 문제가 클라이언트/서버,웹 세계에서 문제가되지 않습니다.

테이블을 찾--는 경우에만을 식별할 수 있습니다 SP 사용하는 것,그것으로 스틱 도구의 버전 관리 시스템,에이전트는 약탈하거나 visual studio 찾을 수 있습니다.

최적화--귀하의 DBA 해야의 도구를 사용하여 데이터베이스를 찾을 수 있는 쿼리를 필요로 최적화입니다.데이터베이스를 말할 수 있는 DBA 는 어떤 문은 이야기까지 대부분의 시간과 자원을 그들은 해결할 수 있습니다.복잡한 SQL 문을 프로그래머에게 말해야 한 이야기하는 DBA 는 경우에는 간단한 선택에 대해 걱정하지 않습니다.

SQL injection attacks--SP 제공하지 않는 더 나은 보호합니다.만 그들은 고개를 끄덕은 그들의 대부분을 가르쳐 매개 변수를 사용하여 대 dynamic SQL 는 대부분의 예시 매개 변수입니다.

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