2013-08-28 2 views
4

자동 증가 ID 열이 기본 키로있는 테이블 X가 있습니다. 나는 테이블 X의 정보를 보완하는 다른 테이블 A, B, C 및 D를 가지고 있습니다. 이들 각각은 테이블 X의 ID를 참조하는 열을 포함해야합니다. 코드를 완료하고 코드 (Java)에서 각 항목의 ID를 테이블 X로 리턴하고 다른 테이블에 삽입 할 때이를 사용하는 방법. 모두 잘 작동합니다.외래 키 삭제 느려짐

이제 테이블 A, B, C 및 D의 ID 열을 "외래 키"로 할당하는 것이 좋습니다. "올바른 일"때문입니다. 내가 그거 했어. 이제 테이블 X에서 행을 삭제하면을 완료하는 데 많은 시간이 걸립니다. 다른 테이블에 삽입하는 데 너무 오래 걸립니다.

제발 나를 잘못하지 마세요, 왜 외국인 키가 DB의 테이블 관계를 지정하는 데 관련이 있는지 알고 있습니다. 그러나 내 거래가 점점 더 느려지면서 실제로 관련성이있는 것보다 의식적인 것으로 만 보이기 시작했습니다.

질문 :

1. 그것은 공식적으로 그 필요는 없습니다에도 불구하고 지정된 관계를 유지하기 위해 입찰에 일부 성능을 잃고 가치가?

2. 트랜잭션 속도를 높이고 외래 키 사양을 유지할 수있는 방법이 있습니까?

감사합니다.

은 테이블이 작성하는 방법입니다 여기에

을 회신합니다.

CREATE TABLE [dbo].[MainTableX](
    [col1] [smalldatetime] , 
    [col2] [varchar] (20) , 
    [ID] [int] IDENTITY(1,1) NOT NULL, 
CONSTRAINT [PK_MainTableX] PRIMARY KEY CLUSTERED 
(
    [ID] ASC 
) 
) 
GO 


CREATE TABLE [dbo].[RelatedTableA](
    [differentID] [varchar] (50), 
    [detail1] [varchar] (40), 
    [detail2] [varchar] (40), 
CONSTRAINT [PK_RelatedTableA] PRIMARY KEY CLUSTERED 
(
    [differentID] ASC 
) 
GO 

-- Tables B, C D are pretty much similar to table A 

추가 외래 키 SQL :

ALTER TABLE RelatedTableA ADD ID INT 
CONSTRAINT fk_refTableX_A FOREIGN KEY (ID) 
REFERENCES MainTableX(ID) 
GO 
-- Same thing with the other related tables 

솔루션

나는 외래 키 컬럼 인덱스를 만든

는 테이블 SQL을 작성합니다. 이제 내 쿼리가 다시 빠릅니다. 외래 키 열이 제대로 인덱싱하는 경우

Create nonclustered index IX_RelatedTableA 
on RelatedTableA (ID) 
GO 
+1

"필요하지 않다"는 것은 무엇을 의미합니까? 데이터 무결성을 원하거나 그렇지 않습니다. –

+0

그건 내 프로그램이 그것없이 더 빨리 달렸 기 때문에 내 의견 이었어. 내가 다른 곳에서 실수를 저지르고있을 수도 있습니다. 그래서 제가 도움을 청합니다. – davidXYZ

답변

4

다음 최악의 작은 성능 저하가 표시되어야합니다 (선언과 함께 자동으로 수행한다 , 나는을 믿는다). 각 테이블에 대해 CREATE TABLE SQL을 나열하십시오.

SQL Server는 자동으로 FK 열의 인덱스를 만들지 않으므로 직접 확인하십시오.

외래 키 관계를 사용하는 목적

아무것도 (또는하지 단지는 어떤 경우에, 그렇게하기) "를 공식적으로 선언"할 수 없습니다. 대신 데이터베이스 엔진에 에 충분한 정보를 제공하여 데이터의 무결성을 시행합니다. 즉, 관계가 위반되는 등의 실수로 응용 프로그램에 레코드를 추가하거나 삭제하지 않도록 할 수 있습니다. 또한 데이터베이스를 사용하는 다른 응용 프로그램 (예 : Management Studio)도 그렇게 할 수 없습니다.이러한 이유 때문에 데이터베이스 엔진에 의한 규칙 적용이 보장되므로 제약 조건을 선언하는 것이 중요합니다.

+0

질문에 CREATE SQL을 추가했습니다. 이것을 봐주세요. – davidXYZ

+1

좋아, 그냥 스택 오버플로에 대한 몇 가지 다른 질문을 확인하고 내가 틀렸어 - 그 외래 키 열은 * 자동으로 색인 생성 *되지 않습니다. 색인을 작성해야합니다. 나는 내 대답을 업데이트하고있다. –

+0

어떻게 잘못 됐는지 모르겠지만 몇 가지 데이터베이스를 확인하기 위해 돌아갈 것입니다. . . (나는 일부 DB 다이어 그래밍 도구가 인덱스를 생성한다고 추측한다). –

1

외래 키는 문제가 아닙니다. 그리고 그 (것)들을 제거하고 싶지 않다. 표 X에서 행을 삭제하면 먼저 표 A, B, C 및 D에서 행을 먼저 삭제한다고 가정합니다. FK가 설립되어 있다면 당신은해야 할 것입니다. 이 테이블에서 행을 어떻게 제거합니까? Java 애플리케이션 내에서? 그렇다면 계단식 삭제를 수행하도록 FK를 설정하는 것이 훨씬 더 빠릅니다. 이렇게하면 테이블 X의 행을 삭제하는 단일 호출을 만들 수 있으며 모든 자식 행은 SQL Server에서 자동으로 삭제됩니다. 테이블 X에서 삭제할 때마다 DB에 네 번 트립 할 필요가 없습니다.

둘째, 데이터 무결성을 유지하는 것보다 더 큰 가치가 있습니다. ORM (예 : Entity Framework)을 사용하기 시작하면 FK를 설치하면 훨씬 쉽게 생활 할 수 있습니다.

+0

X에서 삭제하기 전에 A, B, C, D에서 삭제합니다. 처음 4 개의 DELETE는 여전히 정상 속도로 실행되지만 외래 키가 할당 된 후 마지막 하나는 느려집니다. Java 내에서 삭제가 발생합니다. DELETE CASCADE 옵션을 살펴볼 것입니다. 시간 문제를 해결할 수있는 것 같지 않습니다. – davidXYZ