복붙노트

[SQL] 왜 사용 '*'뷰 나쁜 구축?

SQL

왜 사용 '*'뷰 나쁜 구축?

왜 사용 '*'뷰 나쁜 구축?

당신이 복잡한이 가입하고 모든 필드가 사용되는 곳이 될 수 있음을 가정한다.

그럼 그냥 필요한 필드를 선택해야합니다.

SELECT field1, field2 FROM aview WHERE ...

뷰 "aview는"SELECT 표이 될 수 있습니다. * 표 2. * ... 표 INNER로부터 표 2를 가입 ...

이 개 필드는 표 1과 표 2에 같은 이름이있는 경우 우리는 문제가있다.

왜 '*'를 사용하여 뷰가 나쁜이 유일한 이유는?

'*'로 정보가이기 때문에, 당신은 다른 맥락에서보기를 사용할 수 있습니다.

나는 무엇을 놓치고?

문안 인사

해결법

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

    1.나는 "그냥 나쁜"입니다 소프트웨어에 많이 있다고 생각하지 않지만, 나쁜 방법으로 오용되는 물건의 많음이있다 :-)

    나는 "그냥 나쁜"입니다 소프트웨어에 많이 있다고 생각하지 않지만, 나쁜 방법으로 오용되는 물건의 많음이있다 :-)

    당신이주는 예는 * 당신이 기대하는 무엇을 제공하지 않을 수 있습니다 이유이고, 나는 다른 사람들이 있다고 생각합니다. 기본 테이블이 변경되면 예를 들어, 어쩌면 열, 용도는 * 계속 유효하지만, 그것을 사용하는 모든 응용 프로그램을 깰 수 있다는 전망을 추가 또는 제거된다. 보기가 명시 적으로 열을 명명 한 경우 스키마 변경을 할 때 누군가가 문제를 발견 것이 더 기회가 있었다.

    다른 한편으로는, 당신은 실제로 부주의에보기를 할 수 있습니다 기본 테이블에 대한 모든 변경 사항을 받아 들일 경우 A *는 것에 당신이 원하는 단지합니다.

    업데이트 : 영업 이익은 마음에서 특정 데이터베이스 공급 업체가 있다면 나도 몰라,하지만 내 마지막 말은 모든 종류의 성립하지 않습니다 지금은 분명하다. 나는이 밖으로 포인팅을위한 user12861와 조니 리즈 빚, 그리고 내 대답을 편집 죄송 그것은 6 년이 걸렸다.

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

    2.여기에 의견의 대부분은 기본 테이블 변경, 적용되지 않은 또 다른 문제는 최적화 경우 오류 또는 다른 결과를 야기 같은 쿼리에서 와일드 카드를 사용하여 매우 좋은 참고 하나의 공통된 문제이지만. 테이블의 모든 열을 끌어 쿼리는 끌수 만 열이 실제로 필요로하는 쿼리로 효율적으로 확실히하지 경향이있다. 설령 당신이 모든 열을 필요로 할 때, 그 시간이있다 그것은 특히 큰 테이블에, 그들 모두를 참조하는 데 중요한 PIA,하지만 당신은 단지 부분 집합을 필요로하는 경우, 왜 늪지 당신이 필요로하는 것보다 더 많은 열이 쿼리 아래.

    여기에 의견의 대부분은 기본 테이블 변경, 적용되지 않은 또 다른 문제는 최적화 경우 오류 또는 다른 결과를 야기 같은 쿼리에서 와일드 카드를 사용하여 매우 좋은 참고 하나의 공통된 문제이지만. 테이블의 모든 열을 끌어 쿼리는 끌수 만 열이 실제로 필요로하는 쿼리로 효율적으로 확실히하지 경향이있다. 설령 당신이 모든 열을 필요로 할 때, 그 시간이있다 그것은 특히 큰 테이블에, 그들 모두를 참조하는 데 중요한 PIA,하지만 당신은 단지 부분 집합을 필요로하는 경우, 왜 늪지 당신이 필요로하는 것보다 더 많은 열이 쿼리 아래.

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

    3.또 다른 이유는 왜 "*"보기에 있지만 쿼리에서뿐만 아니라, 위험, 열이 기본 테이블의 이름 또는 변경 위치를 변경할 수 있다는 것입니다. 보기를 변경할 필요없이 쉽게 변화를 수용하는 와일드 카드 수단을 사용. 반환 열 이름으로 키가 결과 세트를 당신이 동적 언어를 사용하지만 결과 집합에 위치하여 응용 프로그램 참조 열은, 또는, 당신은 디버깅하기 어려운 문제가 발생할 수 있다면.

    또 다른 이유는 왜 "*"보기에 있지만 쿼리에서뿐만 아니라, 위험, 열이 기본 테이블의 이름 또는 변경 위치를 변경할 수 있다는 것입니다. 보기를 변경할 필요없이 쉽게 변화를 수용하는 와일드 카드 수단을 사용. 반환 열 이름으로 키가 결과 세트를 당신이 동적 언어를 사용하지만 결과 집합에 위치하여 응용 프로그램 참조 열은, 또는, 당신은 디버깅하기 어려운 문제가 발생할 수 있다면.

    나는 항상 와일드 카드를 사용하지 마십시오. 열 이름을 변경하는 경우 그 방법은, 내가 바로보기 또는 쿼리에서 오류가 발생하고 그것을 해결하기 위해 어디 있는지. 열이위한 도면을 보정 또는 쿼리의 열 순서를 지정하여 기본 테이블의 위치를 ​​변경하는 경우.

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

    4.이 다른 답변은 모든 좋은 점을 가지고 있지만 SQL 서버에 적어도 그들은 또한 몇 가지 잘못된 점을 가지고있다. 이 시도:

    이 다른 답변은 모든 좋은 점을 가지고 있지만 SQL 서버에 적어도 그들은 또한 몇 가지 잘못된 점을 가지고있다. 이 시도:

    create table temp (i int, j int)
    go
    create view vtemp as select * from temp
    go
    insert temp select 1, 1
    go
    alter table temp add k int
    go
    insert temp select 1, 1, 1
    go
    select * from vtemp
    

    이 추가 될 때 SQL Server는 "새로운"컬럼에 대해 배울하지 않습니다. 당신이 좋은 일이나 나쁜 일이 될 수있다하려는 작업에 따라, 그러나 아마 좋지 않아 어느 쪽이든에 의존 할 수 있습니다. 피 그래서 그냥 좋은 아이디어처럼 보인다.

    나에게 이상한 행동은보기에 선택 *를 방지하는 가장 강력한 이유입니다.

    코멘트는 MySQL이 비슷한 동작을 가지고 있으며, 오라클은 (는 테이블에 대한 변경 사항에 대해 배우게됩니다)하지 않음을 가르쳐왔다. 나에게 이러한 불일치는 뷰에서 선택 *를 사용하는 모든 이유가 더있다.

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

    5.사용 '*'아무것도 생산하는 것은 좋지 않습니다. 그것은 일회성 쿼리에 큰하지만 생산 코드에 당신은 항상 가능한 명시 적으로해야한다.

    사용 '*'아무것도 생산하는 것은 좋지 않습니다. 그것은 일회성 쿼리에 큰하지만 생산 코드에 당신은 항상 가능한 명시 적으로해야한다.

    기본 테이블 열을 추가하거나 제거 할 경우 특히 뷰를 들어,보기 중 하나를 잘못하거나 다시 컴파일 될 때까지 파괴 될 것입니다.

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

    6.뷰 내에서 SELECT *를 사용하여 발생 많은 열이보기 외부에서 사용하지 않는 오버 헤드 경우 성능을하지 않습니다 - 옵티마이 저는 그들을 최적화; TheView SELECT * FROM 아마도 당신이 네트워크 연결을 통해 더 많은 열을 끌어 언제든지 같은 대역폭을 낭비 할 수 있습니다.

    뷰 내에서 SELECT *를 사용하여 발생 많은 열이보기 외부에서 사용하지 않는 오버 헤드 경우 성능을하지 않습니다 - 옵티마이 저는 그들을 최적화; TheView SELECT * FROM 아마도 당신이 네트워크 연결을 통해 더 많은 열을 끌어 언제든지 같은 대역폭을 낭비 할 수 있습니다.

    사실, 난 그 열 상대적으로 적은을 통해 전혀 성능 문제를 도입하지 않은 내 데이터웨어 하우스에 큰 테이블의 수에서 거의 모든 열을 연결 뷰, 뷰 외부에서 요청하는 것으로 나타났습니다. 잘 아주 잘보기에 아래로 외부 필터 기준을 밀어 수있는 최적화 핸들.

    모든 이유는 위에서 주어진에 대한 그러나, 나는 아주 드물게 SELECT *를 사용하지 않습니다.

    나는 열팽창 계수의 수를 효과적으로 (잘하면 언젠가는 사업 합리화로 리팩토링 이러한 계산을 단순화되는 것이다) 파생 열에서 생성 된 열에서 생성 된 열을 구축, 서로의 상단에 내장되어 일부 비즈니스 프로세스를 가지고 있고, 그 경우에 나는 각각의 시간을 통해 드롭 모든 열을해야하고, 나는 * SELECT를 사용 -하지만 SELECT *이 첫 번째 CTE와 마지막 사이에, 기본 계층에서 사용되지 않습니다.

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

    7.SQL Server의 상황은 실제로 @ user12861로 대답보다 더 나쁜 의미 : 쿼리 초기에 참조 된 테이블에 열을 추가, 여러 테이블에 대해 SELECT *를 사용하는 경우 실제로 아래에 새로운 열의 값을 반환하는보기의 원인이됩니다 이전 컬럼의 모습. 아래의 예를 참조하십시오 :

    SQL Server의 상황은 실제로 @ user12861로 대답보다 더 나쁜 의미 : 쿼리 초기에 참조 된 테이블에 열을 추가, 여러 테이블에 대해 SELECT *를 사용하는 경우 실제로 아래에 새로운 열의 값을 반환하는보기의 원인이됩니다 이전 컬럼의 모습. 아래의 예를 참조하십시오 :

    -- create two tables
    CREATE TABLE temp1 (ColumnA INT, ColumnB DATE, ColumnC DECIMAL(2,1))
    CREATE TABLE temp2 (ColumnX INT, ColumnY DATE, ColumnZ DECIMAL(2,1))
    GO
    
    
    -- populate with dummy data
    INSERT INTO temp1 (ColumnA, ColumnB, ColumnC) VALUES (1, '1/1/1900', 0.5)
    INSERT INTO temp2 (ColumnX, ColumnY, ColumnZ) VALUES (1, '1/1/1900', 0.5)
    GO
    
    
    -- create a view with a pair of SELECT * statements
    CREATE VIEW vwtemp AS 
    SELECT *
    FROM temp1 INNER JOIN temp2 ON 1=1
    GO
    
    
    -- SELECT showing the columns properly assigned
    SELECT * FROM vwTemp 
    GO
    
    
    -- add a few columns to the first table referenced in the SELECT 
    ALTER TABLE temp1 ADD ColumnD varchar(1)
    ALTER TABLE temp1 ADD ColumnE varchar(1)
    ALTER TABLE temp1 ADD ColumnF varchar(1)
    GO
    
    
    -- populate those columns with dummy data
    UPDATE temp1 SET ColumnD = 'D', ColumnE = 'E', ColumnF = 'F'
    GO
    
    
    -- notice that the original columns have the wrong data in them now, causing any datatype-specific queries (e.g., arithmetic, dateadd, etc.) to fail
    SELECT *
    FROM vwtemp
    GO
    
    -- clean up
    DROP VIEW vwTemp
    DROP TABLE temp2
    DROP TABLE temp1
    
  8. ==============================

    8.그것은 당신이 항상하지 않는 모든 변수를 필요로하기 때문에, 그리고 또한 당신이 특별히 필요에 대해 생각하는 것을 확인 할 수 있습니다.

    그것은 당신이 항상하지 않는 모든 변수를 필요로하기 때문에, 그리고 또한 당신이 특별히 필요에 대해 생각하는 것을 확인 할 수 있습니다.

    예를 들어 귀하의 사이트에 사용자의 목록을 구축 할 때 선택 *이 비생산적인 될 수 있도록 데이터베이스에서 모든 해시 된 암호를 받고 아무 소용이 없습니다.

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

    9.옛날 옛적에, 나는 함께 (동일한 서버에) 다른 데이터베이스의 테이블에 대한 뷰를 생성

    옛날 옛적에, 나는 함께 (동일한 서버에) 다른 데이터베이스의 테이블에 대한 뷰를 생성

    Select * From dbname..tablename
    

    그러던 어느 날, 열이 대상 테이블에 추가되었습니다. 이 재배치 될 때까지보기는 완전히 잘못된 결과를 반환하기 시작했다.

    완전히 잘못된 :은 행.

    이는 SQL 서버 2000했다.

    나는 내가 사용에도 불구하고,이 뷰 캡처했다고 때문에 SYSCOLUMNS 값의 것으로 추측 *.

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

    10.SQL 쿼리는 기본적으로 어떤 맥락에서 사용하기 위해 프로그래머가 설계 한 기능 단위입니다. 기능 단위의 장기 안정성과 (아마도 당신이 아닌 다른 사람에 의해) 지원 가능성 모두를위한 목적이 있어야하고, 거기에 이유를 합리적으로 분명 (또는 기록)이어야한다 - 데이터 특히 모든 요소.

    SQL 쿼리는 기본적으로 어떤 맥락에서 사용하기 위해 프로그래머가 설계 한 기능 단위입니다. 기능 단위의 장기 안정성과 (아마도 당신이 아닌 다른 사람에 의해) 지원 가능성 모두를위한 목적이 있어야하고, 거기에 이유를 합리적으로 분명 (또는 기록)이어야한다 - 데이터 특히 모든 요소.

    내가 필요로 지금부터 이년 함께 제공했다거나 쿼리를 변경하고자하는 경우, 나는 내가 엉망 수 있다는 것을 확신 할 것입니다 전에 아주 철저하게 grok 수 기대. 어느 나는 모든 열이 밖으로이라고 이유를 이해 할 필요가 의미합니다. (두 개 이상의 컨텍스트에서 쿼리를 다시 사용하려는 경우이 더욱 분명 사실이다. 일반적으로 문제가 어떤 비슷한 이유로.) 내가 어떤 목적으로 관련되지 수 출력에 열을 볼 수 있다면 나는 내가 무슨 짓을했는지 이해, 그리고 왜, 그리고 결과가 변경 될 것입니다 무엇을하지 않았다는 것을 확신 할 것입니다.

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

    11.그것은 일반적으로 사용 *에 나쁜 생각입니다. 일부 코드 인증 엔진은 경고로이를 표시하고 만 명시 적으로 필요한 열을 참조 할 것을 권고합니다. 당신이 아니라 모든 일부 컬럼 만 필요 하듯 *의 사용은 성능 louses로 이어질 수 있습니다. 그러나, 다른 한편으로는, *의 사용에 이상적입니다 경우가있다. 당신은 항상이 테이블의 모든 열을 필요이 뷰 (aview를) 제공 한 예제를 사용하여, 상관없이, 그 상상이 없습니다. 열이 추가 될 때 미래에, 당신은보기를 변경해야하지 않을 것입니다. 이것은 당신이 다루고있는 사건을 따라 좋고 나쁨이 될 수 있습니다.

    그것은 일반적으로 사용 *에 나쁜 생각입니다. 일부 코드 인증 엔진은 경고로이를 표시하고 만 명시 적으로 필요한 열을 참조 할 것을 권고합니다. 당신이 아니라 모든 일부 컬럼 만 필요 하듯 *의 사용은 성능 louses로 이어질 수 있습니다. 그러나, 다른 한편으로는, *의 사용에 이상적입니다 경우가있다. 당신은 항상이 테이블의 모든 열을 필요이 뷰 (aview를) 제공 한 예제를 사용하여, 상관없이, 그 상상이 없습니다. 열이 추가 될 때 미래에, 당신은보기를 변경해야하지 않을 것입니다. 이것은 당신이 다루고있는 사건을 따라 좋고 나쁨이 될 수 있습니다.

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

    12.나는 당신이 사용하는 언어에 따라 달라집니다 생각합니다. 나는 언어 나 DB 드라이버는 결과의 DICT (파이썬, 펄, 등) 또는 연관 배열 (PHP)을 반환 할 때 선택 *를 사용하는 것을 선호합니다. 그것은 당신이 이름 대신 배열의 인덱스로 컬럼을 참조하는 경우 이해하기 쉽게 작정 코드를 만든다.

    나는 당신이 사용하는 언어에 따라 달라집니다 생각합니다. 나는 언어 나 DB 드라이버는 결과의 DICT (파이썬, 펄, 등) 또는 연관 배열 (PHP)을 반환 할 때 선택 *를 사용하는 것을 선호합니다. 그것은 당신이 이름 대신 배열의 인덱스로 컬럼을 참조하는 경우 이해하기 쉽게 작정 코드를 만든다.

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

    13.아무도 그것을 언급 한 것 같다,하지만 SQL Server 내에서 당신은 또한 스키마 바인딩의 속성보기를 설정할 수 있습니다.

    아무도 그것을 언급 한 것 같다,하지만 SQL Server 내에서 당신은 또한 스키마 바인딩의 속성보기를 설정할 수 있습니다.

    뷰 정의에 영향을 미칠 것 (놓아 포함) 기본 테이블의이 방지 수정.

    이것은 어떤 상황에 대해 당신에게 유용 할 수 있습니다. 제가 정확히 질문에 대답하지 않은 것을 알지만 그럼에도 불구을 강조 거라 생각 했어요.

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

    14.당신이 선택 *를 사용하여 조인이있는 경우 자동으로이 필드를 조인이 반복되는 데이터로 필요한 것보다 더 많은 데이터를 반환하는 것을 의미한다. 이 데이터베이스 및 네트워크 자원의 낭비이다.

    당신이 선택 *를 사용하여 조인이있는 경우 자동으로이 필드를 조인이 반복되는 데이터로 필요한 것보다 더 많은 데이터를 반환하는 것을 의미한다. 이 데이터베이스 및 네트워크 자원의 낭비이다.

    당신이 그 (것)들에게 더 악화 공연을 할 수 선택 *을 사용하여 다른 뷰를 호출 뷰를 사용하는 순진 충분한 경우 (이것은 당신이 필요하지 않습니다 대해 여러 개의 열을 호출 자체의 성능에 대한 나쁜 기술은 훨씬 더하게하다)를.

  15. from https://stackoverflow.com/questions/262450/why-is-using-to-build-a-view-bad by cc-by-sa and MIT license