복붙노트

[SQL] SQL 데이터베이스의 기본 키와 같은 문자열

SQL

SQL 데이터베이스의 기본 키와 같은 문자열

나는 데이터베이스와 작동 방식 뒤에 이론에 익숙하지 않다. 그것은 정수보다 기본 키에 대한 문자열을 사용하는 (삽입 / 업데이트가 / 쿼리) 성능의 관점에서 어떤 느린가요?

해결법

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

    1.문자열 기본 키를 할 의미가있는 경우 기술적 예,하지만 당신은 아마 그것을 사용해야합니다. 이 모두가 당신이 그것을하고있는 테이블의 크기와 기본 키가 될 것입니다 문자열의 길이에 따라 달라집니다 (긴 문자열 비교하려면 더 열심히 ==). 나는 반드시 수백만 개의 행이있는 테이블의 문자열을 사용하지 않을,하지만 당신은 작은 테이블에 문자열을 사용하여 얻을 것이다 성능 저하의 양의 정수 아무튼 그렇게함으로써 당신이 할 수있는 두통 소문자 될 것입니다 데이터 관련 't 평균 아무것도.

    문자열 기본 키를 할 의미가있는 경우 기술적 예,하지만 당신은 아마 그것을 사용해야합니다. 이 모두가 당신이 그것을하고있는 테이블의 크기와 기본 키가 될 것입니다 문자열의 길이에 따라 달라집니다 (긴 문자열 비교하려면 더 열심히 ==). 나는 반드시 수백만 개의 행이있는 테이블의 문자열을 사용하지 않을,하지만 당신은 작은 테이블에 문자열을 사용하여 얻을 것이다 성능 저하의 양의 정수 아무튼 그렇게함으로써 당신이 할 수있는 두통 소문자 될 것입니다 데이터 관련 't 평균 아무것도.

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

    2.기본 키로 문자열을 사용하여 또 다른 문제는 지수가 지속적으로 순차적으로 투입되기 때문에 당신이 자동차를 사용하는 경우, 새 키가 생성 될 때 그 ... resequenced하는 인덱스가이 순서의 중간에있을 것입니다 수의 정수는, 새로운 키는 인덱스의 끝에 추가됩니다.

    기본 키로 문자열을 사용하여 또 다른 문제는 지수가 지속적으로 순차적으로 투입되기 때문에 당신이 자동차를 사용하는 경우, 새 키가 생성 될 때 그 ... resequenced하는 인덱스가이 순서의 중간에있을 것입니다 수의 정수는, 새로운 키는 인덱스의 끝에 추가됩니다.

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

    3.삽입 서열의 중간에서 발생하는 클러스터 된 인덱스를 갖는 테이블에 삽입 인덱스를 다시 작성 일으키지 않는다. 그것은 데이터를 포함하는 페이지를 다시 쓸 수 발생하지 않습니다. 행이 갈 것입니다 페이지에 공간이있는 경우는, 해당 페이지에 배치됩니다. 단일 페이지는 페이지의 오른쪽 장소에 행을 배치하는 포맷됩니다. 페이지가 가득 차면, 페이지 분할은 페이지를 한 페이지로 이동하고, 절반은 다른 한편으로가는 행의 절반, 발생합니다. 페이지는 다음 클러스터 된 인덱스가있는 테이블의 데이터를 포함하는 페이지의 링크 된 목록에 다시 연결된다. 대부분, 당신은 데이터베이스의 2 페이지를 작성 종료됩니다.

    삽입 서열의 중간에서 발생하는 클러스터 된 인덱스를 갖는 테이블에 삽입 인덱스를 다시 작성 일으키지 않는다. 그것은 데이터를 포함하는 페이지를 다시 쓸 수 발생하지 않습니다. 행이 갈 것입니다 페이지에 공간이있는 경우는, 해당 페이지에 배치됩니다. 단일 페이지는 페이지의 오른쪽 장소에 행을 배치하는 포맷됩니다. 페이지가 가득 차면, 페이지 분할은 페이지를 한 페이지로 이동하고, 절반은 다른 한편으로가는 행의 절반, 발생합니다. 페이지는 다음 클러스터 된 인덱스가있는 테이블의 데이터를 포함하는 페이지의 링크 된 목록에 다시 연결된다. 대부분, 당신은 데이터베이스의 2 페이지를 작성 종료됩니다.

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

    4.문자열은 조인에서 느리게하고 실제 생활에서 그들은 매우 드물게 (그들이 있어야 할 경우에도) 정말 독특한 없습니다. 유일한 장점은 이름 만 얻을 수있는 기본 테이블에 합류하는 경우 조인의가 수를 줄일 수 있다는 것입니다. 그러나 문자열은 종종 따라서 회사 이름을 변경하거나 사람이 결혼을 할 때 모든 관련 기록을 수정해야하는 문제를 만드는 변경 될 수 있습니다. 이것은 엄청난 성능 저하 될 수 있으며, 어떻게 든 관련되어 있어야 모든 테이블 (이 더 자주 당신이 생각하는 것보다 일)과 관련이없는 경우에, 당신은뿐만 아니라 데이터 불일치가있을 수 있습니다. 레코드의 인생을 변경하지 않습니다 정수는 데이터 무결성의 관점에서뿐만 아니라 성능의 관점에서 훨씬 안전한 선택입니다. 자연 키는 일반적으로 데이터의 유지 보수를 위해 그렇게 잘되지 않습니다.

    문자열은 조인에서 느리게하고 실제 생활에서 그들은 매우 드물게 (그들이 있어야 할 경우에도) 정말 독특한 없습니다. 유일한 장점은 이름 만 얻을 수있는 기본 테이블에 합류하는 경우 조인의가 수를 줄일 수 있다는 것입니다. 그러나 문자열은 종종 따라서 회사 이름을 변경하거나 사람이 결혼을 할 때 모든 관련 기록을 수정해야하는 문제를 만드는 변경 될 수 있습니다. 이것은 엄청난 성능 저하 될 수 있으며, 어떻게 든 관련되어 있어야 모든 테이블 (이 더 자주 당신이 생각하는 것보다 일)과 관련이없는 경우에, 당신은뿐만 아니라 데이터 불일치가있을 수 있습니다. 레코드의 인생을 변경하지 않습니다 정수는 데이터 무결성의 관점에서뿐만 아니라 성능의 관점에서 훨씬 안전한 선택입니다. 자연 키는 일반적으로 데이터의 유지 보수를 위해 그렇게 잘되지 않습니다.

    또한 두 세계의 최고는 PK로 (또는 전문의 경우, GUID)를 autoincrementing 키를 사용하고 자연 키에 고유 인덱스를 넣어 종종 지적하고 싶다. t GET 중복 레코드를하고, 회사 이름을 변경하기 때문에 당신은 만 개 자식 레코드를 업데이트 할 필요가 없습니다, 당신은 빨리 가입 얻을, 당신은 돈.

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

    5.당신이 너무 오래가 UNIQUE 같이 기본 키로 사용 중요하지 않습니다. 당신이 속도 또는 좋은 데이터베이스 디자인에 대한 관심이 경우 복제 데이터에 다음 GUID를 사용할 계획이 아니라면 INT를 사용합니다.

    당신이 너무 오래가 UNIQUE 같이 기본 키로 사용 중요하지 않습니다. 당신이 속도 또는 좋은 데이터베이스 디자인에 대한 관심이 경우 복제 데이터에 다음 GUID를 사용할 계획이 아니라면 INT를 사용합니다.

    이 액세스 데이터베이스 또는 다음 몇 가지 작은 응용 프로그램 정말 걱정이됩니다. 나는 프로젝트가 우리에게 성장의 방법을 가지고 있기 때문에 우리 대부분은 개발자가 이전 INT를 때리고 또는 전면에 GUID를 이유가 생각, 당신은 자신에게 성장할 수있는 옵션을 떠나고 싶어.

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

    6.너무 많은 변수. 그것은 테이블, 인덱스, 문자열 키 도메인의 자연의 크기에 따라 달라집니다 ...

    너무 많은 변수. 그것은 테이블, 인덱스, 문자열 키 도메인의 자연의 크기에 따라 달라집니다 ...

    일반적으로, 정수는 빨라집니다. 그러나 차이가 큰만큼 걱정하는 것? 그것은 말하기 어렵다.

    또한, 문자열을 선택하는 당신의 동기는 무엇인가? 숫자 자동 증가 키는 너무 쉽게도 종종 있습니다. 그것은 의미인가? 편의? 복제 / 분리 문제? 당신의 대답은 여기에 귀하의 옵션을 제한 할 수 있습니다. GUID를 : 이것은 또한 세 번째 "하이브리드"옵션을 당신에게있는 거 잊고 떠오른다.

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

    7.이 데이터는 데이터의 사용 목적을 잘 설명하고 맞 주제와 일치 간단하고 사운드 디자인을 가지고 때까지 성능에 대해 걱정하지 마십시오. 성능 문제가 등장 할 경우, 당신은 시스템을 조정하여 그들과 거래를 할 수 있습니다.

    이 데이터는 데이터의 사용 목적을 잘 설명하고 맞 주제와 일치 간단하고 사운드 디자인을 가지고 때까지 성능에 대해 걱정하지 마십시오. 성능 문제가 등장 할 경우, 당신은 시스템을 조정하여 그들과 거래를 할 수 있습니다.

    이 경우, 자연의 기본 키로 문자열로 가서 거의 항상 더 나은 당신이 그것을 믿을 수 제공합니다. 그것은 한 문자열이 짧은 합리적이기 때문에, 문자열이라면 걱정하지 마세요, 약 25 문자 최대를 말한다. 당신은 성능면에서 큰 가격을 지불하지 않습니다.

    데이터 입력 사람이나 자동 데이터 소스가 항상되어 자연 키의 값을 제공 마십시오, 또는 때때로 생략? 그것은 입력 데이터에서 가끔 잘못인가? 그렇다면, 어떻게 오류 검출 및 정정입니까?

    그들이 원하는 것을 얻을 수있는 자연 키를 사용할 수 쿼리를 지정하는 프로그래머와 상호 작용하는 사용자가 있습니까?

    당신은 자연의 키를 신뢰할 수없는 경우, 대리를 발명. 당신이 대리를 발명하는 경우, 당신은뿐만 아니라 정수를 발명 있습니다. 그런 다음 사용자 커뮤니티에서 서로 게이트를 은폐하는 whther에 대해 걱정할 필요가. 서로 게이트 키를 은폐하지 않은 일부 개발자들은 그것을 후회했다.

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

    8.지수는 비교를 많이 의미한다.

    지수는 비교를 많이 의미한다.

    일반적으로, 문자열은 더 이상 정수보다 및 정렬 규칙이 너무 문자열을 비교하는 정수를 비교하는 것보다 집중적 인 작업이 더 계산 일반적으로, 비교를 위해 적용 할 수있다.

    때때로, 그러나, 그것은 여분의 수치 ID 테이블에 문자열로 참여하게하는 것보다 기본 키로 문자열을 사용하는 것이 더 빠릅니다.

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

    9.당신은 수백만 개의 행을 기대하지 않는 네,하지만, 그것은 느린 때문에 문자열 기반의 키를 사용하지 않는 것은 일반적으로 "조기 최적화"입니다. 숫자 키는 일반적으로 작은 숫자로 저장하는 동안 결국, 문자열은 큰 숫자로 저장됩니다.

    당신은 수백만 개의 행을 기대하지 않는 네,하지만, 그것은 느린 때문에 문자열 기반의 키를 사용하지 않는 것은 일반적으로 "조기 최적화"입니다. 숫자 키는 일반적으로 작은 숫자로 저장하는 동안 결국, 문자열은 큰 숫자로 저장됩니다.

    당신은 어떤 키에 인덱스를 클러스터하고 인덱스의 비 순차적 삽입 많은 일을하는 경우, 조심하는 것은, 비록입니다. 기록 된 모든 행은 다시 쓰기에 대한 인덱스의 원인이됩니다. 일괄 삽입을하고 있다면,이 정말 과정을 느리게 할 수 있습니다.

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

    10.PK 컬럼에 대한 정수를 사용하는 두 가지 이유 :

    PK 컬럼에 대한 정수를 사용하는 두 가지 이유 :

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

    11.기본 키로 문자열을 가지고하는 이유는 무엇입니까?

    기본 키로 문자열을 가지고하는 이유는 무엇입니까?

    난 그냥 자동 증가 정수 필드 기본 키를 설정하고, 문자열 필드에 인덱스를 넣어 것입니다.

    그런 식으로 당신은 그들이 상대적으로 빠른해야 테이블에 검색을 수행하고, 조인 및 정상적인 모습 올린다는 자신의 속도에 영향을받지 않습니다 당신의 모든합니다.

    또한 색인을 가져옵니다 문자열 필드의 양을 제어 할 수 있습니다. 당신이 충분히 될 것이라고 생각하는 경우 즉, "오직 인덱스 처음 5 자"를 말할 수 있습니다. 또는 데이터가 상대적으로 유사 할 수 있다면, 인덱스 전체 필드를 할 수 있습니다.

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

    12.성능의 관점에서 - 정수 (PK), PK ---> 기본 키를 사용하여 달성 성능과 비교했을 때 예 문자열 (PK)은 성능이 저하됩니다.

    성능의 관점에서 - 정수 (PK), PK ---> 기본 키를 사용하여 달성 성능과 비교했을 때 예 문자열 (PK)은 성능이 저하됩니다.

    요구 사항의 관점에서 -이 질문의 일부가 아니지만 여전히 내가 언급하고 싶습니다. 우리가 다른 테이블에서 엄청난 데이터를 처리 할 때 우리는 일반적으로 특정 테이블에 설정할 수있는 키의 가능성이 세트를 찾습니다. 이것은이 많은 테이블이며, 주로 각 또는 일부 테이블이 어떤 관계 (외부 키의 개념)를 통해 다른 관련이있을 것이다 주로 때문입니다. 그러므로 우리는 정말 항상 오히려 우리는 그 테이블에 대한 기본 키 3, 4, 5 속성의 조합을 이동, 기본 키 정수를 선택할 수 없습니다. 그리고 그 열쇠는 우리가 다른 테이블과 레코드를 관련 것 외래 키로 사용할 수 있습니다. 이 필요할 때 유용 다른 테이블에서 레코드를 관련 수 있습니다.

    따라서 최적의 사용을 위해 - 우리는 항상이 필요한 경우에만 다시 1 개 또는 2 문자열 속성을 1 또는 2의 정수의 조합을 만들지 만.

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

    13.있는 데이터베이스에 문자열에 관련된 아주 큰 오해가있을 수 있습니다. 대부분의 사람들은 숫자의 데이터베이스 표현은 문자열에 대한보다 더 컴팩트 생각했다. 그들은 DB-S의 숫자가 메모리로 표현되어 있다고 생각합니다. 하지만 그것은 사실이 아니다. 대부분의 경우 숫자 표현은 다른 같은 표현 같은 문자열에 더 가깝습니다.

    있는 데이터베이스에 문자열에 관련된 아주 큰 오해가있을 수 있습니다. 대부분의 사람들은 숫자의 데이터베이스 표현은 문자열에 대한보다 더 컴팩트 생각했다. 그들은 DB-S의 숫자가 메모리로 표현되어 있다고 생각합니다. 하지만 그것은 사실이 아니다. 대부분의 경우 숫자 표현은 다른 같은 표현 같은 문자열에 더 가깝습니다.

    숫자 나 문자열을 사용의 속도는 다음 색인 유형 자체에 더 의존한다.

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

    14.기본 ASPNetUserIds으로 128 문자 문자열은 성능은 괜찮습니다.

    기본 ASPNetUserIds으로 128 문자 문자열은 성능은 괜찮습니다.

    키가 테이블에 고유해야합니다 경우는 키해야합니다. 그 이유는;

    차 문자열 키 = 올바른 DB 관계, 한 문자열 키 (주), 1 문자열 색인 (초등).

    다른 옵션은 일반적인 INT 키이지만, 문자열이 고유해야합니다 경우 당신은 아마 아직도 유효한지 확인할 수 있기 때문에 논스톱 쿼리의 인덱스를 추가하거나 독특한 있는지 확인해야합니다.

    그래서 int로 식별 키를 사용하여 = 잘못된 DB 관계, 1 INT 키 (기본), 1 개 INT 지수 (주), 아마 고유 한 문자열 지수는 수동 어쩌면 SQL 체크와 같은 같은 존재하지 않는 캐릭터 (뭔가를 확인하는 데 ).

    기본 키에 대한 문자열을 통해 int를 사용하여 더 나은 성능을 얻으려면, 문자열은 고유해야 할 때, 그것은 매우 이상한 상황이 될 것이다. 난 항상 문자열 키를 사용하는 것이 바람직했습니다. 당신이해야 할 때까지 그리고 엄지 손가락의 좋은 규칙으로, 데이터베이스를 비정규하지 않습니다.

  15. from https://stackoverflow.com/questions/517579/strings-as-primary-keys-in-sql-database by cc-by-sa and MIT license