2013-04-25 3 views
2

저는 SQL Server를 처음 사용하기 때문에이 큰 테이블을 사용하여이 문제가 발생했습니다.이 테이블은 다소 어색한 방법으로 구현되었습니다. 여기에 디자인이SQL Server의 열에서 값 검색 최적화

표 우리는 필드의 일부가되는과의 거래의 기록이 테이블 A로 진행되는

itemID uniqueidentifier PK 
name vchar(32) 
datecreated datetime 
dateprocessed datetime 
datereviewed datetime 
approvalstatus int 
workflowstatus int 

표 B

fieldID uniqueidentifier PK 
itemID uniqueidentifier FK(referencing table A's itemID) 
name vchar(32) 
value vchar(32) 

모양을 요약 사진입니다 테이블 A에있는 트랜잭션에 대해 AccountNumber이라고 말한 것과 같이, name = accountnumber 및 value = '[실제 계정 번호]'인 테이블 B에 필수 i가있는 채로 채워집니다 temid. 이제 테이블 B는 매우 커서 뷰를 사용하는 특정 트랜잭션에 대한 계정 번호 쿼리가 영원히 필요합니다.

이 모든 이름 열은 이전에 표 A에 있었지만 항상 변경되어야하는 비즈니스 요구 사항으로 인해 더 많은 열을 추가해야 팀이이 방법으로 구조를 만들었고 새로운 필드를 추가하면 표 A에 새 열을 추가 할 필요가 없었습니다.

이 표를 최적화하는 가장 좋은 방법은 무엇입니까?

+0

자세한 정보를 추가하십시오. 특히 정보를 최적화하는 데는이 정도의 정보를 제공하는 것이 좋습니다. 예 :나는 "accountnumber"와 "transaction"또는 그들의 값 anywere을 보지 못한다. 왜 나는 당신이 테이블 B에서 "실제 계좌 번호"를 찾아야하는지 알지 못한다 - 당신이 간행 한 정보에서 그것은 간단한 'insert 'command ... –

+0

@market 테이블 A는 남은 필드가 테이블 B에 삽입되는 이유 중 일부입니다. 테이블 b는 이제 매우 커서 테이블 B에 삽입 된 다른 필드를 기반으로 검색하는 데 영원히 걸립니다 테이블 B에 삽입 된 일부 필드의 이름 값이 2 인 테이블을 깨는 것 같습니다. – kolexinfos

+1

입니다. 이 경우,이 모델을 유지함으로써 "고품질 최적화"를 수행 할 수 없습니다. 당신이해야 할 일은 DB (유일한 좋은 해결책이 될 것입니다)를 재 설계하거나 "빠져 나오기"에 빠르거나 더러운 것입니다 : EAV 테이블에 정의 된 ID 인 tableB에 새로운 키 필드를 도입하여 [name ] 필드의 "유형". 따라서 EAV는 "AccountNumber = 1, Transaction = 2, etc."와 같습니다. 이렇게하면 TableB에서 검색을 시작하기 전에 많은 레코드를 필터링 할 수 있습니다. –

답변

1

동료가 만든 항목은 EAV (Entity Attribute Value) 저장소입니다. 나는 그것들이 사악한 것들인지 아닌지는 제쳐두고 떠날 것이다.

간단히 대답하면 쿼리를 최적화 할 수 없습니다.

대답은 다음과 같습니다. 테이블 B의 AV에있는 (인덱싱 된) 유형 필드를 던져 더 효율적으로 작업 할 수 있습니다.

저장하는 항목에 따라 다소 관련있는 옵션은 트리거를 사용하여 추가 입력 필드를 유지하고 후자를 색인화하는 것일 수 있습니다. 예를 들어, 트리거는 int 유형을 갖는 것으로 표시된 필드의 정수 값을 보유하는 int 필드를 유지 관리 할 수 ​​있습니다.

그렇다고해도 이러한 솔루션을 사용하면 성능이 크게 향상 될 것입니다. 그렇다고해도 불필요한 조인 작업을 많이 수행 할 것이기 때문입니다. 그리고이 두 가지 트릭 모두 오버 헤드 (인덱스 유지와 관련된 추가 디스크 공간 + 시간)를 추가한다는 것을 명심하십시오.

정답은 EAV 상점에만 메타 정보를 저장하는 데 사용해야합니다.

메타를 사용하면 매우 선택적으로 쓰는 대신 where 절을 거의 사용하지 않습니다.

즉, where 절, join 절, order by 절 등과 같이 자주 쿼리되는 키 필드를 확인합니다. 다시 테이블 A로 이동하고 인덱스를 적절하게 만듭니다.

테이블 A에서 대부분/모든 행에있는 물건을 이동하는 것도 고려하십시오. 이동하는 각 입력란은 더 이상 테이블 B의 name 필드가 필요 없기 때문에 공간을 절약 할 수 있습니다. 적절한 형식의 데이터를 보너스로 받게됩니다.

관련 문제