복붙노트

[SQL] 이 성능은 모든 열을 선택하는 나쁜가요?

SQL

이 성능은 모든 열을 선택하는 나쁜가요?

그것은 당신이 아마 그들 모두를 neeed하지 않더라도 한 번에 모든 열을 선택하려면 나쁜가요? 그러나 당신은 다른 작업에 필요할 수 있지만 모든 작업에 대한 쓰기 쿼리에 게으른에 있습니다.

당신은 당신이 다른 열을 필요로하는 경우 당신은 당신이 필요에만 열을 선택하고 다시이 쿼리를 수행 할 쿼리를해야합니까?

그래서 기본적 질문은 : 그것은 여러 열에 대 한 열을 선택 성능에 영향을합니까?

쿼리 (등 조인, 아니 기능) 매우 간단합니다 예를 들면 :

SELECT
id, name, status, date
FROM user_table
WHERE user_id = :user_id

해결법

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

    1.여기서 문제는 네트워크 통신으로, 너무 많은 데이터베이스 서버의 문제가 아니다. 한 번에 모든 열을 선택하면 한 번에 당신에게 모든 열을 반환하도록 서버를 말하는 것입니다. 그 질문에 친절하게 해결하고 대답하는, IO에 대한 우려와 모든으로 @Karamba 코멘트에 준 : 선택 *를 선택 열 대. 그러나 대부분의 실제 응용 프로그램 (나는 모든 의미에서 "응용 프로그램"을 사용)에 대한 주요 관심사는 네트워크 트래픽과 얼마나 오래 직렬화, 전송에 소요, 데이터를 역 직렬화이다. 정말하지만, 대답은 동일 하나 방법입니다.

    여기서 문제는 네트워크 통신으로, 너무 많은 데이터베이스 서버의 문제가 아니다. 한 번에 모든 열을 선택하면 한 번에 당신에게 모든 열을 반환하도록 서버를 말하는 것입니다. 그 질문에 친절하게 해결하고 대답하는, IO에 대한 우려와 모든으로 @Karamba 코멘트에 준 : 선택 *를 선택 열 대. 그러나 대부분의 실제 응용 프로그램 (나는 모든 의미에서 "응용 프로그램"을 사용)에 대한 주요 관심사는 네트워크 트래픽과 얼마나 오래 직렬화, 전송에 소요, 데이터를 역 직렬화이다. 정말하지만, 대답은 동일 하나 방법입니다.

    다시 모든 열을 당겨 그래서 당신이 그들 모두를 사용하려는 경우, 매우 중요하지만, 그건 당신이, 말, 당신의 열의 긴 문자열을 저장하는 경우 특히, 별도의 데이터 전송을 많이 할 수 있습니다. 많은 경우에, 물론 차이는 발견 할 수 있으며 대부분 원칙의 문제입니다 것입니다. 모든하지만 상당한 대부분.

    그것은 (우리 모두 느낌이 방법이, 그리고 나를 신뢰) 지금 얼마나 중요한 성능이 정말 정말 그냥 트레이드 오프하여 상기 게으름 사이입니다.

    모든 열 값을 사용하려는 경우 모든 말했다, 당신은 훨씬 더 그들에게 한 번 다음 쿼리의 무리를 제출하는 모든 뒤로 당겨 길 이죠.

    웹 검색을 수행처럼 생각 : 당신이 당신의 검색을 수행, 당신은 당신의 페이지를 찾아, 당신은 단지 하나의 세부 사항이 필요합니다. 당신은 전체 페이지를 읽고 주제에 대해 모든 걸 알고, 또는 당신은 당신이 찾고있는 및 할 일에 대해 부분으로 이동할 수 있습니다. 그게 당신이 지금 원하는 모든 만약 후자는 훨씬 빠르지 만, 그런 다음 다른 측면을 학습해야 할 거라면, 당신은 다시 찾기 검색을하는 것보다 그들에게 처음 읽는 떨어져 더 나은 방법이 될 것입니다 이 사이트는 얘기합니다.

    당신은 당신이의 전화는 경우 가능성이있는 개발자로 만들 것을 다음, 미래에 다른 열 값을해야합니다 여부를하지 않은 경우.

    그것은 모든 응용 프로그램이 당신이 그것을 사용하는 방법 데이터가 무엇인지, 무엇에 따라 달라집니다, 얼마나 중요한 성능 정말 당신입니다.

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

    2.하나의 열을 선택하면 특정 쿼리의 성능에 큰 영향을 미칠 수 있습니다. 쿼리 엔진이 원래의 데이터 페이지에서 데이터를 백업 인덱스보다는 모양을 처리 할 예를 들어, 더 효율적입니다. 커버링 인덱스를 사용할 수있는 경우 - 즉, 쿼리에 필요한 모든 열을 포함하는 인덱스 - 다음 쿼리는 빠르게 실행됩니다. 사용 가능한 메모리에 비해 너무 큰 대형 테이블의 경우, 커버링 인덱스의 사용은 큰, 큰 승리가 될 수 있습니다. (경우에 따라 엄청난 성능 향상의 주문을 생각하십시오.)

    하나의 열을 선택하면 특정 쿼리의 성능에 큰 영향을 미칠 수 있습니다. 쿼리 엔진이 원래의 데이터 페이지에서 데이터를 백업 인덱스보다는 모양을 처리 할 예를 들어, 더 효율적입니다. 커버링 인덱스를 사용할 수있는 경우 - 즉, 쿼리에 필요한 모든 열을 포함하는 인덱스 - 다음 쿼리는 빠르게 실행됩니다. 사용 가능한 메모리에 비해 너무 큰 대형 테이블의 경우, 커버링 인덱스의 사용은 큰, 큰 승리가 될 수 있습니다. (경우에 따라 엄청난 성능 향상의 주문을 생각하십시오.)

    열 중 하나 이상이 이러한 BLOB 또는 TEXT 컬럼으로 매우 큰 경우 열의 제한된 개수는 유익한 다른 경우이다. 이들은 수십 바이트 또는 메가 바이트의 수천에 크기가 커질 수 있습니다. 를 검색 및 서버에 큰 부하를 넣어.

    당신이 준비된 문 테이블 변경의 기본 구조를 가지고있는 경우, *를 사용의 위험이 있습니다. 쿼리 자체가 얻을 수있는 오래된 (I는하지만 특별히 MySQL을, 다른 데이터베이스에이 문제를 했어). 근본적인 변화는 열 이름을 변경 한 간단하게 될 수 있습니다. 무엇 컴파일시 에러로 잡힐 것 대신 훨씬 더 신비 수 있습니다 런타임 오류입니다.

    일반적으로, * 피에 주어진 이유는 네트워크 성능과 더 있습니다. 많은 경우에, 큰 차이를 만들려고하지 않습니다. 각 행은 다음 다음, 평균 100 또는 200 바이트에, 대부분의 하드웨어 환경에서 사소한 것 컬럼과 컬럼의 서브 세트를 모두 선택의 차이를 포함하는 테이블에서 20 개 행을 반환하는 경우. 쿼리를 위해 소요되는 시간의 대부분은, 쿼리를 컴파일 엔진에서 그것을 실행하고 데이터 페이지를 읽는 것입니다. 200 바이트 또는 2000 바이트를 반환의 차이는 아마 큰 차이가 없습니다.

    그러나, 큰 차이를 만들 수 있습니다 (예 : 위에 나열된 것과 같은) 경우가 있습니다. 그래서, *을 피하는 것은 좋은 습관이지만, 아마 당신의 시스템을 가지고하지 않을 땐 그것을 사용.

  3. from https://stackoverflow.com/questions/25093187/is-it-bad-for-performance-to-select-all-columns by cc-by-sa and MIT license