Effiziente Möglichkeit, fehlende Werte in einer ungeordneten Karte aus einer SQL-Tabelle zu füllen (SQL/C++)
P粉476547076
P粉476547076 2024-04-04 11:47:44
0
1
515

Frage Derzeit gibt es ein System für eindeutige Kennungen, die mit id)及其附加数据集从 SQL 表读取到无序映射中。这些数据集过去以 id 1 beginnen, aber das Hinzufügen und Entfernen von Datensätzen dauert etwa 10 Millisekunden. Beachten Sie, dass nicht immer alle Datensätze in den RAM geladen werden

Wenn das Programm startet, liest es aus der Datenbank

Es gibt Lücken in der Sequenz und eines Tages wird es überlaufen. SELECT MAX(id) ,并继续向计数器变量添加 +1,该变量将用作任何添加的数据集的 id 。已删除数据集的 ids 不再在任何地方使用。这不可避免地会导致 id

Ich suche nach einer leistungsstarken Möglichkeit, die niedrigste Lücke bei

Werten zu schließen. Auch konsistent mit nur teilweise geladenen SQL-Tabellen und Programmspeicher. Es kann mehrere Minuten oder sofort dauern, bis die Daten im Speicher in der SQL-Tabelle gespeichert sind. id

Gedanken Eine Lösung, die ich mir ausgedacht habe, bestand darin, zur Laufzeit eine aufwendige Abfrage für jeden erstellten Datensatz durchzuführen, um die kleinste Lücke in der SQL-Tabelle zu finden, zu prüfen, ob diese als Wert in der ungeordneten Karte vorhanden ist, und dann erneut den Zähler aus „Variablen als“ zu verwenden Backup, um endlose Abfragen zu vermeiden, kostenlos id 是否作为无序映射中的值存在,然后再次使用来自计数器变量作为备份,以避免无休止地查询免费的 id。这完全适用于 1 id. Das gilt genau für die Menge 1

. Dann bleibt es in SQL frei, wird aber in der ungeordneten Map abgerufen, bis wieder Speicher gespart wird.

id ,直到向量为空,然后(或经常)对更多 ID 进行新查询。但我想不出一个查询来查找表中 X 数量的间隙,该表可能有也可能没有以 1 开头的 idIch habe mir auch Möglichkeiten ausgedacht, die Liste der freien IDs in einem Vektor abzufragen und sie als

für neue Datensätze zu verwenden, bis der Vektor leer ist, und dann (oder oft) neue Abfragen für weitere IDs durchzuführen. Aber ich kann mir keine Abfrage vorstellen, um X Lücken in einer Tabelle zu finden, die möglicherweise

Spalten enthält, die mit 1 beginnen. momi

Ich bin auf „Wie finde ich „Lücken“ beim Ausführen eines Zählers mit SQL?“ gestoßen. , aber ich habe zwei Probleme mit der Top-Antwort: Anscheinend wird nur eine Lücke gefunden, während ich viele Lücken benötige, und ich kann die Verwendung von

nicht verstehen. userdata 的表,其中包含 iddataset 列,均为 32 位带符号 INT。如何在 id 列中找到一系列间隙?例如,当表中的 id

Angenommen, ich habe eine Tabelle namens userdata, die die Spalten

und dataset enthält, beides 32-Bit-INTs mit Vorzeichen. Wie finde ich eine Reihe von Lücken in einer

-Spalte? Wenn die 🎜s in der Tabelle beispielsweise 1,6,7,9 lauten, möchte ich, dass die Abfrage 2,3,4,5,8 zurückgibt. 🎜 🎜Jeder Hinweis auf mögliche Lösungen wäre ebenfalls willkommen. 🎜
P粉476547076
P粉476547076

Antworte allen(1)
P粉252423906

如果每 10 毫秒就有一个数据库更改,那么每秒就有 100 次更改。一个有符号的int可以容纳大约2,147,483,648个值,或者21,474,846秒,大约是8个月。此后,不可能有可用的新 ID。

第一个解决方案是使用 64bit 类型而不是 int。这给了你大约 13,600 年(对于有符号的 64b),这似乎足够了:)


其他解决方案是拥有一个包含所有可能 ID 的向量。向量存储 bool(ID 已使用/未使用)。请求新的 ID 是通过将向量移动到标记为未使用的第一个位置来完成的。
该向量使用大量 RAM,尽管 std::vector 有一个专门用于 bool 的版本,需要较少的 RAM。


第三种解决方案是处理存储已删除(读取:可重用)ID 的链接列表(可能是双链接)。

当请求新的 ID 时,列表会提供其头部,如果列表为空,则提供表的大小。
删除数据集时,其 ID 会正确插入到列表中,因此列表始终是排序的。
当 ID 被重复使用时,它将从列表中删除。
删除表中的最后一条记录也可能会删除列表中的最后一个节点,因为它们是无用的(案例 ID > 表大小)。这就是为什么我建议使用双链表,以便快速删除最后的节点。

因此,该列表在其节点上快速使用“new”和“delete”,并且还频繁地上下运行(对于双链接)以插入新节点。
这有点慢,但我希望列表不要太大,然后所需的时间也不错。

另请注意,此列表为您提供了所需的间隙数组。

Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage