복붙노트

[SQL] 테이블의 열 순서 걱정할 어떤 이유가 있나요?

SQL

테이블의 열 순서 걱정할 어떤 이유가 있나요?

나는 당신이 FIRST 및 AFTER와 MySQL의에서 열 순서를 변경할 수 있습니다 알고 있지만, 왜 귀찮게할까요? 데이터를 삽입 할 때 좋은 쿼리가 명시 적으로 열 이름 때문에, 당신의 열이 테이블에 주문하든 상관 할 이유가 정말 있나요?

해결법

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

    1.열 순서는 SQL 서버, 오라클,와 MySQL에 걸쳐, 내가 조정 한 데이터베이스의 일부에 큰 성능 영향을 미쳤다. 이 포스팅은 엄지 손가락의 좋은 규칙이 있습니다 :

    열 순서는 SQL 서버, 오라클,와 MySQL에 걸쳐, 내가 조정 한 데이터베이스의 일부에 큰 성능 영향을 미쳤다. 이 포스팅은 엄지 손가락의 좋은 규칙이 있습니다 :

    성능 차이 일례 인덱스 룩업이다. 데이터베이스 엔진이 인덱스의 일부 조건에 따라 행을 발견하고, 행 주소를 다시 가져옵니다. 이제 someValue와 찾고있는 말, 그리고이 테이블에있다 :

     SomeId int,
     SomeString varchar(100),
     SomeValue int
    

    SomeString 알 수없는 길이를 가지고 있기 때문에 엔진은, 어디 someValue와 시작을 ​​추측 할 수있다. 그러나, 당신이 순서를 변경하는 경우 :

     SomeId int,
     SomeValue int,
     SomeString varchar(100)
    

    이제 엔진은 someValue와 4 바이트 행의 시작 후 발견 될 수 있다는 것을 알고있다. 열 순서는 상당한 성능에 영향을 줄 수 있습니다.

    편집 : 행의 시작는 SQL Server 2005 개를 저장하는 고정 길이 필드. 그리고 각 행은 VARCHAR의 시작에 대한 참조를 가지고있다. 이것은 완전히 내가 위에 열거 한 효과를 부정한다. 그래서 최근의 데이터베이스에 대한 열 순서는 더 이상 영향을주지 않습니다.

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

    2.최신 정보:

    최신 정보:

    MySQL의에서이 작업을 수행 할 이유가있을 수 있습니다.

    (VARCHAR 같은) 변수 데이터 유형이 InnoDB의 가변 길이로 저장되므로, 데이터베이스 엔진은 주어진 하나의 오프셋을 찾아 각 행에 이전의 모든 컬럼을 통과해야한다.

    영향은 20 열 17 %로 큰 수 있습니다.

    자세한 내용에 대한 내 블로그에서이 항목을 참조하십시오 :

    오라클에서 후행 NULL 열은 항상 테이블의 끝에 넣어한다 그 이유는, 어떤 공간을 사용하지 않습니다.

    또한 오라클과 SQL Server의 큰 행의 경우, 행 CHAINING가 발생할 수 있습니다.

    ROW CHANING는 연결리스트로 연결 한 블록에 적합하고 여러 블록에 그것을 걸친하지 않는 행 분할이다.

    첫 번째 블록에 적합하지 않은 후행 열을 읽기 추가 I / O 작동하게됩니다 링크 된 목록을 통과해야합니다.

    오라클에서 행 CHAINING의 그림이 페이지를 참조하십시오 :

    당신이 테이블의 끝, NULL 경향이 자주 테이블의 시작 부분에 사용하는 열 및 열이 자주 사용하지 않는, 또는 열을 두어야하는 이유입니다.

    중요 사항:

    이 답변처럼 당신과 그것을 위해 투표를 원하는 경우, 또한 Andomar의 대답 @ 투표하시기 바랍니다.

    그는 같은 일을 대답하지만, 아무 이유을 downvoted 것으로 보인다.

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

    3.이전 직장에서 오라클 훈련 동안, 우리의 DBA는 널 (NULL) 사람 전에 모든 nullable이 아닌 열을 넣는 것이 유리했다 ... TBH 내가 왜의 세부 사항을 기억하지 않지만 제안했다. 아니면 그것은 마지막에 가야 업데이트받을 가능성이 있었다 단지 사람이었다? (어쩌면 확장하면 행을 이동시킬 필요 떨어져 둔다)

    이전 직장에서 오라클 훈련 동안, 우리의 DBA는 널 (NULL) 사람 전에 모든 nullable이 아닌 열을 넣는 것이 유리했다 ... TBH 내가 왜의 세부 사항을 기억하지 않지만 제안했다. 아니면 그것은 마지막에 가야 업데이트받을 가능성이 있었다 단지 사람이었다? (어쩌면 확장하면 행을 이동시킬 필요 떨어져 둔다)

    일반적으로, 어떤 차이가 안된다. 당신이 말하는 것처럼, 쿼리는 항상 오히려로부터 순서에 의존하지 않고 열이 자신을 지정해야합니다 "를 선택 *". 나는 그들이 당신이 그것을 언급 할 때까지 아니라, 내가 MySQL이 그것을 허용 몰랐다 ... 변경 될 수있는 DB 모르겠어요.

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

    4.일부 잘못 작성된 응용 프로그램을 열 순서 / 인덱스 대신 열 이름에 따라 달라질 수 있습니다. 그들은 안하지만 일이 아닙니다. 이러한 응용 프로그램을 끊을 열의 순서를 변경.

    일부 잘못 작성된 응용 프로그램을 열 순서 / 인덱스 대신 열 이름에 따라 달라질 수 있습니다. 그들은 안하지만 일이 아닙니다. 이러한 응용 프로그램을 끊을 열의 순서를 변경.

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

    5.아니, SQL 데이터베이스 테이블의 열 순서는 완전히 무관하다 - 디스플레이 / 인쇄 목적을 제외하고. 도 (이전 테이블을 삭제하고 새로운 열 순서와 함께 다시 제외) 그렇게 할 수있는 방법을 제공하지 않는 대부분의 시스템 - 열을 재정렬 의미가 없다.

    아니, SQL 데이터베이스 테이블의 열 순서는 완전히 무관하다 - 디스플레이 / 인쇄 목적을 제외하고. 도 (이전 테이블을 삭제하고 새로운 열 순서와 함께 다시 제외) 그렇게 할 수있는 방법을 제공하지 않는 대부분의 시스템 - 열을 재정렬 의미가 없다.

    즙을 짜고 난 찌꺼기

    편집 : 관계형 데이터베이스에 대한 위키 백과의 항목에서, 여기에 관련된 부분입니다있는 열 순서가 우려 결코 것을 명확하게 보여줍니다 나에게 :

    릴레이션은 N 튜플들의 집합으로 정의된다. 일부의 DBMS는 데이터에 순서를 부과하지만 모두 수학 및 관계형 데이터베이스 모델에서 세트는 항목의 정렬되지 않은 모음입니다. 수학에서, 튜플은 순서를 가지고 있으며, 중복을 허용합니다. E.F. 커드는 원래이 수학적 정의를 사용하여 튜플을 정의했다. 나중에, 그것은 관계를 기반으로 컴퓨터 언어의 순서 대신 속성 이름을 사용하는 것이 훨씬 더 편리 (일반적으로) 될 것이라고 E.F. 커드의 위대한 통찰력 중 하나였다. 이 통찰력은 오늘날 사용되고 있습니다.

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

    6.출력의 가독성을 입력해야 :

    출력의 가독성을 입력해야 :

    select * from <table>
    

    데이터베이스 관리 소프트웨어?

    그것은 매우 가짜 이유,하지만 그 순간에 나는 아무것도 생각할 수 없다.

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

    7.내가 대해 생각할 수있는 유일한 이유는 디버깅 및 소방을위한 것입니다. 우리는 그리스트에 10에 대한 "이름"열의가 나타납니다 테이블이있다. 당신이 ID 다음 (1,2,3)에서 당신이 이름을보고를 통해 스크롤해야 할 테이블에서 빠른 선택 *을 할 때 고통입니다.

    내가 대해 생각할 수있는 유일한 이유는 디버깅 및 소방을위한 것입니다. 우리는 그리스트에 10에 대한 "이름"열의가 나타납니다 테이블이있다. 당신이 ID 다음 (1,2,3)에서 당신이 이름을보고를 통해 스크롤해야 할 테이블에서 빠른 선택 *을 할 때 고통입니다.

    그러나 그것에 대해입니다.

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

    8.자주의 경우와 마찬가지로, 가장 큰 요인은 시스템에서 일해야 다음 사람입니다. 나는 시스템에 중요성 / 중요성의 내림차순으로 다음 나머지 열을 두 번째, 먼저 기본 키 열을 가지고 외래 키 열을 시도합니다.

    자주의 경우와 마찬가지로, 가장 큰 요인은 시스템에서 일해야 다음 사람입니다. 나는 시스템에 중요성 / 중요성의 내림차순으로 다음 나머지 열을 두 번째, 먼저 기본 키 열을 가지고 외래 키 열을 시도합니다.

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

    9.당신은 UNION을 많이 사용하는 것으로려고하는 경우에, 당신이 자신의 주문에 대한 규칙이있는 경우 쉽게 열을 일치합니다.

    당신은 UNION을 많이 사용하는 것으로려고하는 경우에, 당신이 자신의 주문에 대한 규칙이있는 경우 쉽게 열을 일치합니다.

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

    10.언급 한 바와 같이, 다수의 잠재적 인 성능 문제가 있습니다. 난 한때 당신이 당신의 쿼리에서 그 열을 참조하지 않은 경우 마지막에 넣어 매우 큰 열 성능이 향상된 데이터베이스에서 일했다. 레코드가 여러 디스크 블록을 스팬 분명히 경우, 데이터베이스 엔진은 그것이 필요한 모든 열을 가지고 일단 블록 읽기를 중단 할 수있다.

    언급 한 바와 같이, 다수의 잠재적 인 성능 문제가 있습니다. 난 한때 당신이 당신의 쿼리에서 그 열을 참조하지 않은 경우 마지막에 넣어 매우 큰 열 성능이 향상된 데이터베이스에서 일했다. 레코드가 여러 디스크 블록을 스팬 분명히 경우, 데이터베이스 엔진은 그것이 필요한 모든 열을 가지고 일단 블록 읽기를 중단 할 수있다.

    물론 어떤 성능에 영향은뿐만 아니라 잠재적 버전에 사용하고 있는지 제조업체에뿐만 아니라 매우 의존한다. 몇 달 전 우리의 포스트 그레스는 "같은"비교를 위해 인덱스를 사용할 수없는 것으로 나타났습니다 전. 당신은 " 'M의 %'와 같은 somecolumn"를 쓴 경우는 처음 N. 나는 "사이의"사용 쿼리의 무리를 변경할 계획이었다 발견했을 때 즉, 그것은 M의를 생략하고 종료하는 스마트 충분하지 않았다. 그런 다음 우리는 포스트 그레스의 새 버전을 가지고 있으며 지능적의처럼 취급했다. 다행 나는 쿼리를 변경 주위에 없었어. 분명히 바로 여기에 해당하지만, 내 말이되지 효율 고려 사항 당신이 그 아무것도 다음 버전으로 쓸모가 될 수있다.

    내가 일상적으로 화면을 만들 수있는 데이터베이스 스키마를 읽는 일반적인 코드를 작성하기 때문에 열 순서는 거의 항상 나에게 매우 관련이있다. 마찬가지로, 내 "편집 기록"화면은 거의 항상 필드 목록을 얻을 수있는 스키마를 읽고, 다음 순서로 표시하여 내장되어 있습니다. 내가 열 순서를 변경 한 경우, 내 프로그램은 여전히 ​​작동,하지만 디스플레이는 사용자에게 이상한 일 수 있습니다. 마찬가지로, 당신은 이름 / 주소 / 도시 / 주 / 우편 번호가 아닌 도시 / 주소 / 우편 번호 / 이름 / 상태를 볼 것으로 예상. 물론, 나는 우리가 추가 또는 우리가 업데이 트를 제어 파일을 이동하는 것을 기억해야 할 것이다 열을 제거 할 때마다 코드 또는 제어 파일이나 뭔가의 열 표시 순서를 넣어,하지만 수 있습니다. 나는 한 번 말을 좋아합니다. 또한, 편집 화면이 새 테이블이 방법 멋진이다, 그것을 편집 화면을 생성하는 코드의 제로 라인을 작성하는 의미 추가 스키마에서 순수하게 작성 될 때. (음, 좋아, 그것이 실용적 너무 많은 예외가 있기 때문에 "업데이트 할 레코드를 선택"실제로 보통 나는 일반 편집 프로그램을 호출하기 위해 메뉴에 항목을 추가해야하고, 나는 일반적으로 일반에 포기했습니다 .)

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

    11.명백한 성능 튜닝을 넘어, 난 그냥 재정렬 열은 (이전에 기능) SQL 스크립트 실패의 원인이 코너 케이스에 달렸다.

    명백한 성능 튜닝을 넘어, 난 그냥 재정렬 열은 (이전에 기능) SQL 스크립트 실패의 원인이 코너 케이스에 달렸다.

    문서에서 "그들은 명시 적으로 지정되지 않는 한 TIMESTAMP와 DATETIME 컬럼이 예외와 함께, 자동적 인 특성이 없습니다 : 어느 쪽도 명시 적으로 지정되지 않은 경우 기본적으로 첫번째 TIMESTAMP 컬럼은 DEFAULT의 CURRENT_TIMESTAMP 및 ON UPDATE CURRENT_TIMESTAMP 모두가"HTTPS : //dev.mysql를 .COM / 문서 / 그러면, refman / 5.6 / EN / 타임 스탬프 initialization.html

    그래서 명령 ALTER 표 TABLE_NAME MODIFY의 FIELD_NAME 타임 스탬프 (6) NOT NULL; 해당 필드는 테이블의 첫 번째 타임 스탬프 (또는 날짜)이 아니지만, 그렇지 않은 경우 작동합니다.

    물론, 당신은 기본값하지만 열 재정렬로 인해 작동이 중지 일했다 쿼리 내 머리의 상처를 만들었다는 사실을 포함하는 ALTER 명령을 수정할 수 있습니다.

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

    12.소프트웨어가 특정 순서에 의존하는 경우 열 순서에 대해 걱정해야하는 유일한 시간이다. 일반적으로이 때문에 개발자가 게으른 얻었고 선택 *을 한 다음 인덱스로하기보다는 결과의 이름으로 컬럼에 언급 된 사실이다.

    소프트웨어가 특정 순서에 의존하는 경우 열 순서에 대해 걱정해야하는 유일한 시간이다. 일반적으로이 때문에 개발자가 게으른 얻었고 선택 *을 한 다음 인덱스로하기보다는 결과의 이름으로 컬럼에 언급 된 사실이다.

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

    13.일반적으로 당신이 관리 Studio를 통해 열 순서를 변경하면 SQL 서버에서 일어나는, 그것은, 새로운 구조의 임시 테이블을 생성 이전 테이블에서 해당 구조로 데이터를 이동, 이전 테이블을 삭제하고 새 이름을 변경한다는 것입니다. 당신이 상상할 수 있듯이 당신이 큰 테이블이있는 경우,이 성능을 위해 매우 가난한 선택입니다. 내 SQL이 같은 않는 경우는 모르겠지만, 그것은 우리의 많은 열을 재정렬 피할 이유 중 하나입니다. 선택 *이 생산 시스템에 사용해서는 안됩니다 때문에, 마지막에 열을 추가하는 것은 잘 설계된 시스템 aproblem 없습니다. 열 기계가 테이블의 순서에 genral 엉망이되어서는 안된다.

    일반적으로 당신이 관리 Studio를 통해 열 순서를 변경하면 SQL 서버에서 일어나는, 그것은, 새로운 구조의 임시 테이블을 생성 이전 테이블에서 해당 구조로 데이터를 이동, 이전 테이블을 삭제하고 새 이름을 변경한다는 것입니다. 당신이 상상할 수 있듯이 당신이 큰 테이블이있는 경우,이 성능을 위해 매우 가난한 선택입니다. 내 SQL이 같은 않는 경우는 모르겠지만, 그것은 우리의 많은 열을 재정렬 피할 이유 중 하나입니다. 선택 *이 생산 시스템에 사용해서는 안됩니다 때문에, 마지막에 열을 추가하는 것은 잘 설계된 시스템 aproblem 없습니다. 열 기계가 테이블의 순서에 genral 엉망이되어서는 안된다.

  14. from https://stackoverflow.com/questions/894522/is-there-any-reason-to-worry-about-the-column-order-in-a-table by cc-by-sa and MIT license