복붙노트

[SQL] SQL 서버에서 외부 키를 사용하는 히트 심각한 성능이 있습니까?

SQL

SQL 서버에서 외부 키를 사용하는 히트 심각한 성능이 있습니까?

지금까지 운없이 - 나는 우리가 우리의 데이터베이스에 외래 키를 사용시키는에 내 상사를 설득하기 위해 최선을 노력하고있어.

그는 성능의 상당한 양의 비용을 주장, 우리는 단지 잘못된 참조 이제 다음 정리에 작업을해야했다.

분명히 이것은 실제로는 작동하지 않으며, 데이터베이스가 유효하지 않은 참조와 홍수입니다.

외래 키를 사용하여 의미있는 성능 저하가 없습니다 증명 사람의 비교 벤치 마크의 노하우 또는 유사한합니까? (어떤 I 희망 그를 설득)

해결법

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

    1.FK를 확인하기 때문에 삽입, 업데이트 및 삭제에 작은 성능 저하가 있습니다. 당신이 테이블에 관련된 FKS의 말도 안되는 숫자를 가지고 시작하지 않으면 눈에 띄지로 (분명히이 2보다 100 개 다른 테이블을 확인하는 데 시간이 더 소요)로 개인 기록을 위해이 일반적으로 너무 가벼운 것입니다. 이것은 좋은 일이되지 무결성없이 데이터베이스와 같은 나쁜 일이 신뢰할 수없는 때문에 쓸모가있다. 당신은 속도에 대한 무결성을 거래해서는 안된다. 즉, 성능 저하는 일반적으로 최적화 실행 계획에 더 나은 능력에 의해 상쇄된다.

    FK를 확인하기 때문에 삽입, 업데이트 및 삭제에 작은 성능 저하가 있습니다. 당신이 테이블에 관련된 FKS의 말도 안되는 숫자를 가지고 시작하지 않으면 눈에 띄지로 (분명히이 2보다 100 개 다른 테이블을 확인하는 데 시간이 더 소요)로 개인 기록을 위해이 일반적으로 너무 가벼운 것입니다. 이것은 좋은 일이되지 무결성없이 데이터베이스와 같은 나쁜 일이 신뢰할 수없는 때문에 쓸모가있다. 당신은 속도에 대한 무결성을 거래해서는 안된다. 즉, 성능 저하는 일반적으로 최적화 실행 계획에 더 나은 능력에 의해 상쇄된다.

    우리는 그들이하고 거의 100 개 이상의 외국 키가 하나 개 심하게 디자인 된 테이블을 제외하고 성능 저하 (알 안 어디에서나 만 9 주위 기록과 FKS와 중간 크기의 데이터베이스를 가지고, 그것은 조금 모든 등이에서 삭제 기록에 느린 ) 확인해야합니다. 거의 내가 큰 다루는 사람을 알고 모든 DBA는 테라 바이트는 데이터베이스 크기와 무결성은 데이터베이스의 핵심이기 때문에 대용량 데이터 세트에 높은 성능을위한 진정한 필요가 외래 키 제약 조건을 주장한다. 테라 바이트 크기의 데이터베이스와 사람들이 아주 작은 성능 저하를 감당할 수 있다면, 그렇게 할 수 있습니다.

    FKS는 자동으로 인덱싱되지 않습니다 그들이 인덱싱되지 않은 경우,이 성능 문제가 발생할 수 있습니다.

    솔직히, 나는 데이터베이스의 복사본을 제대로 인덱스 FKS을 추가, 삽입, 삭제, 업데이트 및 FKS없이 데이터베이스에서 같은과을 비교 한에 해당 테이블에서 선택 시간 차이를 보여 것입니다. 당신이 성능 저하의 원인이되지 않는다는 것을 보여줍니다. 그런 다음 더 이상 관련이 없습니다있는 PK가 존재하기 때문에 더 이상 의미가있는 기록을 고아 보여 쿼리의 결과를 보여줍니다. 그것은 금융 정보를 포함하는 테이블이 보여 특히 효과적이다 (관리 앉아서 통지를 취할 것 "우리는 고객과 연결할 수없는 2,700 주문을").

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

    2.마이크로 소프트 패턴 및 관행 : 제 14 장 SQL 서버 성능 향상 :

    마이크로 소프트 패턴 및 관행 : 제 14 장 SQL 서버 성능 향상 :

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

    3.이 기술보다 정치적 문제의 더 많은 것이다. 프로젝트 관리는 데이터의 무결성을 유지하는 값이 표시되지 않는 경우, 다른 프로젝트에 있어야합니다.

    이 기술보다 정치적 문제의 더 많은 것이다. 프로젝트 관리는 데이터의 무결성을 유지하는 값이 표시되지 않는 경우, 다른 프로젝트에 있어야합니다.

    당신의 상사는 이미 유효하지 않은 참조 수천 알고 또는 치료하지 않는 경우에, 그는 당신이 그것에 대해 말해해서 돌보는 시작하려고하지 않습니다. 나는 좋은 싸움을 싸우고하여 "옳은 일을"할을 촉구하려고 여기에 다른 포스터 동정,하지만 난 이전과는 작동하지 않습니다 실제 상황에서 여러 번 시도했습니다. 다윗과 골리앗의 이야기는 좋은 독서를 만들지 만, 현실에서 그것은지는 제안입니다.

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

    4.난 당신이 잘못된 방향으로 이것에 대해려고 생각합니다. 벤치 마크는 누군가를 설득하지 않았다.

    난 당신이 잘못된 방향으로 이것에 대해려고 생각합니다. 벤치 마크는 누군가를 설득하지 않았다.

    당신이해야 할 무엇, 외래 키 제약 조건을 사용하지 않는 결과 문제 발견 처음이다. "잘못된 참조를 정리"하는 비용이 얼마나 많은 일을 정량화하려고합니다. 또한, 시도 및 게이지 얼마나 많은 오류가 있기 때문에 이러한 오류의 비즈니스 프로세스에서 발생합니다. 더 나은 - 당신은에 금액을 첨부 할 수 있습니다.

    이제 벤치 마크 - 당신은 시도해야하고 작업 부하에 대한 통찰력을 얻을 수, 작업의 종류가 가장 자주 수행하는 식별합니다. 그런 다음 테스트 환경을 설정하고 장소에 외래 키와 그 작업을 재생. 그런 다음 비교합니다.

    개인적으로 나는 바로 외래 키 비용 성능을하지 않는 데이터베이스에서 실행중인 응용 프로그램에 대한 지식이없는 주장 할 것이다. 당신이 복합 천연 기본 키와 조합 삭제 및 / 또는 업데이트를 계단식이 특히 있다면, 나는 개인적으로 성능 문제의 일부 두려움, 특히 아웃 시간 초과 또는 인해 계단식 작업의 부작용에 교착 거래를 할 것입니다.

    그러나 아무도 당신이 당신의 데이터, 작업 부하, 동시 사용자의 전화 번호, 하드웨어, 응용 프로그램과 함께, 자신을 테스트해야 당신이 - 말할 수 없다.

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

    5.성능에 대해 우려 할 OK이지만, 편집증 의사 결정을하는 것은 아니다.

    성능에 대해 우려 할 OK이지만, 편집증 의사 결정을하는 것은 아니다.

    당신은 결과를 직접 보여 쉽게 쓰기 벤치 마크 코드를 할 수 있지만, 먼저 당신은 당신의 상사가 정확히 그 측정 기준에 대해 상세히 관한 한 어떤 성능을 알아해야합니다.

    당신이 당신의 외래 키에 널 (null)을 허용하지 않는 경우 지금까지 잘못된 참조에 관한 아칸소로, 당신은 유효하지 않은 참조를받지 않습니다. 존재하지 않는 잘못된 외래 키를 할당하려고하면 데이터베이스는 esception됩니다. 당신은 "널 (null)"는 "미등록"이 될 수있는 키를 할당하거나 같은, 기본 키 있는지 확인 필요합니다.

    난 당신이 신속하게이 문제가 그 어느 것 외래 키 성능보다 문제가 될 것이라는 점을 것을을 발견 할 것이다 생각하기 때문에 마지막으로, 당신의 상사에 데이터베이스 정규화 문제를 설명합니다.

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

    6.외국 키가 반대하는 경우가 자주 사용 작고의 경우, 성능에 미치는 영향은 무시할 크고 사용 빈도가 낮은 인덱스가 더 영향을 미칠 수 있지만 - 비용에서 중요한 요소는 외래 키 참조 인덱스의 크기가 될 것입니다 클러스터 된 인덱스는 여전히 큰 히트하지 않아야하지만, @Ronald 보우만 바로 - 당신은 확인하기 위해 테스트해야합니다.

    외국 키가 반대하는 경우가 자주 사용 작고의 경우, 성능에 미치는 영향은 무시할 크고 사용 빈도가 낮은 인덱스가 더 영향을 미칠 수 있지만 - 비용에서 중요한 요소는 외래 키 참조 인덱스의 크기가 될 것입니다 클러스터 된 인덱스는 여전히 큰 히트하지 않아야하지만, @Ronald 보우만 바로 - 당신은 확인하기 위해 테스트해야합니다.

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

    7.나는이 십년 게시물입니다 것을 알고있다. 그러나 데이터베이스 프리미티브 수요에 항상 있습니다. 나는 내 자신의 경험을 참조한다. 내가 근무하는 프로젝트 중 하나에서 통신 스위치 데이터베이스를 처리 할 수있다. 그들이만큼 빨리 그들이 할 수 삽입하고 싶었 기 때문에 그들은 더 FKS와 데이터베이스를 개발 한 이유였다. 싸이 시스템을 때문에 자기는 전화로, 그것은 어떤 의미를 처리해야합니다. 전에 어떤 집중적 인 쿼리에 대한 필요가 없었고 어떤 보고서를 원한다면, 당신은 스위치의 GUI 소프트웨어를 사용할 수 있습니다. 몇 시간 후에는 몇 가지 기본적인 보고서를 가질 수있다. 내가이 참여했다 그러나 그들은 개발하고 싶었 AI 따라서 스마트 보고서를 작성하고 자동 문제 해결 같은 것을 가질 수있을 수 있습니다. 그것은 기록의 수백만, 당신이 어떤 긴 쿼리와 SQL 서버 시간 제한에 직면 여러 번 실행할 수 없습니다 가진 완전히 악몽이었다. 심지어 엔티티 프레임 워크를 사용하여 생각하지 않습니다. 이 대신 설명 같은 상황에 직면 할 때 큰 차이입니다. 내 조언은 당신이 당신의 디자인과 FKS를 사용하지 않는 이유에 아주 좋은 이유를 가진 매우 구체적으로해야한다는 것입니다.

    나는이 십년 게시물입니다 것을 알고있다. 그러나 데이터베이스 프리미티브 수요에 항상 있습니다. 나는 내 자신의 경험을 참조한다. 내가 근무하는 프로젝트 중 하나에서 통신 스위치 데이터베이스를 처리 할 수있다. 그들이만큼 빨리 그들이 할 수 삽입하고 싶었 기 때문에 그들은 더 FKS와 데이터베이스를 개발 한 이유였다. 싸이 시스템을 때문에 자기는 전화로, 그것은 어떤 의미를 처리해야합니다. 전에 어떤 집중적 인 쿼리에 대한 필요가 없었고 어떤 보고서를 원한다면, 당신은 스위치의 GUI 소프트웨어를 사용할 수 있습니다. 몇 시간 후에는 몇 가지 기본적인 보고서를 가질 수있다. 내가이 참여했다 그러나 그들은 개발하고 싶었 AI 따라서 스마트 보고서를 작성하고 자동 문제 해결 같은 것을 가질 수있을 수 있습니다. 그것은 기록의 수백만, 당신이 어떤 긴 쿼리와 SQL 서버 시간 제한에 직면 여러 번 실행할 수 없습니다 가진 완전히 악몽이었다. 심지어 엔티티 프레임 워크를 사용하여 생각하지 않습니다. 이 대신 설명 같은 상황에 직면 할 때 큰 차이입니다. 내 조언은 당신이 당신의 디자인과 FKS를 사용하지 않는 이유에 아주 좋은 이유를 가진 매우 구체적으로해야한다는 것입니다.

  8. from https://stackoverflow.com/questions/2317391/is-there-a-severe-performance-hit-for-using-foreign-keys-in-sql-server by cc-by-sa and MIT license