FileMaker 中 all/many 个表的统计数据
Statistics of all/many tables in FileMaker
我正在为我的 FileMaker 解决方案编写一种摘要页面。
为此,我定义了一个“统计数据”table,它使用带有 ExecuteSQL 的公式字段从大多数 table 中收集信息,例如记录数,最近更改记录等
奇怪的是,这需要很长时间 - 大约 10 秒,而我在大约 10 table 秒内总共有大约 20k 条记录。在任何数据库系统上相同的 SQL 不应超过几分之一秒。
可能是什么原因,我该怎么办,我可以从哪里开始调试以找出一直以来的原因?
实际代码是这样的:
SQLAusführen ( "SELECT COUNT(*) FROM " & _Stats::Table ; "" ; "" )
SQLAusführen ( "SELECT SUM(\"some_field_name\") FROM " & _Stats::Table ; "" ; "" )
其中“_Stats”是我的统计数据 table,它有一个字符串字段“Table”,我在其中存储其他 table 的名称。
所以 _Stats table 中的每一行都应该包含在“Table”字段中命名的 table 的统计数据。
更新:我没有使用 FileMaker 服务器,这是一个独立的客户端应用程序。
我们绝对可以讨论为什么它可能很慢。通常这主要与架构的大小和复杂性有关。正如您所发现的,那是“通常”。
您可以改用 DDR(数据库设计报告)吗?很大程度上取决于您实际使用这些数据做什么。像 FMPerception 这样的工具也会为您提供您正在寻找的许多统计数据。同样,取决于你用它做什么。
另外,请问您post您的实际计算可以吗?统计数据 table 是否使用未存储的计算?统计数据 table 是否与其他任何 table 相关?有几件事会影响 ExecuteSQL 的执行方式。
要记住一件事,无论是 ExecuteSQL、执行查找还是关系,它们在底层都是相同的基本查询。因此,如果以一种方式执行它会很慢,那么使用任何其他直接相关的方法可能会很慢。
一次拿这些:
所有记录都算在内。
- 在目标中放置一个未存储的计算 table 允许您通过关系获取记录的计数,而不会触发将所有记录传输到客户端。您可以从关系中的第一条记录中获取值。获取该信息的超轻方式与使用 Count 相比,Count 需要 FileMaker 触摸另一侧的每条记录。
匹配值的记录总和。
- 在 _Stats table 上使用与目标有关系的字段 table 将减少 FileMaker 为您提供答案所需要做的工作量。
- 然后在目标 table 中有一个摘要字段,因此对记录求和可能比使用聚合函数更有效。汇总字段也只会对符合关系的记录求和。 (如果不需要,请不要在任何布局上显示该字段)
ExecuteSQL 仅依靠简单的索引查找时速度最快。一旦你超出了这个范围,它主要是关于测试以找到最佳点。通常,我将使用 ExecuteSQL 从用户 table 检索 JSON 对象,或验证单个字段值。一旦你进入排序和聚合函数,你就走出了函数的优化。
另请注意,如果您有一个打开的记录(这意味着您是当前用户),FileMaker Server 不知道您在客户端有什么数据,因此它会发送所有记录。这就是为什么我问您是否在 ExecuteSQL 中使用未存储的计算。当您无法控制计算何时启动时,它可能看起来很慢。通常我会把这些数据的更新放到一个预定的脚本中。
我正在为我的 FileMaker 解决方案编写一种摘要页面。
为此,我定义了一个“统计数据”table,它使用带有 ExecuteSQL 的公式字段从大多数 table 中收集信息,例如记录数,最近更改记录等
奇怪的是,这需要很长时间 - 大约 10 秒,而我在大约 10 table 秒内总共有大约 20k 条记录。在任何数据库系统上相同的 SQL 不应超过几分之一秒。
可能是什么原因,我该怎么办,我可以从哪里开始调试以找出一直以来的原因?
实际代码是这样的:
SQLAusführen ( "SELECT COUNT(*) FROM " & _Stats::Table ; "" ; "" )
SQLAusführen ( "SELECT SUM(\"some_field_name\") FROM " & _Stats::Table ; "" ; "" )
其中“_Stats”是我的统计数据 table,它有一个字符串字段“Table”,我在其中存储其他 table 的名称。
所以 _Stats table 中的每一行都应该包含在“Table”字段中命名的 table 的统计数据。
更新:我没有使用 FileMaker 服务器,这是一个独立的客户端应用程序。
我们绝对可以讨论为什么它可能很慢。通常这主要与架构的大小和复杂性有关。正如您所发现的,那是“通常”。
您可以改用 DDR(数据库设计报告)吗?很大程度上取决于您实际使用这些数据做什么。像 FMPerception 这样的工具也会为您提供您正在寻找的许多统计数据。同样,取决于你用它做什么。
另外,请问您post您的实际计算可以吗?统计数据 table 是否使用未存储的计算?统计数据 table 是否与其他任何 table 相关?有几件事会影响 ExecuteSQL 的执行方式。
要记住一件事,无论是 ExecuteSQL、执行查找还是关系,它们在底层都是相同的基本查询。因此,如果以一种方式执行它会很慢,那么使用任何其他直接相关的方法可能会很慢。
一次拿这些:
所有记录都算在内。
- 在目标中放置一个未存储的计算 table 允许您通过关系获取记录的计数,而不会触发将所有记录传输到客户端。您可以从关系中的第一条记录中获取值。获取该信息的超轻方式与使用 Count 相比,Count 需要 FileMaker 触摸另一侧的每条记录。
匹配值的记录总和。
- 在 _Stats table 上使用与目标有关系的字段 table 将减少 FileMaker 为您提供答案所需要做的工作量。
- 然后在目标 table 中有一个摘要字段,因此对记录求和可能比使用聚合函数更有效。汇总字段也只会对符合关系的记录求和。 (如果不需要,请不要在任何布局上显示该字段)
ExecuteSQL 仅依靠简单的索引查找时速度最快。一旦你超出了这个范围,它主要是关于测试以找到最佳点。通常,我将使用 ExecuteSQL 从用户 table 检索 JSON 对象,或验证单个字段值。一旦你进入排序和聚合函数,你就走出了函数的优化。
另请注意,如果您有一个打开的记录(这意味着您是当前用户),FileMaker Server 不知道您在客户端有什么数据,因此它会发送所有记录。这就是为什么我问您是否在 ExecuteSQL 中使用未存储的计算。当您无法控制计算何时启动时,它可能看起来很慢。通常我会把这些数据的更新放到一个预定的脚本中。