동적으로 작성된 쿼리를 사용하여 SQLite 데이터베이스에서 읽는 복잡한 C# 프로그램이 있습니다.필드가 테이블의 기본 키인 경우 SQLite "MyTable (ID) 자동 인덱스"
SQLite warning (284): automatic index on MyTable(Id)
내가 MyTable에 대한 스키마를 살펴 보았다, 그리고 ID가 기본 키로 지정되어,이 같은 :
내가 디버거에서 프로그램을 실행할 때 통지 , 나는 같은 출력을 많이 얻을CREATE TABLE MyTable (Id varchar(50) collate nocase primary key not null,
Name varchar(50) not null,
(etc)
SQLite는 기본 키에 대한 인덱스를 만들었다 고 생각했기 때문에 다른 키를 만드는 이유는 무엇입니까?
관련 메모에서 하위 쿼리에 대한 자동 색인 경고가 많이 나타납니다. 예를 들어, 쿼리 :
MyTable has Id as the primary key
Organisations has Id as the primary key
SubTable has a unique index on ArrangementId, OrganisationId
쿼리 수익률에 쿼리 계획을 EXPLAIN
SELECT MyTable.Id, MyTable.Name, Amount
FROM MyTable
LEFT JOIN (SELECT ArrangementId, Amount, AgreementDate FROM SubTable
JOIN Organisations ON Organisations.Id = SubTable.OrganisationId AND Organisations.Direction = 1
) AS MyJoin ON MyJoin.ArrangementId = MyTable.Id
ORDER BY Id
: 내가 SQLite는 추측
1|0|0|SCAN TABLE SubTable
1|1|1|SEARCH TABLE Organisations USING INDEX sqlite_autoindex_Organisations_1 (Id=?)
0|0|0|SCAN TABLE Arrangements USING INDEX sqlite_autoindex_Arrangements_1
0|1|1|SEARCH SUBQUERY 1 AS MyJoin USING AUTOMATIC COVERING INDEX (ArrangementId=?)
는 하위 쿼리 것을 깨닫게만큼 똑똑하지 않다 임시 테이블에 갈 필요가 없습니까?
하위 쿼리를 피할 수 있도록 쿼리를 다시 작성할 수있는 방법이 있습니까?
, 왜 사용되는 VARCHAR ? 이렇게하면 b-tree에 한 번, 테이블에 한 번 두 번 저장되는 열 값이 생깁니다. 정수 기본 키를 사용하고 텍스트를 별도의 열에 저장하는 것이 좋습니다. 원한다면 여전히 다른 컬럼에 고유 제한 조건을 설정할 수 있습니다. – seairth
텍스트에 고유 인덱스를 만드는 것이 텍스트를 기본 키로 사용하는 것보다 공간을 덜 차지한다는 말입니까? –
아니요, 두 경우 모두 텍스트 복사본이 포함 된 b- 트리로 끝납니다. 나는 varchar를 기본 키로 사용하는 것에 대해 더 염려했습니다. 대답에서이 의견 계속 ... – seairth