2010-08-02 4 views
5

가능한 중복 : 그것은 Select *을 사용하는 나쁜 관행
Which is faster/best? SELECT * or SELECT column1, colum2, column3, etc.SQL : 사용을 선택 *

인가?

나는 오래된 코드를 훑어보고 일부 'SELECT *'문장을 보았습니다. 저의 이전 동료는 Select *가 나쁜 습관이라고 말했지만, 왜 그런지 이유를 알 수 없었습니다 (물론 몇 필드 만 반환해야하는 경우는 제외). 하지만 전체 '세부 검색'(Id 형식 쿼리로 가져 오기) * 선택 오른쪽 보인다.

+0

자세한 내용이 필요하면'select *'를 사용하십시오. 특히 이름을 모를 세부 항목 열이 필요할 경우에는 사용하십시오. –

+2

아니요 @ Lou Franco, 그때조차 불쌍한 관행입니다. 앞으로 추가 될 내용을 알지 못합니다. 사용자가 볼 수 없도록 관리 목적으로 추가 된 열이있을 수 있습니다. select *를 사용하는 것은 항상 바람직하지 않습니다. 그리고 데이터베이스를 검색 할 필요가 없기 때문에 열을 정의하는 것이 일반적으로 성능면에서 더 좋습니다. 적어도 하나의 열이 복제되어 대역폭을 낭비하고 있음을 의미합니다. – HLGEM

답변

1

예, 좋지 않은 것으로 간주됩니다.

명시 적 열 목록을 지정하는 것이 더 좋습니다. 특히 테이블에 많은 열이 포함되어 있고 실제로는 그 중 일부만 필요로 할 경우 특히 그렇습니다.

0

당신이 후 오히려 그들을 지정하는 스키마 변경 (추가 열이 추가됩니다) 발생하면이이 응용 프로그램에 의해 체포됩니다

1

'* 선택'을 사용하는 것이 여전히 더 나은 모든 열을 선택해야하는 경우에도 마찬가지입니다. 예를 들어 그리드를 동적으로 DataTable에 바인딩하는 경우 이는 바람직하지 않을 수 있습니다. 또한 네트워크 통신에 더 많은 오버 헤드가 발생합니다.

오늘의 모든 열을 선택하는 경우에도 열을 이름 (읽기 가능 및 명시 적)으로 정의하십시오. 추가 열이 있으면 코드에 아무런 문제가 없습니다.

5

나쁜 습관입니다.

스키마가 변경되면 호출 응용 프로그램이 처리 할 수있는 것보다 많은 필드를 가져올 수 있습니다.

또한 성능에 영향을주는 정보가 필요 이상으로 많이 전달됩니다.

또한 열이 무엇인지 알지 못한다는 것을 의미합니다. 사용 SELECT *

+0

나는 이점을 거의 보았다. 필자는 테이블에 필드를 추가해야하고 이제는 Select를 사용하여 새 필드에 대한 SQL 쿼리를 변경하는 코드로 이동해야합니다. 변경하지 않아도됩니다. – mint

+1

@snow - 정말 하드 코드 된 SQL 대신에 그 물건을 호출하기 위해 저장된 procs를 사용해야 만합니다.이 경우 저장된 proc을 변경하면 모든 호출이 업데이트됩니다. – JNK

+0

@snow, 이것은 큰 단점입니다. 사용자가 볼 수 없도록하는 정보를 사용자에게 노출시킬 수 있습니다. 더 나아가 요요가 테이블의 열을 재배치하기로 결정한 경우 (예 : 바보가있는 바보가 있음) 이제는 성의 데이터를 이름 열로 삽입하고 그 반대의 경우도 마찬가지입니다. Selct *는 나쁘다. – HLGEM

4

는 두 가지 이유 나쁜 방법입니다 :

  • 그것은 대역폭
  • 사람이 열
을 추가하는 경우 그것은 당신의 코드를 깰 수를 낭비하고, 필요하지 않은 여분의 열을 반환 할 수 있습니다
2

예, 선택 *은 나쁜 습관입니다. 하나는 다른 개발자가 실제로 사용하고있는 열이 명확하지 않다는 것입니다. 당신은 실제로 그것들 모두를 사용하고 있습니까? 열을 추가하면 어떻게됩니까? 따라서 필요에 따라 열 이름을 리팩토링하는 것이 훨씬 더 어려워집니다. 둘째, 일부 데이터베이스 시스템에서 개체를 만들 때 존재 한 열을 기억하는 경우가 있습니다. 예를 들어 Select *를 사용하여 저장 프로 시저를 만드는 경우 테이블을 컴파일 할 때 테이블에있는 열에 베이크됩니다. 테이블이 변경되면 저장 프로 시저의 변경 사항을 반영하지 않습니다. 실제로 Select *를 게으름 이상으로 사용할 이유가 없습니다.

+0

나는 스토어드 프로 시저에서 select *를 사용하는 컬럼의 '베이킹'에 대해 들어 본 적이 없다. – mint

1

SELECT *을 사용하면 잠재적 인 유지 관리 생산성 (즉, 기본 쿼리가 변경되어 종속 코드/쿼리가 중단되는 경우)에 즉각적인 생산성 향상 (쿼리 작성 속도 향상)을 선택할 수 있습니다. 관행의 "불만"은 위험 관리 활동입니다.