성능 향상을위한 비정규 화? 설득력있는 것처럼 들리지만 물을 담지 않습니다.
박사 테드 커드와 회사의 관계형 데이터 모델의 최초 제안자이었다 크리스 날짜, 정상화에 대한 잘못된 정보 인수 인내심이 부족하고 체계적으로 과학적인 방법을 사용하여 철거 : 그는 대규모 데이터베이스를 가지고 및 테스트 이러한 주장을.
나는 그가 그것을 쓴 생각 관계형 데이터베이스 글 1988년부터 1991년까지 하지만이 책 이후의 버전을 여섯으로 압연 된 데이터베이스 시스템을 소개 하고, 내가 쓸 가능성이 남아으로 데이터베이스 이론 및 설계에 대한 최종 텍스트가 8 번째 판에서, 앞으로 수십 년 동안 인쇄되었습니다. Chris Date는 우리 대부분이 맨발로 뛰고있을 때이 분야의 전문가였습니다.
그는 그것을 발견했다 :
- 그들 중 일부는 특별한 경우를 위해 개최
- 그들 모두는 일반적인 사용을 위해 돈을 지불하지 않습니다
- 다른 특별한 경우에는 모두 심각하게 악화됩니다.
그것은 모두 작업 세트의 크기를 완화시키는 것으로 돌아옵니다. 인덱스를 올바르게 설정하여 올바르게 선택한 키와 관련된 조인 은 행이 구체화 되기 전에 결과 를 크게 정리할 수 있기 때문에 저렴하지 않습니다 .
결과를 구체화하는 것은 대량의 디스크 읽기를 포함하며, 이는 대량의 운동으로 가장 비싼 측면입니다. 반대로 조인을 수행하려면 논리적으로 키만 검색해야 합니다 . 실제로 키 값도 가져 오지 않습니다. 키 해시 값은 조인 비교에 사용되어 다중 열 조인의 비용을 줄이고 문자열 비교와 관련된 조인 비용을 크게 줄입니다. 캐시에 훨씬 더 적합 할뿐만 아니라 디스크 읽기가 훨씬 적습니다.
또한 우수한 옵티마이 저는 가장 제한적인 조건을 선택하고 조인을 수행하기 전에 적용하여 카디널리티가 높은 인덱스에서 조인의 높은 선택성을 효과적으로 활용합니다.
분명히이 유형의 최적화는 비정규 화 된 데이터베이스에도 적용 할 수 있지만 스키마를 비정규 화 하려는 사람들은 일반적으로 인덱스를 설정할 때 카디널리티에 대해 생각하지 않습니다.
테이블 스캔 (조인을 생성하는 동안 테이블의 모든 행을 검사)은 거의 드물다는 것을 이해하는 것이 중요합니다. 쿼리 최적화 프로그램은 다음 중 하나 이상이 보류 된 경우에만 테이블 스캔을 선택합니다.
- 관계에 200 개 미만의 행이 있습니다 (이 경우 스캔이 저렴함)
- 조인 열에 적합한 인덱스가 없습니다 (이 열에서 조인하는 것이 의미가있는 경우 인덱스되지 않은 이유는 무엇입니까?).
- 열을 비교하려면 유형 강제가 필요합니다 (WTF ?! 수정 또는 집으로 이동). ADO.NET 문제에 대한 최종 참고 사항 참조
- 비교의 인수 중 하나는 표현식입니다 (인덱스 없음)
작업 수행은 수행하지 않는 것보다 비용이 많이 듭니다. 그러나 잘못된 작업을 수행하고 무의미한 디스크 I / O로 강제 전환 한 다음 실제로 필요한 조인을 수행하기 전에 찌꺼기를 버리는 것은 훨씬 비쌉니다. "잘못된"연산이 사전 계산되고 인덱스가 현명하게 적용 되더라도 상당한 벌금이 부과됩니다. 수반되는 업데이트 이상에도 불구하고 조인을 사전 계산하는 비정규 화는 특정 조인에 대한 약속입니다. 당신이 필요한 경우 다른를 결합, 이러한 노력은 비용 것입니다 큰 .
누군가가 세상이 변하고 있음을 상기시키고 싶다면 gruntier 하드웨어의 더 큰 데이터 세트가 Date의 결과를 과장한다는 것을 알게 될 것입니다.
과금 시스템 또는 정크 메일 생성기 (부끄러운 일)에 종사하고 불완전하게 키보드로 손을 뻗어 모든 비정규 화가 더 빠르다는 사실을 알고 있습니다. 죄송합니다. 경우-특히, 모든 데이터를 순서대로 처리하는 경우 . 그것은 일반적인 경우가 아니다, 그리고 당신이 하는 전략 정당화.
당신은 그것을 잘못 일반화하는 것이 정당 하지 않습니다 . 데이터웨어 하우징 시나리오에서 비정규 화를 적절하게 사용하는 방법에 대한 자세한 정보는 참고 섹션 끝을 참조하십시오.
나는 또한 응답하고 싶습니다
조인은 립글로스가있는 직교 제품입니다.
볼록의 짐. 제한은 가능한 한 빨리 적용되며 가장 제한적인 것부터 적용됩니다. 당신은 이론을 읽었지만 이해하지 못했습니다. 조인은 쿼리 최적화 프로그램에 의해서만 "조건자가 적용되는 카티 전 곱" 으로 처리 됩니다 . 옵티마이 저는 모든 등가 변환을 생성하고 비용과 선택 성별로 순위를 매겨 최상의 쿼리 계획을 선택할 수 있도록 기호 분해 (실제로 정규화)를 나타냅니다.
옵티마이 저가 데카르트 제품을 생성하게하는 유일한 방법은 술어를 제공하지 않는 것입니다. SELECT * FROM A,B
노트
David Aldridge는 중요한 추가 정보를 제공합니다.
실제로 인덱스 및 테이블 스캔 외에도 다양한 다른 전략이 있으며, 현대 옵티마이 저는 실행 계획을 생성하기 전에 모든 비용을 지불합니다.
실용적인 조언 : 외래 키로 사용할 수 있다면 색인화 하여 옵티마이 저가 색인 전략을 사용할 수 있도록하십시오.
예전에는 MSSQL 옵티 마이저보다 똑똑했습니다. 그것은 두 가지 버전으로 변경되었습니다. 이제는 일반적으로 저를 가르칩니다 . 매우 실제적인 의미에서 전문가 시스템으로, 규칙 기반 시스템이 효과적이라는 영역에서 충분히 영리한 사람들의 모든 지혜를 체계화하고 있습니다.
"볼록"은 재치가 없었을 것입니다. 나는 덜 거만 해지고 수학은 거짓말을하지 않는다는 것을 상기시켰다. 이것은 사실이지만 수학적 모델의 모든 의미가 반드시 문자 그대로 취해 져야하는 것은 아닙니다. 음수의 제곱근은 부조리 검사를 조심스럽게 피하고 방정식을 해석하려고 시도하기 전에 모두 제거 해야하는 경우 매우 편리합니다.
내가 너무 야만적으로 반응 한 이유는
조인 은 직교 제품입니다 ...
이 의미가 있었는지하지 않을 수 있지만 입니다 쓰여진 것, 그것은 절대적으로 사실입니다. 직교 곱은 관계입니다. 조인은 함수입니다. 보다 구체적으로, 조인은 관계 값 함수입니다. 빈 술어를 사용하면 데카르트 제품이 생성되며,이를 확인하는 것은 데이터베이스 쿼리 엔진에 대한 하나의 정확성 점검이지만, 교실 밖에서는 실질적인 가치가 없기 때문에 제약이없는 조인을 작성하는 사람은 아무도 없습니다.
독자들이 모델과 모델을 혼동하는 고대 함정에 빠지는 것을 원하지 않기 때문에 이것을 호출했습니다. 모델은 편리한 조작을 위해 의도적으로 단순화 된 근사치입니다.
테이블 스캔 조인 전략 선택 컷오프는 데이터베이스 엔진마다 다를 수 있습니다. 트리 노드 채우기 팩터, 키-값 크기 및 알고리즘의 미묘 성과 같은 많은 구현 결정의 영향을 받지만 광범위하게 말하는 고성능 인덱싱의 실행 시간은 k log n + c 입니다. C 용어는 대부분 설정 시간으로 이루어진 고정 된 오버 헤드이며 곡선 모양은 n 이 수백이 될 때까지 선형 검색과 비교할 때 보상을받지 못한다는 것을 의미합니다 .
때로는 비정규 화가 좋은 생각입니다
비정규 화는 특정 조인 전략에 대한 약속입니다. 앞에서 언급했듯이 이는 다른 조인 전략을 방해 합니다. 그러나 디스크 공간, 예측 가능한 액세스 패턴 및 그 일부 또는 전부를 처리하려는 경향이있는 경우, 조인 사전 계산은 매우 가치가 있습니다.
작업에서 일반적으로 사용하는 액세스 경로를 파악하고 해당 액세스 경로에 대한 모든 조인을 사전 계산할 수도 있습니다. 이것은 데이터웨어 하우스의 전제입니다. 최소한 유행어 규정 준수를 위해서가 아니라 자신이하는 일을하는 이유를 아는 사람들이 구축 한 것입니다.
올바르게 설계된 데이터웨어 하우스는 정규화 된 트랜잭션 처리 시스템에서 대량 변환으로 주기적으로 생성됩니다. 이러한 운영 및보고 데이터베이스의 분리는 OLTP와 OLAP (온라인 트랜잭션 처리, 즉 데이터 입력 및 온라인 분석 처리, 즉보고) 사이의 충돌을 없애는 매우 바람직한 효과를 갖습니다.
여기서 중요한 점은주기적인 업데이트 외에 데이터웨어 하우스는 읽기 전용이라는 것 입니다. 이로 인해 업데이트 이상 문제가 발생합니다.
OLTP 데이터베이스 (데이터 입력이 발생하는 데이터베이스)를 비정규 화하는 실수를 저 지르지 마십시오. 청구 실행이 더 빠를 수 있지만 그렇게하면 업데이트 이상이 발생합니다. Reader 's Digest가 당신에게 물건 보내기를 멈추도록 시도한 적이 있습니까?
요즘에는 디스크 공간이 저렴하기 때문에 스스로를 쓰러 뜨리십시오. 그러나 비정규 화는 데이터웨어 하우스에 대한 이야기의 일부일뿐입니다. 훨씬 더 큰 성능 향상은 사전 계산 된 롤업 값 (매월 총계, 그런 종류)에서 비롯됩니다. 그건 항상 작업 세트를 줄여 대해.
형식이 일치하지 않는 ADO.NET 문제
varchar 유형의 인덱스 열이 포함 된 SQL Server 테이블이 있고 AddWithValue를 사용하여이 열에 대한 쿼리를 제한하는 매개 변수를 전달한다고 가정합니다. C # 문자열은 유니 코드이므로 유추 된 매개 변수 유형은 NVARCHAR이며 VARCHAR과 일치하지 않습니다.
VARCHAR에서 NVARCHAR 로의 변환은 광범위하게 변환되므로 암시 적으로 발생하지만 인덱싱에 작별 인사를하고 이유를 알아내는 것이 좋습니다.
"디스크 적중 횟수 계산"(Rick James)
모든 것이 RAM에 캐시되면 JOINs
다소 저렴합니다. 즉, 정규화에는 많은 성능 저하 가 없습니다 .
"정규화 된"스키마가 JOINs
디스크에 많이 충돌하지만 동등한 "비정규 화 된"스키마가 디스크에 충돌하지 않아도되면 비정규 화가 성능 경쟁에서 승리합니다.
원래 작성자의 의견 : 최신 데이터베이스 엔진은 조인 작업 중 캐시 누락을 최소화하기 위해 액세스 순서를 구성하는 데 매우 능숙합니다. 위의 내용은 사실이지만 조인은 반드시 큰 데이터에서 문제가 발생한다는 것을 암시하는 것으로 잘못 해석 될 수 있습니다. 이로 인해 경험이 부족한 개발자는 잘못된 의사 결정을 내릴 수 있습니다.