2009-05-12 2 views
6

나는 두 개의 질의반환되는 열 수가 쿼리 속도에 영향을 줍니까?

SELECT Id, Forename, Surname 
FROM Person 
WHERE PersonName Like(‘%frank%’) 

그리고

SELECT * 
FROM Person 
WHERE PersonName Like(‘%frank%’) 

쿼리를 빠르게 실행이있는 경우? where 절/테이블이 가장 큰 요소 또는 열 개수에 합류합니까?

저는 데이터베이스 테이블에 매핑되는 일련의 개체를 만들기 때문에 묻습니다. 일반적으로 각 개체가있을 것이다 적어도 다음 세 가지 방법 :

Select가 - 즉, 드롭 다운 목록

Search을 채우는 데 사용 될 수있다 충분한 선택 - - 모든

List이 선택은에서 볼 수있는 모든 것을 선택 결과, 일반적으로 약 6 정도의 열.

각 쿼리가 정확히 동일한 열 집합을 반환하면 코드 유지 관리 및 테스트가 더 간단해야합니다. 주어진 테이블에서 데이터베이스가 50,000 행을 초과하지는 않으므로 성능 차이가 작 으면 개발 시간을 절약 할 수 있습니다. 성능이 바닥을 통과 할 경우 다른 각도에서 작업 할 것입니다.

개발의 편의를 위해 SELECT *은 합리적입니까, 아니면 순진합니까?

+3

약간의 문법 : * 쿼리 속도에 영향을줍니다. –

+0

http://xkcd.com/326/ – Quassnoi

+0

외교 정책은 어떤 영향을 미칠 수 있지만 열 수는 없습니다. – Andomar

답변

23

당신은 더 나은 당신이 테이블 레이아웃을 변경할 때 혼란에 이르게 SELECT *

  • 마십시오.
  • 불필요한 열을 선택하고 데이터 패킷이 커집니다.
  • 열은 또한 일부 응용 프로그램에 대한 좋지 않은 중복 된 이름을 얻을 수 있습니다
  • SELECT *가에 테이블 레코드를 방문해야합니다 동안 인덱스에 포함되어 필요한 모든 열, SELECT columns 만,이 인덱스를 사용할 경우
  • 필요없는 값을 얻으십시오. 또한 성능에 좋지 않습니다.
+0

나는 대부분의 점에 동의하지만 "열에 중복 된 이름이 생길 수 있습니다."- 그것은 저에게 뉴스입니다. 어떻게 그렇게? – paxdiablo

+2

@Pax : 쿼리 내에 자체 조인이 있거나 이름이 같은 일부 열이있는 두 테이블을 조인하는 경우. – Quassnoi

+0

@Pax Select * 사람 p, 연락처 c에서 c.PersonID = p.PersonID; 이것은 일반적으로 2 개의 테이블에 [이름]이 있습니다. 예를 들어 – balexandre

-2

확실히. 검색 할 열의 이름을 지정하는 것이 좋습니다.

0

사람이 Id, Forename 및 성을 가진 경우 쿼리는 동일해야합니다. 그러나 쿼리 시간은 반환 된 열 수 (실제로 데이터 양)에 비례하여 증가합니다.

또한 쿼리에 이러한 세 개의 열만 필요하면 해당 세 열만 요청해야합니다. SELECT *를 선택하고 나중에 스키마를 변경하면 기본적으로 모든 쿼리에 추가 처리가 추가되어 실제 이점이 추가되지 않습니다.

0

"선택 *"구문을 사용하는 것이 바람직하지 않은 이유에 대해이 question을 방문합니다.

3 열을 선택하면 3 열을 선택하는 것이 눈에 띄는 영향을 미치지 않을 수도 있지만 테이블이 커지고 성능이 크게 나빠질 수 있습니다.

0

일반적으로, 어떤 상황에서, 당신은 당신의 코드에서

SELECT * FROM TABLE 

를 사용하여 멀리하고 싶다. 이렇게하면 여러 가지 문제가 발생할 수 있으며 그 중 하나만 성능입니다. 내 머리 꼭대기에서 생각할 수있는 다른 두 가지는 리소스 사용률입니다. 필요하지 않은 열을 선택하거나 나중에 열을 추가하면 ... 데이터를 가져오고 메모리를 낭비합니다. 코드 가독성 (만약 누군가가 당신의 코드에서 SELECT * FROM을 본다면, 실제로 어떤 컬럼이 당신의 어플리케이션에서 사용되는지를 알 필요는 없다.

생각해보아야 할 몇 가지 사항이 있지만 최선의 방법은 사용하지 않는 것입니다.

0

예. 기본적으로 :

  • 더 많은 데이터는
  • 데이터베이스 서버가 더 많은 데이터

당신은 사용하지 말아야를 가져가 데이터베이스 서버에서 옮겨진 수있다 선택 *받는 사람 또한

0

다른 대답은 SELECT *가 쿼리의 모든 테이블에서 데이터를 반환한다고 생각하십시오. JOIN을 통해 다른 테이블을 추가하기 시작하면 볼 수없는 것을 보게됩니다.

전체 결과 집합의 범위를 좁히기 위해 해당 테이블의 인덱스 만 사용하는 대신 SELECT *에서 실제로 조인 된 테이블에서 데이터를 가져와야하는 경우도 있습니다. 그래도 나는 그런 예를 생각할 수 없다.

1

대학에서 올바르게 기억하고 있다면 (* 잠시 동안) *를 선택하는 것이 바람직하지 않지만 가입하기 전까지는 좋지 않습니다. 조인 된 튜플을 만드는 관계형 아레그브라에 들어갈 때마다 모든 열에 시간이 추가되므로 가능한 경우이를 피할 수 있습니다.

6

SELECT *은 일반적으로 좋은 아이디어입니다. DBMS 가져 오기 속도를 늦추지는 않지만 필요할 때보 다 더 많은 데이터가 네트워크를 통해 전송 될 수 있습니다.

그러나 기본적으로 인덱싱 할 수 없으며 전체 테이블 검색이 발생하는 LIKE '%frank%' 절을 사용하면 중요하지 않게 될 것입니다.

데이터가 데이터베이스에 들어갈 때 데이터 정리를 고려하면 후속 쿼리를 훨씬 빠르게 실행할 수 있기 때문에 데이터를 정리하는 것이 좋습니다.

select x,y,z from table where name = 'frank' 

당신이뿐만 아니라 프랭클린을 얻고 싶은 경우에, 사용 :

select x,y,z from table where name like 'frank%' 

이 두 가지 모두를 할 것이다 당신은 솔직한 후 경우

, 다음은 솔직하고 사용으로 저장되어 있는지 확인 이름 열에 인덱스를 사용할 수 없으므로 "%frank%"은 그렇지 않습니다.

0

다양한 크기가 있습니다. 일단 *는 코드를 더 약하게 만듭니다. 이후 버전에서 테이블 레이아웃을 변경할 때 열 순서에 의존하는 코드가 손상되거나 데이터 유형이 여전히 일치 할 경우 잘못된 열을 읽거나 수정할 수 있습니다. 이는 실제로 심하게 문제가 될 수 있습니다!

또한 항상 모든 열을 요청하면 데이터베이스 클라이언트와 불필요한 열에 대해 더 많은 메모리가 필요합니다. 테이블에 긴 문자 필드, 매우 많은 필드 및/또는 BLOB가 있으면 실제로 비용이 많이 듭니다. 불필요한 열을 선택하면 클라이언트가 결코 보지 않는 엄청난 양의 내용으로 서버의 캐시를 범람시킴으로써 서버의 캐시를 스레 싱합니다.

따라서 일반적으로 사용해서는 안됩니다. 대부분의 객체 관계형 매핑 도구는 어쨌든 모든 열 이름을 포함하는 SQL을 생성하므로 개발 중에는 문제가되지 않습니다. 필자는 개인적으로 직접 입력해야하는 신속한 임시 쿼리에 * 사용하는 경향이 있습니다.

1

테이블의 열 수는 쿼리 성능에 영향을주지 않습니다. 쿼리에서 조작 된 열의 수입니다.

참고 오라클 개념 설명서에서 다음 예 :

행 형식 및 크기 오라클 저장 한 이상의 행 조각으로 256 열에 데이터를 포함하는 데이터베이스 테이블의 각 행. 전체 행 이 단일 데이터 블록에 삽입 될 수 있으면 오라클은 행을 행 조각으로 저장합니다. 행의 모든 ​​데이터가 에 업데이트 하나의 데이터 블록으로 또는 경우에 삽입 할 수없는 경우, 기존의 행 에 행이 데이터 블록을 빨리 성장의 원인, 오라클 저장 여러 행을 조각을 사용하여 행. 데이터 블록에는 일반적으로 각 행에 대해 행 번호가 개만 포함됩니다. 오라클은 한 행 조각 이상에 행을 저장해야하는 경우 여러 블록에 걸쳐 연결됩니다.

테이블은 255 개 이상의 열은 열 255 이후의 데이터가 가능성있는 행이

은 동일 블록 내 체인을한다. 이를 내부 블록 체인이라고합니다. 체인 된 행의 조각은 행의 행을 사용하여 함께 연결됩니다. 인트라 블록 체이닝을 사용하면 사용자는 동일한 블록에있는 모든 데이터 을 수신합니다. 행이 나머지 블록 을 검색하는 데 추가 조작이 필요하지 않으므로 행이 블록에 맞으면 사용자는 I/O 성능에서 효과를 볼 수 없습니다.

그러나 400 열이있는 경우, I 대부분의 행이 한 블록에 맞지 않는 내기 것이며, 따라서 당신은 더 많은 일반적으로 요구되는 것보다 'DB 파일의 순차적 읽기'가 표시됩니다. 또한 스티브 아담스 (또는 누군가 오래 전)는 열을 액세스하는 데 추가 비용이 들었다는 것을 기억하십시오. "목록 아래로 내려 가기"- 죄송합니다. 링크가 있습니다.

+0

MS Sql에도이 사항이 적용됩니까? – ilivewithian

2

성능 문제와 상관없이 쿼리의 모든 필드를 항상 열거하는 것이 좋습니다.

  • 향후 특정 쿼리에 사용되는 TEXT 또는 BLOB 열을 추가하려는 경우 어떻게해야합니까?SELECT *는 필요에 따라 추가 데이터를 반환합니다.
  • 열의 이름을 변경하면 어떻게됩니까? SELECT *는 항상 작동하지만 의존 코드는 깨집니다.
0

올바른 방법과 최적의 방법입니다. 이유는 필요한 데이터 만 수집하므로 결과를 얻기 전에 데이터를 저장하는 데 올바른 공간 (필요한 것)을 차지하기 때문입니다.

SELECT Id, Forename, Surname 
FROM Person 
WHERE PersonName Like(‘%frank%’) 

결과를 느리게하는 쿼리를 실행하기 위해 더 많은 공간을 차지하는 사용되지 않는 필드를 차지하므로 잘못된 방법입니다. 운이 좋으면 쿼리의 모든 필드를 사용하더라도 개별적으로 나열하는 것이 가장 좋습니다. 이렇게하면 쿼리가 명확 해지고 앞으로 쿼리를 수정해야하는 다른 개발자에게 어떤 데이터가 반환되는지 알 수 있습니다. 작은 프로젝트의 경우

SELECT * 
FROM Person 
WHERE PersonName Like(‘%frank%’) 
2

, 일반적으로 select * 멀리 얻을 수 있습니다. 그래도 그렇게하지 않는 것이 옳다. 인덱스가 아닌 쿼리에서 한 테이블에 대한 속도 차이를 눈치 채지 못할 것입니다. 읽지 않은 열에 대해 더 많은 대역폭을 사용하고있는 것입니다.

즉, 색인 만 필요로 할 때 전체 표를 치는 색인 전용 검색어의 차이를 알 수 있습니다. 조인 할 때 특히 잘립니다.

Select *에는 사용 방법이 있지만, 올바르게 사용하면 (예 : 캐시와 조합하여 select table.*인지 확인하고 결과를 열 이름으로 지정) 애플리케이션에서 작성한 쿼리를 줄일 수 있습니다.

5

나는 여기의 흐름에 반하여 선택 *을해야한다고 말한다. 조숙 한 최적화는 많은 문제의 뿌리라고 생각합니다. 실제 활용에 도달하면 성능에 영향을 미치지 않을 수도 있습니다. 물론, 책에 의하면 더 느리고, 그렇다고해서 반드시 차이가 중요하다는 것을 의미하지는 않습니다.

SQL 엔진 (MS-SQL은 확실하게)이 select *를 캐쉬하기 때문에, 준비된 명령문이나 뷰나 스토어드 프로 시저를 사용하고 있다면, 테이블 스키마를 변경하면 뷰 또는 sp가 다시 컴파일되지 않으면 변경 사항이 적용되지 않으므로 이러한 쿼리를 동적으로 실행하지 않는 경우 뷰 또는 sp가 재 컴파일되지 않는 것이 좋습니다.

물론 데이터베이스 엔진에 따라 다르므로 히트가 분명히 크지 않은지 확인하기 위해 약간의 부하 테스트가 필요합니다.

0

내가 "select *"를 사용하는 유일한 시간은 특히 정말 "select *"

되지 이벤트 :

select count(*) from table

되어 있지 같은

select count(ID) from table

는 AS 먼저 테이블의 행 수를 반환합니다.
두 번째 행은 NOT NULL ID 값을 가진 행 수를 반환합니다.

미묘한 차이가 있지만 기억해야 할 가치가 있습니다.

+0

EXISTS 절의 하위 쿼리에 SELECT *를 사용할 수 있습니다. – onedaywhen

0

SELECT *는 더 많은 데이터를 전송해야하기 때문에 속도가 느려집니다. 또한 이미 언급 된 다른 이유 때문이기도합니다. 더 많은 열을 추가하기 시작하면 테이블을 조인 할 때 정말로 문제가됩니다. 실제로 할 일은 조인이므로 필터링 할 수 있습니다.

당신이 정말로 * 사용하려는 경우, 데이터가 반환의 *

... 사람으로부터 양을 좁힐 것이다. SELECT 사람처럼 당신이 모든 열에서 원하는 테이블을 지정하고 조금 있습니다 더 읽기 쉽습니다.

0

악마 옹호자를 플레이하고 SELECT *가 더 나은 선택 인 시나리오를 제안합시다. 데이터 집합의 결과를 가져 와서 테이블이나 표 형태로 표시하는 사용자 인터페이스를 만드는 경우를 가정 해보십시오. 데이터 세트의 열과 일치하도록 UI에 열을 작성하고 SELECT * FROM MyView를 수행 할 수 있습니다.

데이터베이스의보기를 사용하면 쿼리에서 반환하는 열을 완벽하게 제어 할 수 있으며 UI는 모든 열을 표시 할만큼 충분히 동적입니다. 보기에 대한 변경 사항은 다시 컴파일하지 않고 UI에 즉시 반영됩니다. re0 분명히 이전 조언을 따르고보기 정의의 모든 열을 지정하는 것이 좋습니다.

가끔씩 사람들이 특정 규칙을 따르고 그 맥락을 잊어 버리는 것에 대해 독단적으로 생각하기 때문에 나는 그것을 추가 할 것이라고 생각했습니다.

관련 문제