복붙노트

[SQL] 왜 SELECT는 유해한 것으로 간주 *입니까?

SQL

왜 SELECT는 유해한 것으로 간주 *입니까?

왜 SELECT 나쁜 연습 *입니까? 당신은 당신이 원하는 새 열을 추가 한 경우는 변화에 적은 코드를 의미하지 않을까요?

나는 선택 COUNT (*)는 성능 문제는 일부 데시벨에 이해하지만 당신은 정말 모든 열은 무엇을 원한다면?

해결법

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

    1.정말 세 가지 주요 이유가 있습니다 :

    정말 세 가지 주요 이유가 있습니다 :

    그러나 SELECT의 *에 대한 모든 나쁘지 않다. 나는이 사용 사례에 대해 자유롭게 사용 :

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

    2.SELECT 문에 별표 문자 "*"는 질의에 포함 된 테이블 (들)의 모든 열에 대한 속기입니다.

    SELECT 문에 별표 문자 "*"는 질의에 포함 된 테이블 (들)의 모든 열에 대한 속기입니다.

    * 표시 속기이 될 수 느린 이유는

    SELECT *를 사용하는 경우 :

    SELECT *는 안티 패턴 :

    쿼리가 작성 될 때 존재하는 모든 열 반대로 테이블 (들)의 모든 컬럼에 대한 명시 적 필요성 참여가있을 때 SELECT *를 사용하는 것이 허용합니다. 데이터베이스는 내부의 열 목록에 *을 확장합니다 - 어떤 성능 차이가 없습니다.

    바람직 테이블 별칭을 사용하는 동안 - 그렇지 않으면, 명시 적으로 쿼리에서 사용되는 모든 열을 나열합니다.

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

    3.지금 모든 열을 선택하고 싶어해도 사람이 하나 이상의 새 열을 추가 한 후, 당신은 모든 열을 선택하지 않을 수 있습니다. 당신이 어떤 점에서 누군가가 당신이 실제로 열 것을 필요로하지 않더라도 더 느리게 쿼리 실행을하게 텍스트 열을 추가 할 수 있다는 위험을 감수하는 * 당신은 SELECT와 쿼리를 작성하는 경우.

    지금 모든 열을 선택하고 싶어해도 사람이 하나 이상의 새 열을 추가 한 후, 당신은 모든 열을 선택하지 않을 수 있습니다. 당신이 어떤 점에서 누군가가 당신이 실제로 열 것을 필요로하지 않더라도 더 느리게 쿼리 실행을하게 텍스트 열을 추가 할 수 있다는 위험을 감수하는 * 당신은 SELECT와 쿼리를 작성하는 경우.

    기회는 당신이 실제로 새 열을 사용하려면 다음 어쨌든 코드에 꽤 많은 다른 변경을해야 할 것입니다. 당신은 NEW_COLUMN, 저장하고 - 입력의 몇 가지 문자를.

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

    4.당신이 SELECT 문에서 열 이름을 경우, 지정된 순서로 반환되며, 따라서 안전하게 숫자 인덱스에 의해 참조 할 수있다. 당신이 "SELECT *"를 사용하는 경우, 당신은 안전하게 이름으로 열을 사용하여 임의의 순서로 열을 받고 결국하고있다. 당신이 데이터베이스에 추가됩니다 새로운 열의와 함께 할 원하는됩니다 것을 미리 알고하지 않는 한, 가장 가능성이 올바른 행동은 무시하는 것입니다. 당신이 데이터베이스에 추가됩니다 새로운 열을 무시하는 거라면,이를 검색에 아무런 혜택 전혀 없다.

    당신이 SELECT 문에서 열 이름을 경우, 지정된 순서로 반환되며, 따라서 안전하게 숫자 인덱스에 의해 참조 할 수있다. 당신이 "SELECT *"를 사용하는 경우, 당신은 안전하게 이름으로 열을 사용하여 임의의 순서로 열을 받고 결국하고있다. 당신이 데이터베이스에 추가됩니다 새로운 열의와 함께 할 원하는됩니다 것을 미리 알고하지 않는 한, 가장 가능성이 올바른 행동은 무시하는 것입니다. 당신이 데이터베이스에 추가됩니다 새로운 열을 무시하는 거라면,이를 검색에 아무런 혜택 전혀 없다.

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

    5.많은 상황에서, 오히려 디자인 타임에보다 응용 프로그램에서 실행시 오류가 발생할 것 SELECT *. 그것은 열 변경, 또는 응용 프로그램에 나쁜 참조의 지식을 숨 깁니다.

    많은 상황에서, 오히려 디자인 타임에보다 응용 프로그램에서 실행시 오류가 발생할 것 SELECT *. 그것은 열 변경, 또는 응용 프로그램에 나쁜 참조의 지식을 숨 깁니다.

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

    6.당신이 정말로 모든 열을 원하는 경우에, 나는 선택 (*) 및 명명 열 사이의 성능 차이를 보지 못했다. 간단하게 할 수있는 열 가지 이름을 드라이버 코드에서 볼 기대 열에 대한 명시합니다.

    당신이 정말로 모든 열을 원하는 경우에, 나는 선택 (*) 및 명명 열 사이의 성능 차이를 보지 못했다. 간단하게 할 수있는 열 가지 이름을 드라이버 코드에서 볼 기대 열에 대한 명시합니다.

    종종하지만, 당신은 모든 열 및 선택 (*)가 데이터베이스 서버와 네트워크를 통해 전달하는 데 불필요한 정보에 대한 불필요한 작업이 발생할 수 있습니다 싶지 않아요. 시스템이 많이 사용하지 않는 한 그것은 눈에 띄는 문제를 일으킬 확률이 낮다거나 네트워크 연결 속도가 느립니다.

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

    7.응용 프로그램과 데이터베이스 사이의 결합을 감소이라고 생각.

    응용 프로그램과 데이터베이스 사이의 결합을 감소이라고 생각.

    '코드 냄새'측면을 요약하면 : SELECT * 앱 스키마 사이의 동적 종속성을 작성합니다. 그것의 사용을 제한하면 다른 데이터베이스에 변경이 응용 프로그램을 충돌의 더 큰의 가능성을 가지고 더 정의 종속성을 만드는 방법 중 하나입니다.

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

    8.당신이 테이블에 필드를 추가하는 경우,이 자동으로 선택 *을 사용하는 모든 쿼리에 포함됩니다. 이 편리 보일지도 모르지만, 당신이 필요로하는 것보다 더 많은 데이터를 가져 오는대로 그것은 느린 응용 프로그램을 만들 것, 그리고 실제로 어떤 시점에서 응용 프로그램을 충돌합니다.

    당신이 테이블에 필드를 추가하는 경우,이 자동으로 선택 *을 사용하는 모든 쿼리에 포함됩니다. 이 편리 보일지도 모르지만, 당신이 필요로하는 것보다 더 많은 데이터를 가져 오는대로 그것은 느린 응용 프로그램을 만들 것, 그리고 실제로 어떤 시점에서 응용 프로그램을 충돌합니다.

    당신은 결과의 각 행에 가져올 수있는 데이터의 양에 대한 제한이 있습니다. 당신이 그 한도를 초과되는 최대 결과 끝나도록 테이블에 필드를 추가하는 경우 쿼리를 실행하려고하면 오류 메시지가 표시됩니다.

    이 찾기 어려운 오류의 종류이다. 당신은 한 곳에서 변화를 만들고, 실제로는 전혀 새로운 데이터를 사용하지 않는 다른 장소에서 불면. 그것은 심지어 그것이 훨씬 더 힘들어 변화에 오류를 연결할 수 있습니다 누군가가 사용을, 전에 잠시 소요 덜 자주 사용하는 쿼리를 할 수있다.

    당신은 당신이 결과에서 원하는 필드를 지정하는 경우, 오버 헤드 오버 플로우 이런 종류의에서 안전합니다.

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

    9.참고이 문서에서 가져옵니다.

    참고이 문서에서 가져옵니다.

    절대로 함께 할 것 없다 "SELECT *",

    내가 사용하는 단 하나의 이유를 발견했다 "선택 *"

    당신은 특별한 요구 사항 및 생성 된 동적 환경이있는 경우 추가 또는 삭제 열은 자동으로 응용 프로그램 코드에 의해 처리 할 때. 이 특별한 경우에는 변경 응용 프로그램 및 데이터베이스 코드를 필요로하지 않는이 자동으로 프로덕션 환경에 영향을 미칠 것입니다. 이 경우 "SELECT *"를 사용할 수 있습니다.

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

    10.일반적으로 당신은 다양한 유형의 데이터 구조로 SELECT * ...의 결과를 맞게해야합니다. 결과에 도착하는 순서를 지정하지 않으면, 그것은 최대 제대로 라인 모든 것에 까다로울 수있다 (그리고 더 애매한 필드는 미스에 훨씬 쉽다).

    일반적으로 당신은 다양한 유형의 데이터 구조로 SELECT * ...의 결과를 맞게해야합니다. 결과에 도착하는 순서를 지정하지 않으면, 그것은 최대 제대로 라인 모든 것에 까다로울 수있다 (그리고 더 애매한 필드는 미스에 훨씬 쉽다).

    모든 응용 프로그램을 통해 SQL 액세스 코드를 깨지 않고 여러 가지 이유로 (심지어 중간에) 당신의 테이블에 필드를 추가 할 수 있습니다이 방법.

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

    11.만 열 몇 당신이 필요로하는 것보다 전송 더 많은 데이터를 의미해야하는 경우 SELECT *를 사용. 이것은 데이터베이스에 처리하고 클라이언트에 데이터를 가져 오는에 대기 시간이 증가 추가합니다. 그것은 대부분의 효율성에 관하여, 대형 BLOB 파일로,로드 때 훨씬 더 많은 경우에, 더 많은 메모리를 사용하는 것이에 추가합니다.

    만 열 몇 당신이 필요로하는 것보다 전송 더 많은 데이터를 의미해야하는 경우 SELECT *를 사용. 이것은 데이터베이스에 처리하고 클라이언트에 데이터를 가져 오는에 대기 시간이 증가 추가합니다. 그것은 대부분의 효율성에 관하여, 대형 BLOB 파일로,로드 때 훨씬 더 많은 경우에, 더 많은 메모리를 사용하는 것이에 추가합니다.

    이 외에도, 그러나, 테이블에 무엇을 찾아 보지 않고도, 열이로드되고 있는지 쿼리 볼 때 참조하는 것이 더 쉽습니다.

    예를 여분의 열을 추가 할 경우, 더 빨리 겠지만, 대부분의 경우에, 당신은 / 필요 어쨌든 새 열을 받아 쿼리를 사용하여 코드를 변경할 것, 그리고 점점 사람들은 당신이 '돈있는 잠재력이있다 t는 문제가 발생할 수 있습니다 기대 /합니다. 모든 열을 잡아 예를 들어, 다음에 하나를 추가 할당 변수 루프 순서에 의존, 또는 열 순서 변경이있는 경우는 모두를 던질 수 (알 백업에서 복원 할 때 그것은 일).

    당신은 INSERT 당신은 항상 열을 지정해야합니다을하고 있다면 이유는 추론의 같은 종류이다.

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

    12.난 정말이에 대한 담요 규칙이있을 수 있다고 생각하지 않습니다. 많은 경우에, 나는 SELECT *를 피할 수 있지만, 나는 또한 SELECT * 매우 유익 데이터 프레임 워크와 함께 일했다.

    난 정말이에 대한 담요 규칙이있을 수 있다고 생각하지 않습니다. 많은 경우에, 나는 SELECT *를 피할 수 있지만, 나는 또한 SELECT * 매우 유익 데이터 프레임 워크와 함께 일했다.

    모든 사물과 마찬가지로 장점과 비용이 있습니다. 난 당신이 데이터 구조체를 통해이 얼마나 제어 혜택 대 비용 방정식의 일부라고 생각합니다. 선택 (SELECT) *가 잘 작동의 경우, 엄격하게 통제 된 데이터 구조 때문에 누군가가 테이블에 큰 BLOB 필드를 스 네크 거라는 많은 위험이 아니었다, (그것은 소매 소프트웨어이었다).

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

    13.더 실용적인 이유가있다 : 돈. 클라우드 데이터베이스를 사용하고 데이터를 지불해야하는 경우 즉시 폐기됩니다 데이터를 읽을 수있는 아무런 설명이없는 처리.

    더 실용적인 이유가있다 : 돈. 클라우드 데이터베이스를 사용하고 데이터를 지불해야하는 경우 즉시 폐기됩니다 데이터를 읽을 수있는 아무런 설명이없는 처리.

    예를 들면 : BigQuery를 :

    및 제어 프로젝션 - 피가 SELECT * :

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

    14.스키마를 (가능한 경우) 설계하기 전에 요구 사항을 이해합니다.

    스키마를 (가능한 경우) 설계하기 전에 요구 사항을 이해합니다.

    데이터에 대해 알아보기,       1) 색인       2) 사용되는 저장의 유형       3) 공급 엔진 또는 기능; 즉 ... 캐시, 메모리 기능       4) 데이터 형식       표 5) 크기       질의 6) 주파수       리소스를 공유하는 경우 7) 워크로드를 관련       8) 시험

    A) 요구 사항에 따라 달라질 수 있습니다. 하드웨어가 예상되는 워크로드를 지원할 수없는 경우, 당신은 워크로드 요구 사항을 제공하는 방법을 다시 평가해야합니다. 테이블에 부가 칼럼에. 데이터베이스 지원보기 경우 (대 '*'선택) 특정라는 이름의 열이있는 특정 데이터의 색인 (?)보기를 만들 수 있습니다. > "쓰레기 아웃"증후군 - 정기적으로 당신이 "쓰레기-에서"으로 실행되지 않습니다 보장하기 위해 데이터 및 스키마를 검토합니다.

    다른 해결책이없는 가정; 당신은 계정에 다음이 걸릴 수 있습니다. 문제가 여러 솔루션은 항상있다.

    1) 인덱싱 : 셀렉트 *는 tablescan을 실행한다. 다양한 요인에 따라,이 디스크가 추구 및 / 또는 다른 쿼리와 경합 포함 할 수있다. 테이블은 다목적 인 경우,있는 거 목표 시간을 모든 쿼리가 확대됨에 있는지 확인하고 아래 실행합니다. 이 많은 양의 데이터이며, 경우 네트워크 또는 다른 자원이 조정되지 않고, 당신은이 점을 고려해야 할 필요가있다. 데이터베이스는 공유 환경입니다.

    2) 스토리지 유형. 즉 : 당신이 SSD의 디스크 또는 메모리를 사용하는 경우. I / O 시간과 시스템의 부하 / CPU에 따라 달라질 수 있습니다.

    높은 성능 3) 할 수있는 DBA의 조정은 데이터베이스 / 테이블? 어떤 이유 Assumming, 팀은 '*'선택이 문제에 대한 최상의 솔루션 결정했다; DB를 또는 테이블은 메모리에로드 할 수 있습니다. (또는 다른 방법 ... 어쩌면 응답은 2 ~ 3 초 지연에 대응하기 위해 설계되었습니다? --- 광고는 회사 수익을 적립 재생되는 동안 ...)

    4)베이스 라인에서 시작합니다. 데이터 유형을 이해하고, 결과는 어떻게 표시됩니다. 작은 데이터 유형은 필드의 개수는 결과 집합에 반환되는 데이터의 양을 감소시킨다. 다른 시스템 요구 사항에 해당하는이 잎 자원. 시스템 자원은 일반적으로 제한이있다; 이 기준 이하 '항상'작업은 안정성, 예측 가능한 동작을 보장합니다.

    테이블 / 데이터 5) 크기. 선택 '*'작은 테이블이 일반적이다. 그들은 일반적으로 메모리에 맞지 및 응답 시간이 빠르다. 다시 .... 요구 사항을 검토합니다. 기능 크리프에 대한 계획; 항상 현재 및 향후 요구에 대한 계획.

    질의 / 질의 6) 주파수. 시스템의 다른 워크로드에 유의하십시오. 이 쿼리는 매 초마다 떨어져 화재 및 경우 테이블이 작은입니다. 결과 집합은 캐시 / 메모리에 유지하도록 설계 될 수있다. 쿼리가 기가 바이트 / 테라 바이트의 데이터와 자주 배치 과정 그러나 ... 당신은 다른 작업이 영향을받지 않습니다 보장하기 위해 더 나은 오프 헌정 추가 리소스 수있다.

    7) 작업을 관련. 자원이 사용되는 방법을 이해합니다. 네트워크 / 시스템 / 데이터베이스 / 테이블 / 응용 프로그램은 전용 또는 공유되어 있습니까? 이해 관계자는 누구인가? 이 생산, 개발 또는 품질 보증을 위해인가? 이 임시 "빠른 수정"입니다. 당신이 시나리오를 테스트 한 적이 있습니까? 당신은 오늘 현재의 하드웨어에있을 수 있습니다 얼마나 많은 문제들을 놀라게됩니다. (예, 성능은 빠르고 ...하지만 디자인 / 성능은 여전히 ​​저하됩니다.) 성능 두번째 대 초당 5 ~ 10 개 쿼리 당 10K 쿼리 시스템이 필요합니까. 데이터베이스 서버는 공유 자원에 실행 모니터링, 전용, 또는 다른 응용 프로그램을 할 수 있습니다. 일부 응용 프로그램 / 언어; O / S의 다양한 증상 / 문제를 일으키는 메모리의 100 %를 소비한다.

    8) 시험 : 시험은 이론 밖으로, 그리고 당신에 대해 할 수있는만큼 이해합니다. 당신의 선택 '*'문제는 큰 문제가 될 수있다, 또는 당신도에 대해 걱정할 필요가 없습니다 뭔가 할 수있다.

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

    15.열 이름을 선택하면 데이터베이스 엔진이 아니라 테이블 데이터를 쿼리보다 인덱스에서 데이터를 액세스 할 수있는 가능성을 제기한다.

    열 이름을 선택하면 데이터베이스 엔진이 아니라 테이블 데이터를 쿼리보다 인덱스에서 데이터를 액세스 할 수있는 가능성을 제기한다.

    당신이 테이블에 추가 된 새 열을 얻기 위하여려고하고 있기 때문에 데이터베이스 스키마가 당신의 코드가 사용 또는 현재 그 새로운 데이터로 작성된 것이 아니므로, 비록, 변경하는 경우 SELECT *이 경우 예상치 못한 성능과 기능 변화에 시스템을 제공합니다.

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

    16.이유 왜 NOT TO USE SELECT * FROM TABLE : -

    이유 왜 NOT TO USE SELECT * FROM TABLE : -

    항상 사용하는 열 이름은 대규모 데이터베이스에 항상 당신을 도울 것입니다.

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

    17.위의 모든 답변은 좋다, 그러나 당신은 여기까지 도달하고 여전히 확신하지 않으면 ...

    위의 모든 답변은 좋다, 그러나 당신은 여기까지 도달하고 여전히 확신하지 않으면 ...

    당신이 필요로하는 열을 선택, 쿼리 거의 자기 문서화한다. 당신은 쿼리는 SELECT *와 결코 알지 못할 것이다, 반환 된 데이터의 유형 아이디어를 얻을.

    아무것도 당신이 할 수 should't SELECT *를 사용하는 것보다 더 초보자처럼 보이게하지 않습니다. 그냥 SQL 쿼리를 종료하지있다.

    일부는 모두를위한 소문자를 입력 괜찮다,하지만 단지 버그 나, 나는 그것의 생산 코드 키워드를 대문자 사용해야합니다.

    가독성 카운트!

    위의 안하고 정확히 유해, 당신의 동료들과 CRED에 잘 .... 유해한 : D

  18. from https://stackoverflow.com/questions/3639861/why-is-select-considered-harmful by cc-by-sa and MIT license