복붙노트

[SQL] 임시 쿼리 나 저장 프로 시저 : 어느 것이 나은가? [닫은]

SQL

임시 쿼리 나 저장 프로 시저 : 어느 것이 나은가? [닫은]

당신이 어떤 이유에서 LINQ를 사용할 수 없습니다 가정하면, (SQL 서버 인수의 이익을 위해, 말)는 저장 프로 시저에 쿼리를 배치하는 더 나은 방법입니다, 또는 임시 쿼리가 데이터베이스에 대해 실행하는 연습은 좋은과 같다?

해결법

  1. ==============================

    1.대부분 윈폼 클라이언트를 작성하는 내 경험에 / 서버는 이러한 내가 왔어요 간단한 결론에있는 앱입니다 :

    대부분 윈폼 클라이언트를 작성하는 내 경험에 / 서버는 이러한 내가 왔어요 간단한 결론에있는 앱입니다 :

    저장 프로 시저를 사용합니다 :

    사용 임시 쿼리 :

    내 응용 프로그램의 대부분에서 나는 사용한 적이 모두 SP의 및 임시 SQL, 그들은 단지 열심히 버전 제어, 테스트, 단지 C #을 같은 코드 끝나게 및 유지 보수로 내가 적게 SP의를 사용하고 찾을 수 있지만. 당신이하지에 대한 구체적인 이유를 찾을 수 없다면 나는 임시 SQL을 사용하는 것이 좋습니다 것입니다.

  2. ==============================

    2.나는 SQL Server 이외의 아무것도 말할 수 없다,하지만 당신은 6.5 또는 이전에 아니라면 성능 인수가 크게 유효하지 않습니다. SQL Server는 대략 십 년간 동안 임시 실행 계획을 캐시되었습니다.

    나는 SQL Server 이외의 아무것도 말할 수 없다,하지만 당신은 6.5 또는 이전에 아니라면 성능 인수가 크게 유효하지 않습니다. SQL Server는 대략 십 년간 동안 임시 실행 계획을 캐시되었습니다.

  3. ==============================

    3.나는이 데이터베이스를 유지해야 사람과 사용자 인터페이스를 개발하는 사람들 사이의 갈등을 해소하기위한 기본적인 생각합니다.

    나는이 데이터베이스를 유지해야 사람과 사용자 인터페이스를 개발하는 사람들 사이의 갈등을 해소하기위한 기본적인 생각합니다.

    효과적으로 조정하거나 관리하기 어려운 있기 때문에 데이터 사람으로서, 나는 애드혹 쿼리를 통해 액세스되는 데이터베이스 작업을 고려하지 않을 것입니다. 어떻게 스키마에 대한 변경은 무엇을해야합니다 영향을 알 수 있는가? 또한, 나는 사용자가 지금까지 보안상의 이유로 데이터베이스 테이블에 직접 액세스 권한을 부여해야한다 (내가 아니라 평균 SQL 주입 공격을 할뿐만 아니라, 생각하지 않는다 그것은 직접 권리를 허용하지에 대한 기본적인 내부 통제이며, 모든 사용자가 필요로하기 때문에 응용 프로그램 용으로 설계된 전용 발동을 사용합니다.이 가능 사기를 방지하는 것입니다. 사기에 큰 위험이 있습니다 직접 삽입, 업데이트 또는 테이블에 대한 삭제 권한을 가능하게하는 모든 금융 시스템을.이 나쁜 일이다.).

    데이터베이스는 객체 지향 데이터베이스 관점에서 매우 나쁜 될 수있는 객체 지향 관점에서 좋은 것 같다 코드하지 않습니다.

    우리 개발자들은 우리의 모든 데이타베이스 등에 액세스 그것이 훨씬 빠르게 데이터 중심의 버그를 수정하고 단순히 생산 환경에 시저를 실행하기보다는 코드와 재 컴파일의 새로운 지점을 만들 수를 변경할 수 없기 발동을 통해 것을 기쁘게 생각하고 우리에게 생산에 다시로드합니다. 우리는 소스 제어에 문제가 전혀되지 않도록, 전복에있을 우리의 모든 발동이 필요합니다. 이 서브 버전에없는 경우는 주기적으로 DBA가 감소 얻을 것이다, 그래서 소스 제어를 사용하여 아무런 저항이 없다.

  4. ==============================

    4.저장 프로시 저는 데이터베이스에 대해 수행 한 작업을 캡슐화하는 소프트웨어 계약을 나타냅니다. 절차의 코드, 데이터베이스 자체도 스키마는 절차의 입력과 출력은 동일하게 유지 단지 있도록, 컴파일에 영향을주지 않고 변경 코드를 배포 할 수 있습니다.

    저장 프로시 저는 데이터베이스에 대해 수행 한 작업을 캡슐화하는 소프트웨어 계약을 나타냅니다. 절차의 코드, 데이터베이스 자체도 스키마는 절차의 입력과 출력은 동일하게 유지 단지 있도록, 컴파일에 영향을주지 않고 변경 코드를 배포 할 수 있습니다.

    응용 프로그램에서 쿼리를 삽입하여 단단히 데이터 모델에 직접 결합된다.

    이 여전히 타이트 커플 링 때문에 같은 이유로, 단순히 데이터베이스의 모든 테이블에 대해 CRUD 쿼리를 저장 프로 시저를 만들 수있는 좋은 방법도 없습니다. 절차 대신 부피 거칠게 동작해야한다.

    보안의 관점에서, 그것은 당신의 응용 프로그램에서 사용 해제의 db_datareader 및 db_datawriter에 좋은 연습입니다 만 저장 프로 시저에 액세스 할 수 있습니다.

  5. ==============================

    5.저장 프로 시저, 그들이 컴파일 ... 확실히 갈 수있는 방법입니다 손 전에 실행 계획을 가지고 있고 그들에 권한 관리를 할 수 있습니다.

    저장 프로 시저, 그들이 컴파일 ... 확실히 갈 수있는 방법입니다 손 전에 실행 계획을 가지고 있고 그들에 권한 관리를 할 수 있습니다.

    내가 저장 프로 시저에이 모든 소스 제어 문제를 이해하지 않습니다. 단지 당신이 징계를 조금 있다면 당신은 확실히 그들을 제어 할 수있는 소스.

    항상 저장 프로 시저의 소스 인 .SQL 파일로 시작합니다. 당신이 당신의 코드를 작성 일단 버전 제어에 넣어. 당신이 당신의 저장 프로 시저를 편집 할 다음 번에 당신의 데이터베이스가 아닌 소스 컨트롤에서 그것을 얻을. 당신이 따르는 경우에, 당신은 당신의 코드로 좋은 소스 컨트롤로해야합니다.

    내가 추측 알고 조금 무관하지만 좋은 불구하고 여기에 코드를 작성하는 위치에 대한 자신의 규칙이 ...의 ... 여기에 오라클에서 톰 카이트을 인용하고 싶습니다.

  6. ==============================

    6.우리의 응용 프로그램에서 쿼리의 내용을 제공한다 (때로는 저장 프로 시저를 호출입니다) 코드의 층이있다. 이것은 우리를 할 수 있습니다 :

    우리의 응용 프로그램에서 쿼리의 내용을 제공한다 (때로는 저장 프로 시저를 호출입니다) 코드의 층이있다. 이것은 우리를 할 수 있습니다 :

    우리는 절차가 저장 필요가 없습니다 액세스 제어는, 오히려 데이터베이스보다 중간 계층에서 구현됩니다. 이것은 몇 가지 방법에 임시 쿼리 및 저장 발동의 중간 도로.

  7. ==============================

    7.다른 포스트에서 내 대답 : 저장 프로 시저 때문에 더 유지 보수가 있습니다 :

    다른 포스트에서 내 대답 : 저장 프로 시저 때문에 더 유지 보수가 있습니다 :

    코드의 반복을 사용하면 유지 보수 응용 프로그램을 만들려고 할 때 당신이 할 수있는 최악의 일입니다!

    당신은 요구 사항이 여러 위치에서 수정 될 수 있다는 논리 오류를 발견하면 어떻게됩니까? 당신은 당신의 코드를 복사 & 붙여 넣기 마지막 자리를 변경하는 것을 잊지 것이 더 쉽다입니다.

    제 생각에는, 성능 및 보안 향상은 추가 플러스입니다. 당신은 여전히 ​​불안 / 비효율적 인 SQL 저장 프로 시저를 작성할 수 있습니다.

    그것은 다른 DB의 생성을위한 모든 저장 프로 시저에서 스크립트에 매우 어렵지 않다. 사실 - 그것은 걱정할 차 / 외래 키가 없기 때문에 테이블을 내보내는 것보다 쉽다.

  8. ==============================

    8.이 모두에 대한 설득력있는 인수는 - 모든 중앙 저장소에있는 저장 프로 시저는하지만, (잠재적으로) 마이그레이션하기 어려운 및 임시 쿼리 그들이 당신의 코드로, 그러나 그들은 또한에서 찾을 어렵게 될 수 있기 때문에 쉽게 디버그 암호.

    이 모두에 대한 설득력있는 인수는 - 모든 중앙 저장소에있는 저장 프로 시저는하지만, (잠재적으로) 마이그레이션하기 어려운 및 임시 쿼리 그들이 당신의 코드로, 그러나 그들은 또한에서 찾을 어렵게 될 수 있기 때문에 쉽게 디버그 암호.

    저장 프로 시저가 더 효율적이라는 주장은 더 이상 유지 물하지 않습니다. 링크 텍스트

    당신이 당신의 자신의 결정을 내릴 수 있도록 동적 쿼리 대 저장 프로 시저에 대한 구글을하는 것은 괜찮은 인수에게 어느 쪽이든 아마 최선을 보여줍니다 ...

  9. ==============================

    9.코드로 당신의 쓰기 SQL이 이미 미래에 두통 ​​자신을 설정하는 경우 저장 프로 시저, 가능한 한 사용되어야한다. 그것은 코드를 작성하지로 SPROC를 작성하는 같은 시간 정도 걸립니다.

    코드로 당신의 쓰기 SQL이 이미 미래에 두통 ​​자신을 설정하는 경우 저장 프로 시저, 가능한 한 사용되어야한다. 그것은 코드를 작성하지로 SPROC를 작성하는 같은 시간 정도 걸립니다.

    중간 부하에서 큰 실행 만이 풀 타임 생산에 들어가는 번 심하게 최적화 된 쿼리가 시스템을 망치와 크롤 링을 제공하는 쿼리를 생각해 보자. 대부분의 SQL 서버에서 당신은 그것을 사용하는 유일한 응용 프로그램 / 서비스되지 않습니다. 응용 프로그램이 이제 문 화가 사람의 무리를 가져왔다.

    당신이 sprocs가있는 쿼리가있는 경우 당신은 또한 컴파일하거나 응용 프로그램을 깨고 밖으로 친절한 관리하는 DBA 및 최적화 할 수 있습니다. DBA 년대이 분야의 전문가들로 구성되어 있습니다 기억하십시오, 그들은 할 수와하지 무엇을 알고있다. 그것은 그들의 더 큰 지식을 활용하는 의미가 있습니다!

    편집 : 사람은 재 컴파일이 게으른 변명했다! 그래 당신이 다시 컴파일 및 데스크톱 1000의에 응용 프로그램을 배포 할 때 당신이 어떻게 느끼는지 게으른 볼 수 있습니다 DBA가 당신에게 있기 때문에, 모두가 당신의 임시 쿼리가 너무 많은 서버 시간을 먹는 것을!

  10. ==============================

    10.당신이 데이터베이스에 직접 1000 데스크톱을 연결할 수 있다면 그것은 좋은 시스템 아키텍처?

    당신이 데이터베이스에 직접 1000 데스크톱을 연결할 수 있다면 그것은 좋은 시스템 아키텍처?

  11. ==============================

    11.어떤 것들은 여기에 대해 생각하는 : 누가 어쨌든, 저장 프로 시저를 필요?

    어떤 것들은 여기에 대해 생각하는 : 누가 어쨌든, 저장 프로 시저를 필요?

    분명히 그것은 보안하는 공공 대면 환경에서 임시 쿼리 사용하는 경우에 대해 생각하는 자신의 필요와 선호하지만, 하나 개 매우 중요한 것은의 문제이다. 항상 그들을 매개 변수화 및 SQL 주입 공격과 같은 일반적인 취약점에 대한 조심.

  12. ==============================

    12.그들은 재 컴파일없이 변경 될 수 있기 때문에 저장 프로 시저는 중대하다. 나는 가능한 한 자주 사용하려고합니다.

    그들은 재 컴파일없이 변경 될 수 있기 때문에 저장 프로 시저는 중대하다. 나는 가능한 한 자주 사용하려고합니다.

    나는 동적으로 사용자 입력을 기반으로 생성 된 쿼리에 대해 임시을 사용합니다.

  13. ==============================

    13.이유로 발동은 다른 사람에 의해 언급 또한이 프로파일 또는 PROC의 부품 발동 조정하는 것이 더 쉽습니다. 당신이없는이 방법은 SQL 서버로 전송되고 있는지 확인하려면 자신의 응용 프로그램을 실행하는 사람에게

    이유로 발동은 다른 사람에 의해 언급 또한이 프로파일 또는 PROC의 부품 발동 조정하는 것이 더 쉽습니다. 당신이없는이 방법은 SQL 서버로 전송되고 있는지 확인하려면 자신의 응용 프로그램을 실행하는 사람에게

    당신이 경우에 사용하는 임시 쿼리가 있는지가 매개 변수화되어 있는지 확인

  14. ==============================

    14.매개 변수화 된 SQL 또는 SPROC는 ... 성능 스탠드 지점에서 중요하지 않습니다 ... 당신은 최적화 중 하나를 조회 할 수 있습니다.

    매개 변수화 된 SQL 또는 SPROC는 ... 성능 스탠드 지점에서 중요하지 않습니다 ... 당신은 최적화 중 하나를 조회 할 수 있습니다.

    나를 위해 SPROC의 마지막 남아있는 이점이 난 단지 당신이 Parametized SQL ANY 쓰기 더 많은 권한을 연결 문자열을했다 withing에 로그인을 (사용하는 경우 ... sprocs가 실행 내 로그인 권한을 부여하여 많은 SQL 권한 관리를 제거 할 수 있다는 것입니다 종류의 테이블 중 하나를 선택 문 그들은) 예를 들어 너무 액세스 할 수 있습니다.

    나는 아직도하지만 매개 변수화 된 SQL을 선호 ...

  15. ==============================

    15.나는 임시 쿼리를 사용에 대한 강력한 주장을 발견하지 않았습니다. 특히 C #을 / 자바 / PHP 코드와 혼합하는.

    나는 임시 쿼리를 사용에 대한 강력한 주장을 발견하지 않았습니다. 특히 C #을 / 자바 / PHP 코드와 혼합하는.

  16. ==============================

    16.의 sproc 성능 인수는 이론에 불과 - 3 위에 RDBMS 쿼리 계획 캐싱을 사용하고 잠시 있었다. 그것의 문서화 된 ... 또는 1995 여전히?

    의 sproc 성능 인수는 이론에 불과 - 3 위에 RDBMS 쿼리 계획 캐싱을 사용하고 잠시 있었다. 그것의 문서화 된 ... 또는 1995 여전히?

    그러나 앱에서 SQL을 삽입하는 것은 끔찍한 디자인은 너무 - 코드 유지 보수가 많은 누락 된 개념이 될 것으로 보인다.

    응용 프로그램이 ORM 처음부터 시작할 수 있으면 (그린 필드 응용 프로그램은 멀리 몇 가지 사이에있다!) 그 좋은 선택이 클래스 모델이 DB 모델을 드라이브로 - 그리고 많은 시간을 절약 할 수 있습니다.

    ORM 프레임 워크를 사용할 수없는 경우 우리는 우리가 그들을 필요로하는 SQL 문자열을 조회하는 SQL 자원 XML 파일을 생성하는 방식의 하이브리드 (그들은 다음 자원 프레임 워크에 의해 캐시) 촬영했다. 는 SQL이 코드에서 수행 사소한 조작을 필요로하는 경우 - 주요 SQL 문자열 조작이 필요한 경우 우리는 접근 방식을 재고.

    및 배포는 SVN에서 간단한 체크 아웃 인 개발자가 쉽게 관리이 하이브리드 접근 빌려주는 (우리 팀이 쿼리 계획을 읽을 수있는 밝은 정도이기 때문에 어쩌면 우리는 소수이다). (물론의 ORM 도구로하지 쉽지만, 레거시 시스템 또는 비 지원되는 데이터베이스이 작품에 연결)을 SQL 리소스 파일에서 바로 스왑 - 또한, 쉽게 RDBMS를 전환한다

  17. ==============================

    17.당신의 목표는 무엇인지 따라 달라집니다. 당신이 항목의 목록을 검색 할 그것은 예를 들어, 응용 프로그램의 전체 실행 중에 한 번 발생하면, 그것은 가치가 아마 저장 프로 시저를 사용하는 노력이 아니다. 성능이 더 좋을 것 때문에 다른 한편으로는, 반복적으로 실행하고 실행하는 (상대적으로) 시간이 오래 걸리는 쿼리는 데이터베이스 저장을위한 훌륭한 후보입니다.

    당신의 목표는 무엇인지 따라 달라집니다. 당신이 항목의 목록을 검색 할 그것은 예를 들어, 응용 프로그램의 전체 실행 중에 한 번 발생하면, 그것은 가치가 아마 저장 프로 시저를 사용하는 노력이 아니다. 성능이 더 좋을 것 때문에 다른 한편으로는, 반복적으로 실행하고 실행하는 (상대적으로) 시간이 오래 걸리는 쿼리는 데이터베이스 저장을위한 훌륭한 후보입니다.

    응용 프로그램이 데이터베이스 내에서 거의 살고있는 경우, 저장 프로 시저는 생각할 필요도 없습니다. 데이터베이스는 접선 방향으로 중요하다에 데스크톱 응용 프로그램을 작성하는 경우는 한 곳에서 모든 코드를 유지으로, 임시 쿼리, 더 좋은 옵션이 될 수 있습니다.

    @Terrapin : 나는 당신이 필요가 없다는 사실이 수정을 위해 응용 프로그램을 재 컴파일 할 것을 당신의 주장은 저장 프로 시저하게 생각하는 더 나은 옵션은 비 스타터입니다. 이 임시 쿼리를 통해 저장 프로 시저를 선택하는 이유가 될 수 있지만 강력한 뭔가가없는 경우, 컴파일 문제는 게으름이 아닌 진짜 이유처럼 보인다 수 있습니다.

  18. ==============================

    18.내 경험 질의 및 / 또는 저장 프로 시저의 90 %는 (적어도 손으로) 전혀 쓸 수 없습니다해야한다는 것입니다.

    내 경험 질의 및 / 또는 저장 프로 시저의 90 %는 (적어도 손으로) 전혀 쓸 수 없습니다해야한다는 것입니다.

    데이터 액세스는 어떻게 든를 automaticly 생성해야합니다. 당신은 staticly 컴파일 시간 또는 런타임에 동적 있지만 (객체에 속성) 테이블에 추가 열을 할 때 당신은 단지 하나의 파일을 수정해야합니다에서 절차를 생성하려는 경우 당신이 결정할 수 있습니다.

  19. ==============================

    19.나는 데이터 액세스 계층은 바로 SQL 쿼리를 실행하는 프로그램 코드에서 모든 데이터 액세스 로직을 유지하는 것을 선호합니다. 반면에, 데이터 관리 로직은 내가 트리거, 저장 프로 시저, 사용자 정의 함수 및 기타 등등의 형태로 데이터베이스에 넣어. 나는 데이터베이스 ifying의 가치하다고 생각 무언가의 예는 데이터 생성이다 - 우리의 고객이 FIRSTNAME과 성을 가지고 가정합니다. 이제 사용자 인터페이스 일부 사소 로직으로부터 유도 된 표시 이름을 필요로한다. 세대를 들어, I는 로우 (또는 다른 소스 데이터)가 업데이트 될 때마다 트리거에 의해 실행되는 프로 시저를 생성한다.

    나는 데이터 액세스 계층은 바로 SQL 쿼리를 실행하는 프로그램 코드에서 모든 데이터 액세스 로직을 유지하는 것을 선호합니다. 반면에, 데이터 관리 로직은 내가 트리거, 저장 프로 시저, 사용자 정의 함수 및 기타 등등의 형태로 데이터베이스에 넣어. 나는 데이터베이스 ifying의 가치하다고 생각 무언가의 예는 데이터 생성이다 - 우리의 고객이 FIRSTNAME과 성을 가지고 가정합니다. 이제 사용자 인터페이스 일부 사소 로직으로부터 유도 된 표시 이름을 필요로한다. 세대를 들어, I는 로우 (또는 다른 소스 데이터)가 업데이트 될 때마다 트리거에 의해 실행되는 프로 시저를 생성한다.

    이 데이터 액세스 계층은 데이터 및 데이터 액세스에 대한 데이터베이스와 모든 것을이 다소 일반적인 오해 것으로 보인다 거기에 "그냥 때문"에 간다. 이것은 단순히 잘못된 그러나 나는이 아이디어에서 파생 디자인을 많이 참조하십시오. 아마도 이것은하지만, 로컬 phenomonon이다.

    난 그냥 이렇게 많은 심하게 디자인 된 사람을 본 후 SP의 아이디어 해제 할 수 있습니다. 예를 들어, 하나 개의 프로젝트는 내가 사용의 모든 테이블과 그들이 발생 가능한 모든 쿼리에 대한 CRUD 저장 프로 시저의 집합을 참여했다. 그렇게함으로써 그들은 단순히 다른 완전히 무의미 레이어를 추가했다. 심지어 그런 것들에 대해 생각하는 고통이다.

  20. ==============================

    20.요즘 나는 좀처럼 저장 프로 시저를 사용하지 않습니다. 난 단지 쉽게 코드에서 수행 할 수없는 복잡한 SQL 쿼리를 사용합니다.

    요즘 나는 좀처럼 저장 프로 시저를 사용하지 않습니다. 난 단지 쉽게 코드에서 수행 할 수없는 복잡한 SQL 쿼리를 사용합니다.

    저장 프로 시저와 OR 매퍼 잘 작동하지 않기 때문에 주된 이유 중 하나입니다.

    요즘 난 당신이 어떤 종류의 OR 매퍼를 사용하지 않는 비즈니스 응용 프로그램 / 정보 시스템을 쓸 수있는 아주 좋은 이유를 필요가 있다고 생각합니다.

  21. ==============================

    21.그래서 빨리 작동 쿼리 애드혹 대신에 코드 블록으로 저장 프로 시저 작업. 또 다른 한가지는 프로 시저주고 재 컴파일 옵션을 저장하는 가장 중요한 부분의 SQL은 그냥 애드혹 쿼리에서이 같은 저장 프로 시저 아무것도 사용합니다.

    그래서 빨리 작동 쿼리 애드혹 대신에 코드 블록으로 저장 프로 시저 작업. 또 다른 한가지는 프로 시저주고 재 컴파일 옵션을 저장하는 가장 중요한 부분의 SQL은 그냥 애드혹 쿼리에서이 같은 저장 프로 시저 아무것도 사용합니다.

    쿼리 및 저장 프로 시저의 일부 결과는 내 개인 특급의이 다르다. 이를 확인하기위한 사용 출연진과 비밀 기능.

    큰 프로젝트는 성능을 향상시키기 위해 저장 프로 시저를 사용합니다.

    나는 내 프로젝트에 420 개 절차를했고 나를 위해 잘 작동합니다. 이 프로젝트에 지난 3 년 동안 I 작동합니다.

    그래서 트랜잭션 만 절차를 사용합니다.

  22. ==============================

    22.아니 당신의 DBA의 외모는 데이터베이스 인프라 스트럭처 후이되어 자신의 전문 지식, 코드에서 SQL 때우는 것은 그들과 그들의 전문 지식의 문을 고정되어 있었다, 그것은 아마, 분명 나쁜 예입니다 아니지만 내가 만들려고했던 점은 분명하다 생각합니다.

    아니 당신의 DBA의 외모는 데이터베이스 인프라 스트럭처 후이되어 자신의 전문 지식, 코드에서 SQL 때우는 것은 그들과 그들의 전문 지식의 문을 고정되어 있었다, 그것은 아마, 분명 나쁜 예입니다 아니지만 내가 만들려고했던 점은 분명하다 생각합니다.

  23. from https://stackoverflow.com/questions/22907/which-is-better-ad-hoc-queries-or-stored-procedures by cc-by-sa and MIT license