标签: graph

SQL Server 2019:图形查询的内存性能(可能的内存泄漏)

我目前正在努力升级到 SQL Server 2019,以便利用其中可用的图形功能。我们的数据库存储文件及其子文件的记录,图形特征使我们能够快速找到文件在任一方向的所有关系。我们当前的开发环境在 Linux 服务器上使用 SQL Server 2019 Standard (15.0.4023.6)。

我在运行图形查询时注意到一个令人担忧的问题。服务器的“内部”资源池在图形查询后似乎没有释放所有资源。如果不选中,这会填满资源池。在重新启动 SQL Server 进程之前,较大的查询将失败。根据服务器负载,这可能会在短短 1-2 小时内发生。这也会填满 tempdb 并威胁填满存储驱动器。在服务器重新启动之前,tempdb 的文件也不能显着缩小/截断。在配置中,'memory.memorylimitmb'没有设置,所以当资源池开始使用默认80%的系统内存(12.8GB,16GB系统内存)中的大部分时,就会出现这个问题

要在演示数据库中设置表:

CREATE TABLE FileNode (ID BIGINT NOT NULL CONSTRAINT PK_FileNode PRIMARY KEY) AS NODE

GO

CREATE TABLE FileNodeArchiveEdge AS EDGE

GO

CREATE INDEX [IX_FileNodeArchiveEdge_ChildFile] ON [dbo].[FileNodeArchiveEdge] ($from_id)

GO

CREATE INDEX [IX_FileNodeArchiveEdge_ParentFile] ON [dbo].[FileNodeArchiveEdge] ($to_id)

GO
Run Code Online (Sandbox Code Playgroud)

填充演示数据库表:

INSERT INTO [FileNode] (ID) VALUES
            (1),(2),(3),(4),(5),
            (6),(7),(8),(9),(10),
            (11),(12),(13),(14),(15)

-- Convenient intermediate table
DECLARE @bridge TABLE (f BIGINT, t BIGINT)
INSERT INTO @bridge (f, t) …
Run Code Online (Sandbox Code Playgroud)

memory graph sql-server-2019 memory-manager

10
推荐指数
1
解决办法
437
查看次数

是否有基于单文件的图形数据库管理系统?

我正在考虑使用图形数据库管理系统(简称 DBMS)作为我的单用户桌面应用程序的应用程序文件格式。

是否有基于单文件的图形 DBMS(图形 DBMS的 SQLite 的“等价物”)?

graph graph-dbms

9
推荐指数
1
解决办法
1043
查看次数

使用 Postgresql 高效地(递归地)查找朋友的朋友

目标:用户提交他们的通讯录,然后应用程序根据他们的电话号码查找用户之间的联系。类似于“6次握手”的想法(https://en.wikipedia.org/wiki/Six_degrees_of_separation)。

问题:使这个查询性能接近实时。当用户提交他的电话号码并获得其他电话的完整列表时,他可能知道。普通列表 - 没有连接(图形顶点等),但完整,没有分页(这里要求是因为原始目标更复杂)。

问题:是否有可能使用纯关系数据库实现接近实时的性能,而无需图形数据库(Neo4j 等)、图形扩展(bitnine agensgraph)或工作流重新设计?任何非规范化都是可能的,但据我所知,它无济于事。

鉴于:

test=# select * from connections;
 user_phone | friend_phone
------------+--------------
          1 |            2
          1 |            3
          1 |            4
          2 |            6
          2 |            7
          2 |            8
          8 |           10
          8 |           11
          8 |           12
         20 |           30
         40 |           50
         60 |           70
Run Code Online (Sandbox Code Playgroud)

我希望使用电话 === 1 的用户收到以下连接:

 friend_phone
--------------
            2
            3
            4
            6
            7
            8
           10
           11
           12
(9 rows)
Run Code Online (Sandbox Code Playgroud)

估计真实世界的连接数真的很困难。但我至少在测试:

  • 10,000 个用户(电话号码)
  • 每个用户被随机分配了 50-1000 个与其他用户的伪随机 …

postgresql hierarchy graph

9
推荐指数
1
解决办法
192
查看次数

如何使用这种模式有效地遍历图形数据?

我有一些体现有向无环图的关系,其中包括类似于以下内容的模式:

在此输入图像描述

我正在寻找一种有效的方法来遍历此图形数据。下面是计算节点 0 的后代的看似简单任务的示例:

数据库<>小提琴

DROP TABLE IF EXISTS #edges;
CREATE TABLE #edges(tail int, head int);
INSERT INTO #edges(tail,head) VALUES
    (0,1), (5, 6),  (10,11), (15,16),
    (0,2), (5, 7),  (10,12), (15,17),
    (1,2), (6, 7),  (11,12), (16,17),
    (1,3), (7, 8),  (11,13), (17,18),
    (2,3), (7, 9),  (12,13), (17,19),
    (2,4), (8, 9),  (12,14), (18,19),
    (3,4), (8,10),  (13,14),
    (3,5), (9,10),  (13,15),
    (4,5), (9,11),  (14,15),
    (4,6),          (14,16);
WITH descendents(node)
AS(
    SELECT 0 as node
    UNION ALL
    SELECT head as node FROM descendents as prior
    JOIN #edges …
Run Code Online (Sandbox Code Playgroud)

sql-server cte graph recursive

8
推荐指数
1
解决办法
373
查看次数

太字节数据集

我有一种感觉,大多数数据库系统起源于 80 年代,并且刻板地实现了表、ACID 事务和约束。它们的构建考虑到了内存、磁盘和处理能力的稀缺性。

我想知道是否有任何存储系统(不需要通过 SQL 访问)能够处理以下内容:

  • 图(查询 la SPARQL)。
  • 矩阵(n 维)也稀疏。支持平凡矩阵算法,如 SVD、聚类。
  • 有效管理不会连续变化的大(TB 级)数据;通过每天的批次正在发生变化。
  • 使用大型磁盘系统(14TB 的 RAID5 现在不到 1500 美元)。这意味着有更多空间用于索引、预先计算的结果等。
  • 利用 GPU/多核/处理器/节点进行大型查询和索引。

我知道大多数项目都在某处实现(Apache Cassandra、SPARQL、Netezza、Exadata),但我不知道任何可能实现所有项目的产品。

performance graph

7
推荐指数
1
解决办法
778
查看次数

将 MySQL/PostgreSQL 表结构可视化为图形/UML

是否有任何程序、源代码或 API 将采用 MySQL 或 PostgreSQL 模式并吐出 UML 或其他图形可视化?

mysql postgresql graph

7
推荐指数
2
解决办法
2万
查看次数

在 Cassandra DB 中建模图数据

我想使用 Apache Cassandra 根据属性图模型存储大量图数据。该模型包含以下实体:

  • Vertices:包含键/值对(属性)的映射。一些键应该被索引以进行查询(见下文)。
  • :在给定方向上将两个顶点相互连接。包含一个标签和可能的一些边缘数据。边缘数据是键/值对的映射,其中一些键也应该被索引以进行查询。

顶点和边都有一个唯一的主键,可以是字符串或整数值。

例子:

#A vertex
{node_type:'module',pk: 1,...}
#Another vertex
{node_type:'function',pk: 2,...}

#An edge
{incoming_vertex: 1,outgoing_vertex: 2,label: 'body',data : {}}
Run Code Online (Sandbox Code Playgroud)

我想在图表上执行以下类型的查询:

  • 根据它们的主键(例如“使用 pk = a5f...获取顶点”)或一个或多个索引属性的值(例如“使用node_type = 'module'和...获取所有顶点”)检索顶点列表。
  • 从给定的顶点沿其边遍历图,使用边标签、方向和一个或多个索引边属性来确定所采用的路径(例如“通过带有标签主体和属性的输出边获取连接到顶点 A 的所有顶点... = ...)。

此外,我还有以下要求和边界条件:

  • 检索给定顶点的边列表应该尽可能有效(理想情况下为 O(1))。
  • 边的数量将远大于图中的顶点数量。
  • 该模型应扩展到数十亿个顶点和数千亿个边(提供适当的硬件)。
  • 图数据通常只会写入一次并读取多次,因此模型可以以写入性能为代价来优化查询性能。

我对数据模型的最初想法如下:

  • 分别为顶点和边使用一个列族,其中行键是顶点/边的主键,单个文本列包含其 JSON 数据。顶点/边属性上的索引被建模为附加列(其数据被非规范化并在顶点/边数据发生变化时手动更新)
  • 使用一个动态列族来管理顶点的邻接(边)列表,复合主键包含顶点的主键、边的主键、边标签和边方向(传入或传出)每个顶点。

这是一个合理的数据模型吗?关于如何实现这一点的任何其他建议?

cassandra graph

7
推荐指数
1
解决办法
6375
查看次数

将所有相似人物收集到一组

我有一个人有几个 ID。其中一些在 Id1 列中,其中一些在 Id2 中。我想将所有相同的人 ID 收集到一组。

如果 id1=10,则与 id2=20 在同一行。所以这意味着id1=10的人与id2=20是同一个人。

输入和输出示例:

输入

Id1     Id2
---     ---
10      20
10      30
30      30
10      40

50      70
60      50
70      70 
Run Code Online (Sandbox Code Playgroud)

输出

NewId   OldId
-----   -----
1       10
1       20
1       30
1       40

2       50
2       60
2       70
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql graph sql-server-2012

7
推荐指数
1
解决办法
219
查看次数

任何基于图形/感知的数据库是否具有维护引用完整性的良好机制?

任何基于图形/图形感知的数据库(Neo4j、ArangoDB、OrientDB 或其他)是否具有与关系数据库提供的机制相同的维护引用完整性的机制?

我正在探索各种基于文档的数据库,以找到合适的引擎用于向某个项目添加辅助数据存储。

我发现了基于图的/多模型数据库,它们似乎是一个好主意,但我惊讶地发现它们似乎没有提供与现代关系数据库相同级别的关系/链接/边缘保护。

特别是,我正在讨论将实体/顶点的删除与链接/边的删除相链接。在关系数据库中,我可以有一个外键约束,它将一个表中的记录与另一个表中的记录链接起来,并且可以

  1. 如果表 A 中的记录被表 B 中的记录引用,则防止删除该记录(“删除时不执行任何操作”),或者

  2. 如果删除表 A 中的引用记录,则删除表 B 中的引用记录。

我希望在图形感知数据库中找到类似的机制。例如,如果“评论”顶点链接到“帖子”顶点(形成多对一关系),则需要解决以下问题/挑战:

  1. 当该帖子的评论存在边缘时,防止删除该帖子。这样,评论就永远不会有指向帖子的悬空链接/边缘。解决方案是:根据链接/边缘属性,

    1. 阻止删除帖子,直到删除该帖子的评论的所有边缘,或者

    2. 删除帖子时删除链接到该帖子的所有评论。

  2. 防止删除评论到帖子的边缘而不删除评论本身,以防止评论根本没有到帖子的链接/边缘。

  3. 仅当创建边缘以同时将此评论链接到帖子时才允许创建评论。

基于图形的数据库中确实缺乏这样的机制,还是我只是找不到它们?

我知道OrientDB有“链接”数据类型,可能解决了第二个问题和第三个问题(如果链接类型属性被声明为强制且非空,那么在不指定链接目的地的情况下不可能创建记录,稍后不可能通过取消设置属性来中断链接)。

然而,据我记得,可以删除链接类型属性指向的记录,从而产生悬空链接(因此第一个问题没有解决)。

我还知道,在某些数据库中,我可以使用嵌套文档作为多个链接文档的替代方案。然而,这种方法不能很好地扩展(对于链接记录数量可以无限增长的情况)。此外,它也非常有限(当需要多个链接时,例如,指向帖子和用户的链接,它不能用作替代方案;还有其他重要的限制)。

referential-integrity graph neo4j

7
推荐指数
1
解决办法
315
查看次数

具有“非图形”数据的图形数据库

--- 更新 ---
感谢您的评论和到目前为止的帮助。我很抱歉没有进一步说明问题。我已经更新了下面的问题。
- - 更新 - -

目前,我被要求为大量数据开发数据库结构。我正在争论实现图形数据库而不是“普通”关系数据库,并且想知道如果数据不一定包含任何关系有什么缺点?可以像表/表中的行一样使用单独的、未连接的节点吗?

我问这个是因为现在不需要关系,但我正试图在未来证明数据库(预期关系)以扩展数据的能力。如果有任何帮助,我正在 OrientDB/Neo4j 或 mySQL/postgreSQL 之间进行辩论。

一个例子:
假设我们有一个充满股票的数据库。任何人几乎可以在任何时间/天买卖股票(只要市场开放)。现在这个数据库可以是一个普通的关系数据库:Table 1: IDs | Products | Prices | Sizes | Dates. 但也有可能被组织为关系数据库Node 1: Stock A | Node 2: Stock B
如果我只是使用数据库来存储股票信息,在我看来普通的数据库会更好。但这是真的吗?它会不会对我使用关系数据库产生负面影响/使用普通数据库会更好吗?在节点而不是行中组织我的数据是否有缺点?

一张图说明一切:

该数据库将主要用于买卖类似股票的产品,但它们也有其他信息,例如附加到它们的位置。我正在尝试预测功能的实现,例如推荐产品,甚至预测某人要购买的下一个产品。

来自数据库的大多数查询将针对每个产品。
从数据库中提取:每天 100 到 1000 次。
推送到数据库:每天 20.000。

一个额外的问题可能会揭示一个缺点:
从关系到图或从图到关系有多容易。有任何锁定危险吗?

感谢所有的帮助,到目前为止评论都很棒!电阻

mysql graph

5
推荐指数
1
解决办法
3118
查看次数

Selecting Without Repititions

I have table with observations of objects moving along edges in a graph, this table has the following form:

PK | TIMESTAMP | object_id | from_id | to_id
Run Code Online (Sandbox Code Playgroud)

where object_id is the id of some object and from_id and to_id are vertices.

Since the movements are observed at a high frequency the tuple

(object_id, from_id, to_id)
Run Code Online (Sandbox Code Playgroud)

is repeated often for different PK and TIMESTAMPS. I'm interested in all the separate edge traversals, so if an object with id 1 …

mysql graph

4
推荐指数
1
解决办法
92
查看次数

用于搜索引擎和 gis 的哪个图形数据库?

我刚刚了解到那里有“图形数据库”,它们更适合两个应用程序“搜索引擎”,尤其是“gis”。

为了避免讨论关系数据库是否更适合并明确需要什么样的数据库,这里有一些我想使用它的详细信息:

  1. 应用程序(搜索引擎):在关系数据库中处理搜索引擎数据很慢,因为您将拥有包含大量索引的大表。想象一下像'links'这样的表,它只有from_pageid INT, to_pageid INTPRIMARY KEY(from_pageid,to_pageid),INDEX(from_pageid)和INDEX(to_pageid);这将有大约 1'000'000 个条目。当使用图形数据库时,每个节点只有所有“从”和“到”链接,有或没有索引,它们就在那里,而无需查找巨大的索引。
  2. 应用程序 (GIS):如果您有一张地图,其中包含节点(具有地理位置)和它们之间的链接(=道路、道路、自动路线...),您将有一个很大的“链接”表来询问哪些链接(road,ways,...) 可用于节点 x。与搜索引擎应用程序相同的问题。

好的,现在还有一些专业:

  1. 它应该是一个免费软件(免费)。原因:我想将它用于研究/教育目的(我目前必须自己为此提供资金)。AND:我可能想让它成为一种商业产品。因此,如果切换到商业应用程序,“非商业用途免费”解决方案至少应该是负担得起的……
  2. 我想使用 PHP、C/C++ 来访问数据库(最好两者都可以)。如果还支持 Java/Android,那就更好了。
  3. 操作系统:Linux!我想避免使用基于 Java 的产品,因为 javaVM 往往会吃掉所有 RAM(只有非常有限的服务器资源)并且不释放任何内存 - 即使它们可以。

你会向我推荐什么数据库?

database-recommendation linux php graph spatial

3
推荐指数
1
解决办法
1119
查看次数