2013-08-03 1 views
2

나는 한 항목에 6 개의 항목을 삽입해야하는 SQlite 테이블이 있습니다. 그리고 4000 행이 있습니다. 따라서 4000 * 6 삽입 작업이 필요합니다. 이를 줄이기 위해이 6 개의 항목을 연결하여 하나의 열로 삽입하므로 4000 개의 작업 만 있습니다.데이터베이스 삽입 대 문자열 연결

그러나 문자열 연결 연산의 복잡성은 O(n^2)이고 여기서 n은 문자열의 수임을 알게되었습니다. 그리고 항목을 가져올 때 문자열을 6 부분으로 분할해야합니다. 반대의 경우 삽입/질의와 같은 데이터베이스 조작은 M * O(log(n))의 복잡성을 가지며 여기서 M은 행의 수이고 n은 B-tree 구조를 유지하는 열입니다.

그럼 이제 어떻게해야합니까? 내가 6 개의 항목을 하나씩 연결하고 그것을 삽입하고 나중에 나눠야합니까, 아니면 6 개의 열에 그들을 삽입하고 6 개의 시도를해야합니까? 어느 것이 시간 효율적일까요?

+0

나는 당신이 무엇을 요구하는지 이해하지 않습니다. 한 행의 6 개 항목 (= 열)을 하나의 sql-insert/update-statement로 삽입/업데이트 할 수 있습니다. 데이터베이스 비정규 화로 해결하려는 성능 문제가 있습니까? – k3b

답변

2

모든 알고리즘 복잡성 추정치가 잘못되었습니다.

문자열 연결을 구현하는 가장 간단한 방법은 O (n²)입니다. SQLite는 레코드를 구성 할 때 이미 문자열의 수와 크기를 알고 있으므로 부분 문자열을 재 할당하거나 이동할 필요가 없습니다. 하나의 레코드를 만드는 데 필요한 실제 시간은 O (n)입니다. (이것은 문자열의 크기를 무시하지만 모든 문자열의 크기가 같다고 가정하면이 점이 중요하지 않습니다.)

SQLite가 여러 문자열을 삽입하는 경우에도 테이블의 B에 삽입되기 전에 레코드가 생성됩니다 -나무.

B 트리의 임의 위치에 하나의 레코드를 삽입하는 것은 O (로그 M)입니다. 레코드를 추가하면 O (1)가됩니다. 당신은 단지 상수가되도록


그래서 모든 시간이 O 실제로, 당신의 번호 N과 M은 무한대가되지 않지만 경계되어 있습니다 (1). 당신에게 중요한 것은 O 표기법에 의해 숨겨진 상수 요소입니다. 그들을 찾아내는 유일한 방법은 실제로 당신의 작업을 측정하는 것입니다.

1

나는 쿼리를 필터링하고 데이터를보다 쉽게 ​​관리 할 수 ​​있기 때문에 SQLite을 선호합니다.

문자열 연결 중 하나의 열을 수정하거나 삭제해야한다면 어떨까요? String으로 데이터를 분할하고 수정/삭제하려는 항목을 찾은 다음 데이터베이스에 다시 삽입해야하기 때문에이 작업이 더 복잡해집니다.

"쿼리를 6 번 시도" (하나씩 쿼리 하시겠습니까?) : 간단한 쿼리를 사용하면 필요한 모든 데이터가 포함 된 커서를 가질 수 있습니다.