>  Q&A  >  본문

SQL 테이블(SQL/C++)의 정렬되지 않은 맵에서 누락된 값을 채우는 효율적인 방법

질문 현재 id)及其附加数据集从 SQL 表读取到无序映射中。这些数据集过去以 id 1로 시작하는 고유 식별자 시스템이 있지만 데이터세트를 추가하고 제거하는 데는 약 10밀리초가 걸립니다. 모든 데이터세트가 항상 RAM에 로드되는 것은 아닙니다.

프로그램이 시작되면 데이터베이스에서 읽습니다.

순서에 공백이 있고 언젠가는 오버플로됩니다. SELECT MAX(id) ,并继续向计数器变量添加 +1,该变量将用作任何添加的数据集的 id 。已删除数据集的 ids 不再在任何地方使用。这不可避免地会导致 id

저는

가치관의 가장 낮은 격차를 메울 수 있는 효율적인 방법을 찾고 있습니다. 또한 부분적으로 로드된 SQL 테이블 및 프로그램 메모리와도 일치합니다. 메모리의 데이터가 SQL 테이블에 저장되는 데 몇 분 또는 즉시 걸릴 수 있습니다. id

생각 내가 생각해낸 한 가지 해결책은 SQL 테이블에서 가장 작은 간격을 찾기 위해 런타임에 생성된 각 데이터 세트에 대해 값비싼 쿼리를 수행하고, 이 가 순서가 지정되지 않은 맵에 값으로 존재하는지 확인한 다음 다시 변수의 카운터를 다음과 같이 사용하는 것이었습니다. 끝없는 쿼리를 피하기 위해 무료로 백업하세요 id 是否作为无序映射中的值存在,然后再次使用来自计数器变量作为备份,以避免无休止地查询免费的 id。这完全适用于 1 id. 이는 정확히 수량 1

에 적용됩니다. 그런 다음 SQL에서는 사용 가능한 상태로 유지되지만 메모리가 다시 저장될 때까지 순서가 지정되지 않은 맵에서 가져옵니다.

id ,直到向量为空,然后(或经常)对更多 ID 进行新查询。但我想不出一个查询来查找表中 X 数量的间隙,该表可能有也可能没有以 1 开头的 id또한 무료 ID 목록을 벡터로 쿼리하고 벡터가 비어 있을 때까지 새 데이터세트에 대해 이를

로 사용한 다음 (또는 자주) 더 많은 ID에 대한 새 쿼리를 만드는 방법도 브레인스토밍했습니다. 하지만 테이블에서 1로 시작하는

열이 있을 수도 있고 없을 수도 있는 X개의 간격을 찾는 쿼리는 생각할 수 없습니다. momi

SQL을 사용하여 카운터를 실행할 때 "간격"을 찾는 방법을 발견했습니다. , 그러나 상위 답변에는 두 가지 문제가 있습니다. 분명히 하나의 간격만 찾은 반면 많은 간격이 필요하며

사용을 이해할 수 없습니다. userdata 的表,其中包含 iddataset 列,均为 32 位带符号 INT。如何在 id 列中找到一系列间隙?例如,当表中的 id

32비트 부호 있는 INT인

dataset 열을 포함하는 userdata라는 테이블이 있다고 가정합니다.

열에서 일련의 공백을 찾는 방법은 무엇입니까? 예를 들어, 테이블의 🎜가 1,6,7,9인 경우 쿼리에서 2,3,4,5,8을 반환하고 싶습니다. 🎜 🎜가능한 해결책에 대한 조언도 감사하겠습니다. 🎜
P粉476547076P粉476547076179일 전357

모든 응답(1)나는 대답할 것이다

  • P粉252423906

    P粉2524239062024-04-05 00:12:20

    10밀리초마다 데이터베이스가 변경된다면 초당 100번 변경되는 것입니다. 서명된 int에는 약 2,147,483,648개의 값, 즉 21,474,846초(약 8개월)를 저장할 수 있습니다. 이후에는 새로운 ID를 사용하실 수 없습니다.

    첫 번째 해결책은 대신 64bit 유형을 사용하는 것입니다 64bit 类型而不是 int. 이는 약 13,600년(서명된 64b의 경우)을 제공하므로 충분해 보입니다. :)


    다른 해결책은 가능한 모든 ID를 포함하는 벡터를 갖는 것입니다. 벡터 저장소 bool(ID 사용/미사용). 새 ID를 요청하려면 벡터를 사용되지 않은 것으로 표시된 첫 번째 위치로 이동하면 됩니다.
    이 벡터는 많은 RAM을 사용하지만 std::Vector에는 더 적은 RAM이 필요한 bool용 버전이 있습니다.


    세 번째 해결 방법은 삭제된(읽기: 재사용 가능) ID의 연결 목록(이중 연결 가능)을 저장하는 작업을 처리하는 것입니다.

    새 ID를 요청할 때 목록은 헤더를 제공하거나 목록이 비어 있는 경우 테이블 크기를 제공합니다.
    데이터세트가 삭제되면 해당 ID가 목록에 올바르게 삽입되므로 목록이 항상 정렬됩니다.
    ID를 재사용하면 목록에서 삭제됩니다.
    테이블의 마지막 레코드를 삭제하면 목록의 마지막 노드도 쓸모가 없으므로 삭제될 수 있습니다(케이스 ID > 테이블 크기). 그렇기 때문에 마지막 노드를 빠르게 제거할 수 있도록 이중 연결 목록을 사용하는 것이 좋습니다.

    그래서 목록은 노드에서 "새로 만들기"와 "삭제"를 빠르게 사용하고, 새 노드를 삽입하기 위해 자주 위아래로(이중 링크의 경우) 실행됩니다.
    좀 느리긴 하지만 목록이 너무 크지 않고 소요 시간도 나쁘지 않길 바랍니다.

    또한 이 목록에는 필요한 공백이 나열되어 있습니다.

    회신하다
    0
  • 취소회신하다