IT

쿼리에서 고유하게 사용해야 합니까?

itgroup 2023. 7. 7. 18:56
반응형

쿼리에서 고유하게 사용해야 합니까?

제가 일하는 곳에서 최근에 당신의 질문에 구별되는 것을 사용하는 것은 프로그래머의 나쁜 징조라고 들었습니다.그래서 저는 이 기능을 사용하지 않는 유일한 방법은 그룹 by를 사용하는 것이라고 생각합니다.

제가 알기로는, 독자적인 기능은 읽는 방법을 제외하고는 그룹과 매우 유사하게 작동합니다.개별 기능은 각 개별 선택 기준과 동일한 작업을 전체적으로만 수행하는 그룹을 비교하여 확인합니다.

저는 보고만 한다는 것을 명심하세요.데이터를 생성/변경하지 않습니다.따라서 제 질문은 차별화되거나 그룹화된 모범 사례를 사용해야 하는지에 대한 것입니다.둘 다 아니라면 대안이 없습니다.그룹 바이는 여기 있는 실제가 아닌 예보다 더 복잡한 쿼리에서 사용되어야 할지도 모릅니다. 하지만 여러분은 이해하실 수 있습니다.쿼리에서 고유하게 사용해야 하는 이유 또는 그렇지 않은 이유를 설명하는 답변을 찾을 수 없습니다.

select distinct
    spriden_user_id as "ID",
    spriden_last_name as "last",
    spriden_first_name as "first",
    spriden_mi_name as "MI",
    spraddr_street_line1 as "Street",
    spraddr_street_line2 as "Street2",
    spraddr_city as "city",
    spraddr_stat_code as "State",
    spraddr_zip as "zip"
from spriden, spraddr
where spriden_user_id = spraddr_id
and spraddr_mail_type = 'MA'

select
    spriden_user_id as "ID",
    spriden_last_name as "last",
    spriden_first_name as "first",
    spriden_mi_name as "MI",
    spraddr_street_line1 as "Street",
    spraddr_street_line2 as "Street2",
    spraddr_city as "city",
    spraddr_stat_code as "State",
    spraddr_zip as "zip"
from spriden, spraddr
where spriden_user_id = spraddr_id
and spraddr_mail_type = 'MA'
group by "ID","last","first","MI","Street","Street2","city","State","zip"     

데이터베이스는 사용자가 의미하는 바를 인식하는 데 유용합니다.저는 당신의 두 질문이 똑같이 잘 수행되기를 기대합니다.쿼리를 관리하는 다른 사용자가 사용자가 의미하는 바를 아는 것이 중요합니다.로 별개의을 찾으려 , 고한레를검의있도사는다용니합레를코드가유색코할을 사용하세요.DISTINCT집계를 수행하려는 의도가 있다면,GROUP BY

이 질문을 한 번 보세요.도움이 될 수 있는 몇 가지 좋은 대답이 있습니다.

@zedfoxus가 제공한 답변은 맥락을 이해하는 데 유용합니다.

그러나 데이터가 올바르게 설계된 경우 쿼리에 고유한 레코드가 필요하지 않다고 생각합니다.

테이블의 것 .spriden따라서 모든 데이터는 고유해야 합니다.당신은 또한 다음과 같은 일에 참여할 것입니다.spraddr테이블; 해당 테이블에 정말로 유효한 중복 데이터가 포함되어 있습니까?또는 이러한 중복 항목을 걸러내는 데 필요한 추가 조인 기준이 있습니까?

이것이 제가 "를 사용하는 것에 대해 긴장하는 이유입니다.distinct그 - 그spraddr데이터를 데될 수 " 이블에데이필테터는하데링다하있수니습포열함될이추가는용야"가 포함될 수 있습니다.distinct그걸 숨기고 있을지도 몰라요

또한 성능 문제를 일으킬 수 있는 "고유" 절로 필터링해야 하는 방대한 결과 집합을 생성할 수도 있습니다.를 들어, 들만어이 100행있에 .spraddr 행에대해의 각 spriden그리고 "is_current" 플래그를 사용하여 2개 또는 3개의 "실제" 플래그를 찾아야 합니다.

마지막으로, 저는 "group by"가 구별되는 대신 사용되는 것을 볼 때 긴장됩니다. 그것이 "잘못된" 것이 아니라, 스타일적으로, 저는 group by가 집계 함수에 사용되어야 한다고 믿기 때문입니다.그건 그냥 개인적인 취향일 뿐입니다.

를 들어 를들어예에서,distinct그리고.group by같은 일을 합니다.은 첫 , 할 수 의미라고 합니다.distinct또는group by 이 터 제 기 확 장 있 수 습 니 다 줄 절 일 중 을 복 중 데 복 거 능 을 터 이 하 여 icates ▁your ▁by ▁the ▁dupl ▁be ▁extending 절 ▁you 니있 ▁reduce ▁to 다 ▁maybe 데 중 습 ▁able 이 복join조건들.

왜 그것이 나쁜 관행인지 그들에게 물어봅니다.많은 사람들이 책의 첫 페이지나 구글 검색의 첫 번째 결과를 읽는 것으로부터 규칙을 만들거나 나쁜 관행이라고 생각되는 것들을 생각해냅니다.만약 그것이 일을 하고 문제를 일으키지 않는다면, 대안을 찾아 더 많은 일을 만들 이유가 없습니다.당신이 게시한 두 가지 옵션 중에서 저는 그것이 더 짧고 읽기 쉽고 유지하기 쉽기 때문에 구별해서 사용할 것입니다.

누가 당신에게 사용하라고 했든 간에DISTINCT나쁜 징조 그 자체가 잘못된 것입니다.실제로, 그것은 당신이 어떤 문제를 사용하여 해결하려고 하는지에 달려 있습니다.DISTINCT애당초

일부 필드 또는 필드 조합의 값이 반복될 것으로 예상되는 테이블을 쿼리하고 값 또는 값 조합의 목록을 보고하는 경우(이에 대해 집계를 수행하지 않는 경우),DISTINCT가장 합리적인 사용법입니다.제가 생각하기에 그것을 사용하는 것은 정말 말이 안 됩니다.GROUP BY가 생각하기 때문에.DISTINCT사용하면 안 됩니다.사실, 저는 이런 종류의 것이라고 생각합니다.DISTINCT용도로 설계되었습니다.

것으로 OTOH를 하면 안 됩니다.DISTINCT또는GROUP BY이 버그를 취소할 수 있습니다.오히려 당신은 버그의 원인을 파악하여 수정해야 합니다.

용사를 합니다.DISTINCT안전망은 잠재적으로 문제를 숨기고, 계산 비용이 많이 들 수 있기 때문에(일반적으로 O(n log n) 또는 O(n2)도 좋지 않습니다.이 시나리오에서는 다음을 사용할 수 없습니다.GROUP BY대신 당신을 도울 것입니다.

네, 디스트릭트는 누군가의 질문에 부딪히면 제 머릿속에 작은 알람을 일으키는 경향이 있습니다.물론 필요한 경우도 있지만 대부분의 데이터 모델에서는 필요하지 않습니다.그것은 그것을 사용해야 하는 최후의 수단이거나 특이한 경우인 경향이 있습니다.또한 데이터베이스 위에 있는 잘못된 응용프로그램으로 인해 중복 항목을 삽입하거나 업데이트할 수 있습니다(또한 마찬가지로 이러한 작업을 방지하기 위한 해당 데이터베이스 수준 제약 조건이 없습니다).그래서 가장 먼저 확인해야 할 것은 데이터입니다.데이터 모델 설계가 잘못되었다는 신호일 수 있습니다.그러나 중복 행이 남아 있는 선택 단계에서는 쿼리가 해당 단계에 도달하지 않아야 합니다.

큰 쿼리를 구성할 때, 일반적으로 고유 필드를 지정하는 하위 쿼리의 너겟으로 시작하고, 그 이후의 모든 하위 쿼리는 내부 조인 또는 왼쪽 조인해야 하지만 너겟 쿼리에 의해 이미 정의된 행 수를 추가하거나 줄이지 않습니다.그리고 왼쪽 조인의 가능한 NULL을 처리하는 것을 기억합니다.

예를 들어, 너겟 쿼리는 파티션을 사용하여 조인된 테이블의 가장 최근 행을 선택하거나 해당 단계에서 다른 그룹화를 수행할 수도 있습니다.

당신의 예에서는 중복을 기대하지 않을 것입니다.어떤 사람이 과거 주소를 가질 수 있다면, 좋아요. 하지만 모든 주소를 볼 필요가 있습니까? 아니면 최근 주소만 볼 필요가 있습니까? 그리고 같은 사람에 대해 중복 주소가 있다면, 그것은 데이터가 잘못 복제되었다는 것을 의미합니까? 아니면 그 사람이 주소를 떠났지만 나중에 다시 원래 주소로 돌아간다는 것을 의미합니까?이 경우 파티션 셀렉트는 구별되는 것보다 훨씬 더 나은 제어를 통해 문제를 해결합니다.특히 필드가 나중에 다른 사용자에 의해 쿼리에 추가되어 구분을 해제하는 경우.

즉, 다른 모든 데이터가 이 하위 쿼리 덩어리에서 중단됩니다.가능한 다른 필드를 핵심 필드 집합의 오른쪽에 붙입니다.

구별이 마지막 수단인 경우 일반적으로 해당 테이블에 해당 필드 집합에 대한 중복 항목이 있는 것으로 알려진 데이터에 대해 예약됩니다.제 머릿속에는 특별한 것이 있지만, 특히 큰 결과 집합이 반환될 때 계획에서 느린 사후 선택 과정입니다.나는 조만간 그것을 확인해야 합니다.

쿼리가 올바르면 DISTINCT 및 GROUP BY는 동일한 결과 집합을 제공하지만 DISTINCT가 문제를 숨긴다는 동료의 말은 맞습니다.가입이 누락되고 GROUP BY를 사용하는 경우 예상보다 많은 정보를 얻을 수 있습니다.조인이 누락되고 DISTINCT를 사용하는 경우 SQL 엔진은 제한되지 않은(또는 부분적으로 제한된) 조인을 수행하고 결과를 좁힌 다음 예상되는 답을 제시합니다.

필요한 것보다 더 많은 데이터를 생성하는 명백한 성능 저하 외에도 tempdb를 채울 위험이 있습니다(즉, tempdb가 있는 하드 드라이브의 공간이 부족함).

프로덕션에서 GROUP BY를 사용합니다.

언급URL : https://stackoverflow.com/questions/33651429/should-i-use-distinct-in-my-queries

반응형