"표에서 * 선택"이 나쁜 습관으로 간주되는 이유


96

어제 나는 "취미"프로그래머 (나 자신은 전문 프로그래머이다)와 논의하고 있었다. 우리는 그의 작업 중 일부를 발견했으며, 그는 항상 데이터베이스의 모든 열 (운영 서버 / 코드의 / 서버)을 쿼리한다고 말했습니다.

나는 그렇게하지 말라고 설득했지만 아직 성공하지는 못했다. 제 생각에는 프로그래머는 "예쁜", 효율성 및 트래픽을 위해 실제로 필요한 것을 쿼리해야합니다. 내 견해에 착각하고 있습니까?


1
테이블 내용이 바뀌면 어떻게 될까요? 열을 추가 / 제거 하시겠습니까? 여전히 * ..를 선택하면 필요한 것보다 많은 데이터를 가져 오거나 누락시킬 수 있습니다.
JF it

2
@JFit 그것의 일부이지만 전체 이야기와는 거리가 멀다.
14시 37 분


6
그리고 여기에 좋은 이유가 있습니다. 왜 select *가 유해한 것으로 간주됩니까?
Ellie Kesselman

@gnat 질문은 실제로 닫힌 질문의 복제본으로 간주 될 수 있습니까? (즉, 폐쇄 하나는 처음에 정말 적합하지 않았기 때문에)
gbjbaanb

답변:


67

돌아 오는 내용과 코드의 변수에 어떻게 바인딩하는지 생각해보십시오.

이제 누군가가 직접 사용하지 않는 열을 추가하거나 제거하기 위해 테이블 ​​스키마를 업데이트하면 어떻게 될지 생각하십시오.

코드 쿼리를 작성할 때가 아니라 직접 쿼리를 입력 할 때 select *를 사용하는 것이 좋습니다.


8
열을 순서대로 원하는 이름으로 다시 가져 오는 편의성보다 성능, 네트워크로드 등이 훨씬 중요합니다.

21
@jwenting 정말? 성능이 정확성보다 중요합니까? 어쨌든 원하는 열만 선택하는 것보다 "select *"가 더 나은 성능을 보지 못합니다.
gbjbaanb

9
@Bratch는 실제 프로덕션 환경에서 동일한 테이블을 사용하는 수백 개의 응용 프로그램이있을 수 있으며 모든 응용 프로그램을 올바르게 유지할 수있는 방법은 없습니다. 당신은 정서가 정확하지만 실제로는 논란이 실제로 일한다는 사실 때문에 논쟁이 실패합니다. 활성 테이블에 대한 스키마 변경은 항상 발생합니다.
user1068

18
이 답변의 요점을 이해하지 못합니다. 테이블에 열을 추가하면 SELECT * 및 SELECT [Columns]가 모두 작동하지만, 유일한 차이점은 코드가 새 열에 바인딩해야하는 경우 SELECT [Columns]는 수정해야한다는 것입니다. SELECT *는하지 않습니다. 테이블에서 열이 제거되면 바인딩 *에서 SELECT *가 중단되고 쿼리가 실행될 때 SELECT [열]이 중단됩니다. 테이블을 변경하면 바인딩 변경 만하면되므로 SELECT * 가보다 유연한 옵션 인 것 같습니다. 뭔가 빠졌습니까?
TallGuy

11
그런 다음 @gbjbaanb는 이름으로 열에 액세스합니다. 쿼리에서 열 순서를 지정하지 않으면 다른 모든 것이 어리 석습니다.
immibis

179

스키마 변경

  • 순서로 가져 오기 --- 코드가 데이터를 가져 오는 방법으로 열 #을 가져 오는 경우 스키마를 변경하면 열 번호가 다시 조정됩니다. 이것은 응용 프로그램을 엉망으로 만들고 나쁜 일이 발생합니다.
  • 이름으로 가져 오기 --- 코드가와 같은 이름으로 열을 가져오고 foo있고 쿼리의 다른 테이블이 열을 추가 foo하면 올바른 foo 열 을 가져 오려고 할 때 문제가 발생할 수 있습니다 .

어느 쪽이든 스키마 변경으로 인해 데이터 추출에 문제가 발생할 수 있습니다.

사용중인 컬럼이 테이블에서 제거 되는지 추가로 고려 하십시오. 는 select * from ...결과 집합에서 데이터를 끌어하려고 할 때 여전히 오류가 밖으로 제외한 작동합니다. 열이 쿼리에 지정되면 쿼리 는 오류가 발생하고 대신 문제의 위치와 위치를 명확하게 표시합니다.

데이터 오버 헤드

일부 열에는 많은 양의 데이터가 연결될 수 있습니다. 다시 선택하면 모든 데이터 *를 가져옵니다 . 그렇습니다. 여기서 선택한 1000 행의 데이터는 필요하지 않은 추가 4 메가 ​​바이트의 데이터를 제공하지만 어쨌든 와이어를 통해 전송됩니다.varchar(4096)

스키마 변경과 관련하여 테이블을 처음 만들 때 해당 varchar가 존재하지 않을 수 있습니다.

의도를 전달하지 않음

다시 선택하여 *20 개의 열을 가져 오지만 그 중 2 개만 필요한 경우 코드의 의도를 전달하지 않습니다. 쿼리를 수행하는 쿼리를 볼 때 쿼리 select *의 중요한 부분이 무엇인지 모릅니다. 이 열을 포함시키지 않으면 서 다른 계획을 대신 사용하도록 쿼리를 변경할 수 있습니까? 쿼리가 반환하는 의도가 명확하지 않기 때문에 모르겠습니다.


이러한 스키마 변경 사항 을 조금 더 살펴 보는 일부 SQL 바이올린을 살펴 보겠습니다 .

먼저 초기 데이터베이스 : http://sqlfiddle.com/#!2/a67dd/1

DDL :

create table one (oneid int, data int, twoid int);
create table two (twoid int, other int);

insert into one values (1, 42, 2);
insert into two values (2, 43);

SQL :

select * from one join two on (one.twoid = two.twoid);

그리고 다시 얻을 열은 oneid=1, data=42, twoid=2,와 other=43.

이제 테이블 1에 열을 추가하면 어떻게됩니까? http://sqlfiddle.com/#!2/cd0b0/1

alter table one add column other text;

update one set other = 'foo';

그리고 같은 쿼리 내 결과는 이전이다 oneid=1, data=42, twoid=2,와 other=foo.

테이블 중 하나를 변경하면 a 값이 중단 select *되고 갑자기 'other'를 int에 바인딩하면 오류가 발생하고 이유를 알 수 없습니다.

대신 SQL 문이

select 
    one.oneid, one.data, two.twoid, two.other
from one join two on (one.twoid = two.twoid);

표 1로 변경해도 데이터가 중단되지 않았습니다. 해당 쿼리는 변경 전과 변경 후 동일하게 실행됩니다.


인덱싱

당신이 할 때 조건과 일치하는 모든 테이블을 형성하는 모든 행을 select * from당기는 입니다. 당신이 정말로 신경 쓰지 않는 테이블조차도. 이것은 더 많은 데이터가 전송됨을 의미하지만 스택 아래로 더 많은 성능 문제가 있습니다.

인덱스. (SO 관련 : select 문에서 인덱스를 사용하는 방법은 무엇입니까? )

많은 열을 철회하는 경우 데이터베이스 계획 최적화 프로그램 은 여전히 ​​모든 열을 가져와야하고 인덱스를 사용한 다음 쿼리의 모든 열을 가져 오는 데 더 많은 시간이 걸리므로 인덱스 사용을 무시할 있습니다. 완전한 테이블 스캔을 수행하는 것보다.

예를 들어 사용자의 성 (많은 일을하고 색인을 가지고있는)을 선택하는 경우 데이터베이스는 색인 만 스캔 ( postgres wiki index only scan , mysql full table scan vs full)을 수행 할 수 있습니다 인덱스 스캔 , 인덱스 전용 스캔 : 테이블 액세스 방지 ).

가능한 경우 인덱스에서만 읽기에 대한 약간의 최적화가 있습니다. 각 색인 페이지에서 정보를 더 빨리 가져올 수 있습니다. 정보를 덜 가져 오기 때문 select *입니다.에 대한 다른 모든 열을 가져 오지는 않습니다 . 인덱스 만 스캔하면 100 배 빠른 결과를 반환 할 수 있습니다 (출처 : Select *가 잘못되었습니다 ).

이것은 전체 인덱스 스캔이 훌륭하지만 여전히 전체 스캔이지만 전체 테이블 스캔보다 낫다는 것을 말하는 것은 아닙니다. select *성능을 저하 시키는 모든 방법을 쫓기 시작하면 새로운 것을 계속 찾으십시오.

관련 독서


2
@ 토니 동의합니다-그러나 내가 대답했을 때 (첫 번째) 나는이 질문이 너무 많은 토론과 논평을 일으킬 것이라고 생각하지 않았습니다! 명명 된 열에 대해서만 쿼리하는 것이 분명합니까?
gbjbaanb

3
열을 추가하여 모든 것을 나누는 것도 코드가 항상 하드 코딩 된 서 수가 아닌 이름으로 데이터 리더의 열에 액세스해야하는 좋은 이유입니다.
Julia Hayward

1
@gbjbaanb 그것은 나에게있다. 그러나 많은 사람들이 공식적인 배경 / 훈련없이 SQL 쿼리를 작성합니다. 그들에게는 분명하지 않을 수 있습니다.
Tonny

1
@Aaronaught 나는 색인 문제에 대한 추가 비트로 업데이트했습니다. 내가 잘못한 것에 대해 제기해야 할 다른 점이 select *있습니까?

3
와우, 받아 들여진 대답은 실제로 내가 아래로 표명 한 것을 설명하는 데 너무 나빴습니다. 이것이 허용되는 답변이 아니라는 사실에 놀랐습니다. +1.
Ben Lee

38

또 다른 관심사 : JOIN쿼리 인 경우 쿼리 결과를 연관 배열로 검색하는 경우 (PHP의 경우와 같이) 버그가 발생하기 쉽습니다.

문제는

  1. 테이블 foo에 열이 id있고name
  2. 테이블 bar에 열이 id있고 address,
  3. 그리고 당신의 코드에서 사용하고 있습니다 SELECT * FROM foo JOIN bar ON foo.id = bar.id

누군가가 테이블에 열 name을 추가하면 어떻게 될지 추측 bar하십시오.

이제 때문에 코드가 갑자기 제대로 작동이 중지됩니다 name열은 결과에 표시 두 번 하고 배열로 결과를 저장하는 경우, 두 번째 데이터는 name( bar.name) 첫 덮어 쓰게됩니다 name( foo.name)!

그것은 명백하지 않기 때문에 상당히 불쾌한 버그입니다. 알아내는 데 시간이 걸릴 수 있으며 테이블에 다른 열을 추가하는 사람이 바람직하지 않은 부작용을 예상 할 수있는 방법이 없습니다.

(진실한 이야기).

따라서을 사용하지 말고 *검색중인 열을 제어하고 적절한 경우 별명을 사용하십시오.


이 경우에는 괜찮습니다 (어쩌면 일종의 희귀 한 것으로 간주됩니다). 그러나 와일드 카드로 쿼리하여 동일한 열 이름에 대한 별칭을 추가하면 피할 수 있습니다 (대부분의 사람들은 아마 그렇게 할 것입니다).
베이컨

4
이론 상으로는 편의를 위해 와일드 카드를 사용하는 경우 존재하는 모든 열을 자동으로 제공하고 테이블이 커짐에 따라 쿼리를 업데이트하지 않아도됩니다. 각각의 모든 열을 지정하는 경우 SELECT절에 다른 열을 추가하기 위해 쿼리로 이동해야합니다 . 이름이 고유하지 않다는 것을 알 수 있습니다. BTW 데이터베이스가 큰 시스템에서는 그렇게 드물지 않다고 생각합니다. 내가 말했듯이, 한 번 PHP 코드의 큰 머드 볼 에서이 버그를 사냥하는 데 두 시간을 보냈습니다. 그리고 지금 또 다른 사례를 발견했습니다. stackoverflow.com/q/17715049/168719
Konrad Morawski

3
나는 지난주 한 시간 동안 컨설턴트 헤드를 통해 이것을 얻기 위해 노력했다. 그는 SQL 전문가가 될 예정이다 ... 한숨 ...
Tonny

22

대부분의 경우 모든 열을 쿼리하는 것이 완벽 할 수 있습니다.

항상 모든 열을 쿼리하는 것은 아닙니다.

실제로 데이터를 가져 와서 다시 전송하는 실제 비즈니스에 착수하기 전에 처리해야하는 열을 해결하기 위해 내부 메타 데이터를 둘러보아야합니다. 그것은 세계에서 가장 큰 오버 헤드는 아니지만 시스템 카탈로그는 병목 현상이 될 수 있습니다.

하나 또는 두 개만 원할 경우 여러 필드 를 철회하기 때문에 네트워크에 더 효과적입니다 . 누군가 [else]가 많은 텍스트 필드를 포함하는 수십 개의 추가 필드를 추가하면 처리량이 갑자기 바닥을 통과합니다. 명백한 이유는 없습니다. "where"절이 특히 좋지 않고 많은 행을 철회하는 경우 상황이 더 나빠질 수 있습니다. 이는 잠재적으로 네트워크를 가로 질러 길을 가로막는 많은 데이터입니다 (즉, 느려질 것입니다).

응용 프로그램에서 더 많은 작업을 수행하므로 관심이없는이 추가 데이터를 모두 가져 와서 저장해야합니다.

열 순서가 변경 될 위험이 있습니다. 좋아, 당신은 이것에 대해 걱정할 필요 가 없습니다 (그리고 당신 필요한 열만 선택해도 안됩니다 ). 그러나 당신이 한꺼번에 가져 가면 누군가 [else]는 테이블 내에서 열 순서를 재 배열하기로 결정합니다. , 신중하게 제작 된 CSV 내보내기는 복도로 내려가는 계정에 갑자기 명백한 이유없이 갑자기 다시 사라집니다.

BTW, 나는 위에서 "누군가 [다른 사람]"라고 말했습니다. 데이터베이스는 본질적으로 다중 사용자라는 것을 기억하십시오. 당신이 생각하는 그들에 대한 통제권이 없을 수도 있습니다.


3
나는 모든 열을 항상 쿼리하는 것이 스키마에 구애받지 않는 테이블 뷰 기능과 같은 것에 합법적이라고 생각합니다. 매우 일반적인 상황은 아니지만 내부 전용 도구와 관련하여 이러한 것이 편리 할 수 ​​있습니다.
supercat

1
@supercat 그것은 내가 생각할 수있는 "SELECT *"에 대한 유일하게 유효한 유스 케이스입니다. 그런 다음에도 쿼리를 "SELECT TOP 10 *"(MS SQL의 경우)로 제한하거나 "LIMIT 10"(mySQL)을 추가하거나 "WHERE ROWNUM <= 10"(Oracle)을 추가하는 것이 좋습니다. 이 경우 일반적으로 전체 내용보다 "어떤 열이 있고 일부 샘플 데이터"에 관한 것입니다.
Tonny

@Tonny : SQL Server는 기본 스크립트를 변경하여 TOP제한 을 추가했습니다 . 코드를 표시하고 쿼리를 처리하는 데 필요한만큼 코드를 읽는 것이 얼마나 중요한지 잘 모르겠습니다. 세부 사항을 모르지만 쿼리 응답이 다소 느리게 처리됩니다. 어쨌든, 나는 그것이 "적법하지 않다"고 말하는 것이 아니라 "... 훨씬 더 적법하다"고 말하는 것이 낫다고 생각합니다 . 기본적으로, 나는 합법적 인 사례를 사용자가 프로그래머보다 의미있는 것이 더 나은 아이디어를 갖는 사례로 요약했습니다.
supercat

@ supercat 나는 그것에 동의 할 수 있습니다. 마지막 문장에 넣는 방식이 정말 마음에 듭니다. 나는 그것을 기억해야한다.
Tonny

11

짧은 대답은 사용하는 데이터베이스에 따라 다릅니다. 관계형 데이터베이스는 필요한 데이터를 빠르고 안정적이며 원자 적 으로 추출 할 수 있도록 최적화되었습니다 . 큰 데이터 세트와 복잡한 쿼리에서는 SELECTing *보다 훨씬 빠르고 안전하며 '코드'측에서 조인과 동일합니다. 키-값 저장소에는 이러한 기능이 구현되지 않았거나 프로덕션에 사용할만큼 성숙하지 않을 수 있습니다.

즉, SELECT *로 사용중인 데이터 구조를 채우고 나머지 코드를 해결할 수는 있지만 확장하려는 경우 성능 병목 현상이 발생합니다.

가장 가까운 비교는 데이터 정렬입니다. quicksort 또는 bubblesort를 사용할 수 있으며 결과는 정확합니다. 그러나 최적화되지는 않으며 동시성을 도입하고 원자 적으로 정렬해야 할 때 문제가 발생합니다.

물론 SQL 쿼리를 수행 할 수 있고 JOIN이 무엇인지 모호한 프로그래머에게 투자하는 것보다 RAM과 CPU를 추가하는 것이 더 저렴합니다.


SQL을 배우십시오! 그렇게 어렵지 않습니다. 데이터베이스의 "원시"언어입니다. 강력합니다. 우아합니다. 그것은 시간의 시험을 견뎌냈습니다. 그리고 실제로 SQL 조인을 수행하는 데 부적합한 경우가 아니라면 데이터베이스의 조인보다 효율적인 "코드"쪽에 조인을 작성할 방법이 없습니다. "코드 조인"을 수행하려면 간단한 두 테이블 조인으로 두 테이블의 모든 데이터를 가져와야합니다. 또는 인덱스 통계를 가져오고이를 사용하여 조인하기 전에 가져올 테이블 데이터를 결정합니까? 그렇게 생각하지 않았다 ... 사람들이 데이터베이스를 올바르게 사용하는 법을 배우십시오.
Craig

@Craig : SQL은 관계형 데이터베이스 에서 널리 사용됩니다. 그러나 유일한 유형의 DB와는 거리가 멀지 만 더 현대적인 데이터베이스 접근 방식이 종종 NoSQL이라고 불리는 이유가 있습니다. : P 아무도 내가 아이러니를 많이하지 않으면 서 SQL을 "우아한"것으로 부르지 않을 것입니다. 관계형 데이터베이스에 관한 한 많은 대안보다 적습니다.
cHao

@cHao 저는 수십 년 동안 다양한 다른 유형의 데이터베이스를 잘 알고있었습니다 . Pick "nosql"데이터베이스는 영원히 사용되었습니다. "NoSQL"은 원격으로 새로운 개념이 아닙니다. ORM도 영원히 있었으며 항상 느 렸습니다. 천천히! = 좋아. 우아함 (LINQ?)에 Customer customer = this._db.Customers.Where( “it.ID = @ID”, new ObjectParameter( “ID”, id ) ).First();대해서는 where 절에 대해 이것이 합리적이거나 우아하다고 확신 할 수 없습니다 . 2 페이지의 위반 시간 참조
Craig

@Craig : ORM을 시작하지 마십시오. 거의 모든 시스템이 그것을 끔찍하게 수행하며 추상화가 모든 곳에서 누출됩니다. 관계형 DB 레코드는 객체가 아니기 때문입니다 . 기껏해야 객체의 일부를 직렬화 할 수 있습니다. 하지만 LINQ는 정말 가고 싶습니까? SQLish와 동등한 것은 var cmd = db.CreateCommand(); cmd.CommandText = "SELECT TOP 1 * FROM Customers WHERE ID = @ID"; cmd.Parameters.AddWithValue("@ID", id); var result = cmd.ExecuteReader();.... 그런 다음 각 행에서 고객을 작성하는 것입니다. LINQ가 바지를 이겼습니다.
cHao

@Craig : 물론, 그다지 우아하지는 않습니다. 그러나 .net 코드를 SQL로 변환 할 때까지는 결코 우아하지 않을 것입니다. :) 어느 시점에서 말할 수 var customer = _db.Customers.Where(it => it.id == id).First();있습니다.
cHao

8

IMO는 명시 적이거나 암시 적입니다. 코드를 작성할 때 모든 부분이 거기에 있기 때문에 코드가 작동하기 때문에 코드가 작동하기를 원합니다. 모든 레코드를 쿼리하고 코드가 작동하면 계속 진행하는 경향이 있습니다. 나중에 무언가가 변경되고 코드가 작동하지 않으면 거기에 있어야 할 값을 찾는 많은 쿼리와 함수를 디버깅하는 데 큰 어려움이 있으며 유일한 값 참조는 *입니다.

또한 N 계층 접근 방식에서는 데이터베이스 스키마 중단을 데이터 계층으로 격리하는 것이 가장 좋습니다. 데이터 계층이 비즈니스 로직으로 전달되고 프레젠테이션 계층에서 가장 많이 전달되는 경우 디버깅 범위가 기하 급수적으로 확장됩니다.


3
이것은 아마도 가장 중요한 이유 중 하나이며 투표의 일부에 불과합니다. 흩어진 코드베이스의 유지 관리 성 select *이 훨씬 나쁩니다!
Eamon Nerbonne

6

테이블에 새 열이 있으면 필요하지 않은 경우에도 모든 열을 가져 오기 때문입니다. 함께 varchars이것을 DB에서 여행해야하는 추가 데이터를 많이 될 수 있습니다

일부 DB 최적화는 고정 길이 부분에 대한 액세스 속도를 높이기 위해 고정 길이가 아닌 레코드를 별도의 파일로 추출 할 수도 있습니다.


1

오버 헤드와는 별도로, 우선 피하고 싶은 것은 프로그래머로서 데이터베이스 관리자가 정의한 열 순서에 의존하지 않는다고 말할 수 있습니다. 필요한 경우에도 각 열을 선택합니다.


3
동의합니다. 어쨌든 열 이름으로 결과 집합에서 값을 가져 오는 것이 좋습니다.
Rory Hunter

둘째로, 나르십시오. 열 이름을 사용하고 열 순서에 의존하지 마십시오. 열 순서는 취성 종속성입니다. 이름은 실제 디자인 노력에서 파생되었거나 쿼리에서 복합 열 또는 계산 또는 충돌하는 열 이름을 명시 적으로 별칭으로 지정하고 지정한 명시 적 별칭을 참조해야합니다. 그러나 명령에 의존하는 것은 덕트 테이프와기도 일뿐입니다 ...
Craig

1

나는 당신이 그것을 빌드 목적으로 사용해서는 안되는 이유를 보지 못합니다-데이터베이스에서 모든 열을 검색하십시오. 세 가지 경우가 있습니다.

  1. 데이터베이스에 열이 추가되고 코드에서도 열이 필요합니다. a) *를 사용하면 적절한 메시지가 표시되지 않습니다. b) *가 없으면 작동하지만 예상 한 것을 수행하지 않습니다.

  2. 열은 데이터베이스에 추가되며 코드에서는 원하지 않습니다. a) *로 실패합니다. 이는 의미론이 "모두 검색"을 의미하므로 *가 더 이상 적용되지 않음을 의미합니다. b) *가 없으면 작동합니다.

  3. 열이 제거되었습니다. 코드는 어느 쪽이든 실패합니다.

이제 가장 일반적인 경우는 case 1입니다 (*를 사용했기 때문에 모든 것을 원할 것입니다). * 없이는 잘 작동하는 코드를 가질 수 있지만 적절한 오류 메시지와 함께 실패하는 코드보다 훨씬 최악의 코드는 예상대로 수행하지 않습니다 .

내 생각에 오류가 발생하기 쉬운 열 인덱스를 기반으로 열 데이터를 검색하는 코드는 고려하지 않습니다. 열 이름을 기준으로 검색하는 것이 훨씬 더 논리입니다.


전제가 잘못되었습니다. Select *응용 프로그램 개발 목적이 아닌 임시 쿼리의 편의를 위해 더욱 의도되었습니다. 또는 select count(*)쿼리 엔진이 인덱스 사용 여부, 사용할 인덱스 등을 결정하고 실제 열 데이터를 반환하지 않는 것과 같은 통계적 구성 에 사용합니다. 또는 같은 절에서 사용하기 위해 where exists( select * from other_table where ... )다시 쿼리 엔진에 가장 효율적인 경로를 선택하도록 초대하고 하위 쿼리는 기본 쿼리의 결과를 제한하는 데만 사용됩니다. 기타
Craig

@Craig SQL에 관한 모든 책 / 튜토리얼에 따르면 select *모든 열을 검색하는 의미가 있다고 생각 합니다. 귀하의 응용 프로그램에 실제로 이것이 필요한 경우 사용하지 않는 이유가 없습니다. select *빌드 의 목적 이 모든 열을 검색하는 것이 아니라고 언급 한 일부 참조 (Oracle, IBM, Microsoft 등)를 가리킬 수 있습니까 ?
m3th0dman

물론, select *모든 열을 검색하는 것이 편리합니다. 편의 쿼리는 임시 쿼리를위한 것입니다. 프로덕션 소프트웨어에서 좋은 아이디어가 아니기 때문입니다. 그 이유는이 페이지의 답변에서 이미 잘 설명되어 있습니다. 따라서 제가 직접 답을 만들지 않은 이유는 다음과 같습니다. •) 성능 문제, 사용하지 않는 네트워크를 통해 데이터를 반복적으로 마샬링 •) 쿼리 계획 최적화 실패 (일부 경우 인덱스 사용 실패), •) 제한된 선택 인덱스 등을 사용할 수있는 경우 비효율적 인 서버 I / O
Craig

어쩌면select * 실제 생산 애플리케이션에서 의 사용을 정당화하는 엣지 케이스가있을 수도 있지만 엣지 케이스 의 특성은 일반적인 경우 가 아닙니다 . :-)
Craig

@Craig 이유는 데이터베이스를 사용하지 않고 데이터베이스에서 모든 열을 검색하는 데 반대합니다 select *. 당신이 정말로 모든 컬럼을 필요로한다면 내가 말한 것, 왜 당신이 사용하지 말아야 할 이유가 없습니다 select *. 모든 열이 필요한 시나리오는 거의 없지만.
m3th0dman

1

이 방법으로 생각하십시오 ... 작은 문자열이나 숫자 필드가 몇 개있는 테이블에서 총 100k 데이터의 모든 열을 쿼리하는 경우. 나쁜 연습이지만 수행합니다. 이제 이미지 또는 10MB 단어 문서를 포함하는 단일 필드를 추가하십시오. 이제 필드가 테이블에 추가 되었기 때문에 빠른 수행 쿼리가 즉시 신비롭게 수행되기 시작합니다. 거대한 데이터 요소가 필요하지 않을 수도 있지만 Select * from Table어쨌든 가져 왔기 때문 입니다.


6
이것은 단지 몇 시간 전에 첫 번째 답변 과 몇 가지 다른 답변에서 이미 반복 된 점으로 보인다
gnat
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.