복붙노트

[SQL] SELECT *를 사용에서 성능 문제? [복제]

SQL

SELECT *를 사용에서 성능 문제? [복제]

SELECT *보다는 SELECT FiledName, FiledName2를 사용하여 어떤 성능 문제는 ...이 있습니까?

해결법

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

    1.당신이 컬럼의 서브 세트를해야하는 경우에는 최적화에 나쁜 도움을주고있다 (인덱스에 대해 선택할 수 없습니다, 또는 단지 인덱스에 갈 수 없어 ...)

    당신이 컬럼의 서브 세트를해야하는 경우에는 최적화에 나쁜 도움을주고있다 (인덱스에 대해 선택할 수 없습니다, 또는 단지 인덱스에 갈 수 없어 ...)

    일부 데이터베이스는 인덱스에서 데이터를 검색 할 수 있습니다. 그 점은 아주 아주 helpfull과 놀라운 속도 향상을 제공한다. SELECT * 쿼리를 실행하면이 트릭을 허용하지 않습니다.

    어쨌든, 응용 프로그램의 관점에서 좋은 방법이 아닙니다.

    이에 대한 예 :

    당신은 모든 컬럼 데이터를 얻을 수 * T FROM WHERE C1은 = 123, 최적화가 요구 SELECT 대신하는 경우, (C1, C2)에 다음 인덱스를 사용할 수 없습니다.

    에서 여러 테이블을 조인하는 것은 많은 도움이된다.

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

    2.이 게시물을 살펴보십시오 :

    이 게시물을 살펴보십시오 :

    선택 *를 사용하지 않는 이유는 무엇입니까?

    이러한 :

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

    3.당신이 선택 *을 할 때마다 열 목록을 얻을 수있는 추가 쿼리 할 수있다. 높은 트랜잭션 환경에서이 가시적 인 오버 헤드가 될 수 있지만, 모든 이제 다음 번에는 차이가 없습니다.

    당신이 선택 *을 할 때마다 열 목록을 얻을 수있는 추가 쿼리 할 수있다. 높은 트랜잭션 환경에서이 가시적 인 오버 헤드가 될 수 있지만, 모든 이제 다음 번에는 차이가 없습니다.

    기록을 삽입 할 때 또한, 경우 열에 삽입에서 선택 *를 사용하지 않을 추가됩니다.

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

    4.응용 프로그램 만 선택 *에 의해 반환 된 필드의 하위 집합을 필요로하는 경우에만 성능 문제가 될 것입니다. 효과적으로 같은 일이기 때문에 데이터베이스의 성능에 차이가 없습니다.

    응용 프로그램 만 선택 *에 의해 반환 된 필드의 하위 집합을 필요로하는 경우에만 성능 문제가 될 것입니다. 효과적으로 같은 일이기 때문에 데이터베이스의 성능에 차이가 없습니다.

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

    5.나는 DBA 아니지만, 나는 우리 DBA 학습 무엇을 기억에서 추론은 (SQL Server에서 적어도)에 DB 캐싱 알고리즘이 잘 캐시 '*'쿼리를하지 않는 것입니다하지만 당신은 동일한 쿼리를 실행하는 경우 정확한 열을 여러 번 지정하여, 그 잘 캐시합니다.

    나는 DBA 아니지만, 나는 우리 DBA 학습 무엇을 기억에서 추론은 (SQL Server에서 적어도)에 DB 캐싱 알고리즘이 잘 캐시 '*'쿼리를하지 않는 것입니다하지만 당신은 동일한 쿼리를 실행하는 경우 정확한 열을 여러 번 지정하여, 그 잘 캐시합니다.

    나는 확실히 더 많은 지식 DBA가 어떻게 캐싱 메커니즘 작품의 정확한 세부 사항에 갈 수 있어요,하지만의하는 성능 저하가 이유.

    참고 : 쿼리가 너무 그렇지 않으면 당신은 어떤 성능 차이를 볼 수 없을 것입니다, 특히 작은 시간 프레임에서 여러 번 실행하는 것입니다 경우 캐싱 성능에만 작동합니다.

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

    6.나는 컴퓨팅 성능에 대한하지만, 읽기 / 유지 - 능력 (즉, 인간 성능) 우리가 내 가게에서 선택 *를 사용하지 않는 측면에서 모른다. 모든 명시 적으로 선택됩니다.

    나는 컴퓨팅 성능에 대한하지만, 읽기 / 유지 - 능력 (즉, 인간 성능) 우리가 내 가게에서 선택 *를 사용하지 않는 측면에서 모른다. 모든 명시 적으로 선택됩니다.

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

    7.아마도. 그것은 크게 다른 많은 열이 얼마나 많은 행이 돌아 오는 방법은 물건을 저장하는 방법과 데이터베이스 엔진, 그리고 다른 컬럼의 크기에 따라 달라집니다.

    아마도. 그것은 크게 다른 많은 열이 얼마나 많은 행이 돌아 오는 방법은 물건을 저장하는 방법과 데이터베이스 엔진, 그리고 다른 컬럼의 크기에 따라 달라집니다.

    당신은 행 - 기반 데이터베이스를 사용하는 경우 (즉, 가장 중) 함께 저장 모든 열이 (거의 모든 종종 별도로 저장됩니다 BLOB를, 특히 큰 사람을 제외 할) 한 후 SELECT *를 수행하면에 거의 영향을 미치지 서버 자체는 - 어쨌든 전체 행을 가져올 수 있습니다.

    반면에, 당신은 네트워크를 통해 데이터를 전송하는 경우 (심지어 로컬 또는 그것은 버퍼의 크기에 영향을 미칠 것으로 등 사용), 다음 보낼 적은 바이트가있을 것 같은, 더 적은 열을하는 데 도움이 될 수 있습니다 뒤. 쿼리가 어떤 식 으로든 어려운 경우 이러한 차이는 서버 성능에 비하면 정말 왜소 어쨌든 될 수있다 (예를 들어, IO 필요).

    당신이 행에 큰 모양이있는 경우 * 매우 영리하지 SELECT - 그렇지 않으면 많은 변화를 가져올 가능성, 그러나 수 있습니다.

    그들은 완전히 다른 - - 데이터베이스 엔진 주위에 노크 몇 가지 "를 기반으로 열"이 있습니다 전체 성능 살인자 그들을 위해, "SELECT *는"; 그것을 방지해야합니다. 기회는 당신이 하나를 사용하는 경우, 당신은 (일반적으로 그들은 매우 큰 데이터웨어 하우스 응용 프로그램에 사용하고)이 비록 완전히 인식이다.

    나를 위해, "SELECT *"사용하지 않는 가장 큰 장점은 유지 보수입니다. 누군가가 테이블에 여분의 열을 추가 할 때 당신은 더 놀라움을받지 않는다; 누군가가 사용했던 열 중 하나 제거 할 때 쿼리는 "빠른 실패". 그것은 사람이 부담없이 당신이 원하는 어떤 열을 볼 수있는 코드를 더 자기 문서화한다.

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

    8.모든 필드를 지정하는 경우에는 의미있는 차이가 성능 현명한 없을 안된다. 방금 다스 럼이있는 테이블에서 몇 특정 필드를 원하는 경우, 그것은 느리다.

    모든 필드를 지정하는 경우에는 의미있는 차이가 성능 현명한 없을 안된다. 방금 다스 럼이있는 테이블에서 몇 특정 필드를 원하는 경우, 그것은 느리다.

    SELECT의 *와 가독성과 유지 보수 문제가 있습니다. 그것은 당신이 모든 필드를 선택하려는 경우에도 특정 필드 이름을 모든 시간을 사용하는 의미가 있습니다.

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

    9.성능, 많은 수 없습니다. 그냥 조금 서투른 : 특히 큰 결과 세트 두 개의 다른 테이블 혹은 그 이상에 합류 (10) 열이있는 테이블, 말,에 주로 사용되지 않는 또는 쓸모없는 데이터를 자주 열 수십를 반환 할 수 있습니다 SELECT *. DBMS에에 히트의 관점에서, 거기에 많은 수 있지만 데이터가 여전히 어떻게 든 와이어를 통해 여행에 필요한 모든 것을 않을 것이다; 네트워크 대역폭과 그에 따른 대기 시간은 확실히까지 추가 할 수 있습니다. 나는 대용량 환경에서이 첫 손을 보았다. 그것은 확실히 문제.

    성능, 많은 수 없습니다. 그냥 조금 서투른 : 특히 큰 결과 세트 두 개의 다른 테이블 혹은 그 이상에 합류 (10) 열이있는 테이블, 말,에 주로 사용되지 않는 또는 쓸모없는 데이터를 자주 열 수십를 반환 할 수 있습니다 SELECT *. DBMS에에 히트의 관점에서, 거기에 많은 수 있지만 데이터가 여전히 어떻게 든 와이어를 통해 여행에 필요한 모든 것을 않을 것이다; 네트워크 대역폭과 그에 따른 대기 시간은 확실히까지 추가 할 수 있습니다. 나는 대용량 환경에서이 첫 손을 보았다. 그것은 확실히 문제.

    이외에도 대역폭 문제에서, 당신은 또한 (당신은뿐만 아니라 처음부터 그것을 할 수 있도록, 어쨌든 일반적으로 SELECT를 제거하는 방법 *을 명확하게하는) 모호한 열 명명 문제로 실행할 수 있습니다, 또한의 요구에 대해 명시 적으로 좋은 연습 간주 코드 내부 코드; 등의 협력으로, 디버깅 - 일을 이렇게 많은 방법에 도움

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

    10.당신이 선택 *를 사용하는 경우는 자동으로 필드 (들)을 반복 참여를 변경할 수 없기 필요보다 더 많은 정보를 전송하는 후 가입 할 수 있습니다. 이 처리 시간과 네트워크 자원의 낭비 및 성능 문제가 발생할 수 있습니다. 또한 그들은 사용자가 볼 것이 아니라되지 않도록 필드는 감사 또는 데이터베이스 유형 처리가 특히 경우 응용 프로그램이 새로운 필드가 추가 될 때 깰 수있는 필드 수단을 지정하지. 삽입에 * 선택은 항상 라인 실제로 테이블의 열 순서가 변경 될 수 있습니다 덜 똑똑한보다 약간 소면 함께 어딘가로 나쁜 생각입니다.

    당신이 선택 *를 사용하는 경우는 자동으로 필드 (들)을 반복 참여를 변경할 수 없기 필요보다 더 많은 정보를 전송하는 후 가입 할 수 있습니다. 이 처리 시간과 네트워크 자원의 낭비 및 성능 문제가 발생할 수 있습니다. 또한 그들은 사용자가 볼 것이 아니라되지 않도록 필드는 감사 또는 데이터베이스 유형 처리가 특히 경우 응용 프로그램이 새로운 필드가 추가 될 때 깰 수있는 필드 수단을 지정하지. 삽입에 * 선택은 항상 라인 실제로 테이블의 열 순서가 변경 될 수 있습니다 덜 똑똑한보다 약간 소면 함께 어딘가로 나쁜 생각입니다.

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

    11.효과적으로 똑같은 그래서이 실행되기 전에 SELECT *는 등 SELECT 필드 1, 필드 2 .... 변환됩니다. 성능 차이 없음.

    효과적으로 똑같은 그래서이 실행되기 전에 SELECT *는 등 SELECT 필드 1, 필드 2 .... 변환됩니다. 성능 차이 없음.

    그러나, 가독성과 maintaiability이 더 나은 경우는 SELECT 필드 1, 필드 2 ..

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

    12.기술적으로, 당신이 사용하는 관계형 데이터베이스 관리 시스템에 따라 달라집니다. 나는 성능 저하가 마이크로 될 것 같아요. 당신이 절대적으로 당신의 시스템에서의 performace의 마지막 비트를 짜내려고하는 경우에, 나는 그들을 사용하지 않는 말할 것입니다.

    기술적으로, 당신이 사용하는 관계형 데이터베이스 관리 시스템에 따라 달라집니다. 나는 성능 저하가 마이크로 될 것 같아요. 당신이 절대적으로 당신의 시스템에서의 performace의 마지막 비트를 짜내려고하는 경우에, 나는 그들을 사용하지 않는 말할 것입니다.

    나는 개인적으로 모든 시간을 사용합니다.

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

    13.기발한 예. 나는 전심으로 내가 SELECT *를 사용하지 않을 것을 직장에서 이야기하고있다. 사실, 그것은 우리의 정책이 느리다) 단지 쿼리와 b를보고 거기에 모호성이 사용되는지에있어 무엇을 사용할 수는 의미)가 있기 때문에 사용하지 않는에서의 SQL 서버는 필요한 각 열을 찾아서 반환한다으로 .

    기발한 예. 나는 전심으로 내가 SELECT *를 사용하지 않을 것을 직장에서 이야기하고있다. 사실, 그것은 우리의 정책이 느리다) 단지 쿼리와 b를보고 거기에 모호성이 사용되는지에있어 무엇을 사용할 수는 의미)가 있기 때문에 사용하지 않는에서의 SQL 서버는 필요한 각 열을 찾아서 반환한다으로 .

    나는 그러나, 이것의 증거를 본 적이 없습니다.

    편집 : 또한, 저장 프로 시저가 서버에 컴파일 및 기본 테이블 구조는 SQL의 컴파일은 개별 열을 * 아래를 선택하면 가정으로는 새로 도입 된 열을 다시 선택하지 않습니다 변경할 때 사용이 SELECT * 경우.

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

    14.당신은 단지 필드의 부분 집합을 사용하는 경우, 성능 차이가 상당 할 수있다. 리눅스 코드의 CScout의 분석에서 1,411,771 행을 검색 포함 다음 예를 참조하십시오.

    당신은 단지 필드의 부분 집합을 사용하는 경우, 성능 차이가 상당 할 수있다. 리눅스 코드의 CScout의 분석에서 1,411,771 행을 검색 포함 다음 예를 참조하십시오.

    $ time sh -c "echo 'select * from IDS' | mysql cslinux >/dev/null"
    real    0m5.622s
    user    0m2.580s
    sys     0m0.532s
    
    $ time sh -c "echo 'select EID from IDS' | mysql cslinux >/dev/null"
    real    0m4.492s
    user    0m0.716s
    sys     0m0.096s
    

    이 심지어 서버의 성능에 미치는 영향을 측정하지 않습니다.

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

    15.당신의 코드에서 SQL을 삽입하는 경우 다음 항상 명확하지 성능을 위해 긴 형식을 사용해야합니다. 당신이 열 대규모 번호가없는 한 임시 쿼리의 선택 * 구문이 더 본질적으로 열 이름을 지정하는 것보다 덜 효율적이다 당신은 당신이하지 않는있는 거 역 정규화는 안된다.

    당신의 코드에서 SQL을 삽입하는 경우 다음 항상 명확하지 성능을 위해 긴 형식을 사용해야합니다. 당신이 열 대규모 번호가없는 한 임시 쿼리의 선택 * 구문이 더 본질적으로 열 이름을 지정하는 것보다 덜 효율적이다 당신은 당신이하지 않는있는 거 역 정규화는 안된다.

    나는 문장이 unlesses을 사용하고 여전히 의미를 가진 1 점을 얻어야한다! :)

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

    16.SELECT *이 긴 슛 가장 큰 성능 저하없는 그러나 모든 열 이름을 찾기 위해 SQL을 필요로한다.

    SELECT *이 긴 슛 가장 큰 성능 저하없는 그러나 모든 열 이름을 찾기 위해 SQL을 필요로한다.

    당신이 평가하는 클러스터되지 않은 인덱스를 필요로하는 쿼리를 수행 할 때 SELECT * 문의 가장 큰 성능 저하입니다. 클러스터되지 않은 인덱스는 모든 컬럼의 커버링 인덱스가하더라도, SQL은 여전히 ​​기본 키를 검색하고 클러스터 된 인덱스의 값을 얻을 것이다.

    당신은 하나 또는 두 개의 열을 필요로하는 경우 이것의 위에, 당신은 필요한 것보다 더 큰 결과 집합을 반환에 의한 처리하는 네트워크 병목 현상이 있습니다.

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

    17.나는 다른 사람들에 대해 말한 메아리 "를 선택 *"는 요청 처리의 일환으로 열 목록을 검색. 반면에, 당신은 또한 RDBMS 엔진이도 검색 할 컬럼의 위치를 ​​결정하기 위해 열을 찾아 볼 필요가 없기 때문에 더 많은 시간을 절약 할 순서에 의해 열을 선택할 수 있습니다. 나는 집계 조회에이 매우 유용하게 찾을 수 있습니다.

    나는 다른 사람들에 대해 말한 메아리 "를 선택 *"는 요청 처리의 일환으로 열 목록을 검색. 반면에, 당신은 또한 RDBMS 엔진이도 검색 할 컬럼의 위치를 ​​결정하기 위해 열을 찾아 볼 필요가 없기 때문에 더 많은 시간을 절약 할 순서에 의해 열을 선택할 수 있습니다. 나는 집계 조회에이 매우 유용하게 찾을 수 있습니다.

    예를 들어 선택 횟수 (1) ...의 행 선택 수 (*) 대 ...

    이 예에서, RDBMS는 단지 그것을 첫 번째 열의 수를 필요가 있음을 알고 있어야하고, ZING, 그것은 떨어져 있습니다. 제 (불행히도)보다 일반적인 SELECT COUNT (*)에서 RDBMS는 모든 열 목록을 검색 한 다음 (1 열만을 확인하는 반대)이 계산 유효 있는지 결정하기 위해 각 행을 확인합니다.

    이 시간의 위대한 대부분 작동합니다. 난 확신 대부분의 DB 시스템은 계산에 NULL 값을 계산하지만이 조심하고 가정하기 전에 확인해야합니다.

    YMMV, 지역에서는 무효 금지 등!

  18. ==============================

    18.공연 당신은 모든 열을 필요로하지 않는 경우에 항상 나쁜 것입니다. 데이터베이스와 사용자 LAN 스로틀 것이다 필요한 것보다 더 많은 데이터를 반환 / 대역폭을 완.

    공연 당신은 모든 열을 필요로하지 않는 경우에 항상 나쁜 것입니다. 데이터베이스와 사용자 LAN 스로틀 것이다 필요한 것보다 더 많은 데이터를 반환 / 대역폭을 완.

    가독성 열이보기에 알면, 절차는 매우 유용 할 * 전혀 도움이되지 않습니다를 선택하고 나는 그것이 비생산적이라고 생각 할 수 있습니다.

    * 테스트 당신이 스키마 변경을하면 어떤 테스트는 메타 데이터, PROC를 뷰의 출력을 확인해야합니다 확인 쓰기 때문에, 내 SELECT *를 사용하는 모든 코드는 무효화되어야한다.

    * 물론, 당신은 DB 데브의가 있어야한다 모든 좋은 같은 장소에서 검사를 가정 :)

  19. ==============================

    19.나는 특정 성능 요구를 제외한 거의 모든 대답에 동의합니다. 실제로 테이블의 모든 열을 사용하기 위하여려고하는 경우에, 나는 SELECT * 버전은 전혀 타지 빠른 주장 할 것입니다. 이유는 다음과 같습니다

    나는 특정 성능 요구를 제외한 거의 모든 대답에 동의합니다. 실제로 테이블의 모든 열을 사용하기 위하여려고하는 경우에, 나는 SELECT * 버전은 전혀 타지 빠른 주장 할 것입니다. 이유는 다음과 같습니다

    (ID, 배)에 고유 인덱스가있는 경우 테이블에이 두 쿼리를 가지고 :

    SELECT x,y,z,w FROM tab WHERE id='abc' ORDER BY s
    
    SELECT x,y,z,w FROM tab WHERE id='abc' 
    AND x in ('a','b','c','d','e','f','g','h',...)
    ORDER BY ('a','b','c','d','e','f','g','h',...)
    

    어느 것이 더 빠르다? 'ABC'하는 것은 다음 첫 번째 쿼리는 아마 더 빨리 ID의 표에서 x의 모든 'X에서'절 이름 값됩니다. 이제 이러한 필드의 이름을 바꿀 수 있습니다 :

    SELECT field_name, field_type, field_offset, field_len
    FROM internal_field_catalog
    WHERE table_name = 'abc'
    ORDER BY field_order
    

    데이터를 검색 할 때 그래서, SELECT *이 엔진이 결과 집합 행 데이터를 이동하는 하나의 방어 적이기을 (동등한) 할 수 있으며 필드 데이터를 검색 할 때 아마 빠른 선택됩니다.

    내가 말하고 모든 SELECT * 완벽하게 유용하고 아마 빠른 에지 경우가 있습니다. 한 가지 이유 당신은 항상 테이블의 모든 열 (어떤 이유로)는 RDBMS에서 객체 지속성을 저장할 때해야 할 수도 있습니다. 엄지 손가락의 모든 규칙에 예외가있다.

  20. from https://stackoverflow.com/questions/487578/performance-issue-in-using-select by cc-by-sa and MIT license