同步和扫描数据库
Metabase 会定期在您的数据仓库上运行不同类型的查询,以保持数据库元数据的最新状态。了解您的数据信息有助于 Metabase 自动显示正确的图表结果,并在筛选器小部件中填充下拉菜单。
- 同步数据库模式:获取数据库模式、表结构、字段、约束(主键和外键),并停用已删除的表。
- 扫描字段值:获取列值样本以填充筛选器下拉菜单,查找不同的值,并识别有效的可视化。Metabase 不会存储您数据库中的*完整*表。
- 指纹识别:对表的前 10,000 行进行采样,以根据其类型计算样本中每个字段的统计数据,特别是:不同值计数、空值百分比(所有字段类型)、平均值、中位数、最小值、最大值和四分位数(数字类型)。
初始同步、扫描和指纹识别
当 Metabase 首次连接到您的数据库时,它会执行同步以确定表中列的元数据,并自动为每列分配一个语义类型。
您可以从 齿轮图标 > 管理员设置 > 工具 > 任务 并按各种同步任务进行筛选来跟踪这些查询的进度。
查询运行完毕后,您可以从 管理员设置 > 表元数据 查看和编辑同步的元数据。有关更多信息,请参阅编辑元数据。
选择同步和扫描发生的时间
默认情况下,Metabase 会每小时进行一次轻量级同步,并每天进行一次密集的字段值扫描。如果您的数据库很大,您可能需要选择同步和扫描发生的时间。
- 点击齿轮图标。
- 选择管理员设置。
- 转到数据库。
- 选择您的数据库。
- 在连接和同步部分,点击编辑连接详情。
- 展开显示高级选项。
- 切换选择同步和扫描发生的时间。
从那里,您可以设置同步和扫描的计划。
数据库同步
选项包括
- 同步的频率:每小时(默认)或每天。
- 同步运行的时间,以 Metabase 应用程序运行的服务器的时区为准。
扫描筛选值
扫描将只包括“活跃字段”:过去十四天内使用过的字段。Metabase 不会扫描超过十四天未使用的字段。已变为非活跃的字段在有人使用时将再次变为活跃,Metabase 会将其包含在下一次扫描中。
选项包括
- 定期按计划允许您以与数据库更改速度相匹配的频率运行扫描查询。时间设置为 Metabase 应用程序运行的服务器时区。这是小型数据库或经常更新不同值的表的最佳选择。
- 仅在添加新筛选器小部件时是一个很好的选项,如果您希望按需运行扫描查询。开启此选项意味着 Metabase 将仅在有人向仪表盘或 SQL 问题添加新筛选器小部件时(即他们向其 SQL 查询添加参数时)扫描和缓存所使用的字段的值。
- 从不,如果需要,我将手动操作是针对那些过于庞大或从不添加新值的数据库的一个选项。使用重新扫描字段值按钮可以运行手动扫描,并更新您的筛选器值。
无论您选择哪个选项,如果您将字段设置为在筛选器小部件中使用下拉列表,Metabase 将需要获取该下拉列表的值。每当有人使用该筛选器小部件时,Metabase 将首先查找缓存值(有效期为十四天)来填充该下拉列表;否则,它将重新扫描该字段以获取最新值。
手动同步表和列
- 前往管理员设置 > 数据库 > 您的数据库。
- 点击同步数据库架构。
手动扫描列值
要扫描表中所有列的值
- 前往管理员设置 > 表元数据 > 您的数据库。
- 选择您要与数据库同步的表。
- 点击页面顶部的齿轮图标。
- 点击重新扫描此表。
要扫描特定列的值
- 前往管理员设置 > 表元数据 > 您的数据库。
- 选择表格。
- 找到您希望与数据库同步的列。
- 点击该列面板中的齿轮图标。
- 点击重新扫描此字段。
清除表或字段的缓存值
要清除表的扫描字段值
- 前往管理员设置 > 表元数据。
- 选择数据库和表。
- 点击右上角的齿轮图标。
- 点击丢弃缓存的字段值。
您还可以通过点击字段上的齿轮图标并点击丢弃缓存的字段值来告知 Metabase 忘记单个字段的缓存值。
禁用特定表的同步和扫描
要阻止 Metabase 对特定表运行同步和扫描,请将表可见性更改为隐藏
- 前往管理员设置 > 表元数据 > 您的数据库。
- 将鼠标悬停在侧边栏中的表名上。
- 点击眼睛图标。
使用 API 进行同步和扫描
Metabase 定期同步和扫描,但如果数据库管理员刚刚更改了数据库模式,或者在特定时间自动添加了大量数据,您可能希望编写一个脚本,使用Metabase API来强制进行同步或扫描。API 提供了两种方法来启动数据库的同步或扫描
同步或扫描数据库
您可以使用用户 ID 进行身份验证,并在请求头中传递会话令牌来使用这些端点。
- 同步数据库模式:
/api/database/{id}/sync_schema
- 重新扫描字段值:
/api/database/{id}/rescan_values
同步单个表格
/api/notify/db/{id}
用于告诉 Metabase 同步数据库,或者可选地同步特定表。/api/notify/db/{id}/new-table
用于同步新表,无需同步整个数据库。需要schema_name
和table_name
。
要使用此端点,您必须通过 MB_API_KEY
环境变量传递一个字符串。此字符串与 Metabase 的 API 密钥不同。
我们创建了 notify
端点,以便人们可以在 ETL 操作完成后告诉 Metabase 进行同步。
查看我们的 API 文档。
数据库同步的工作原理
Metabase 同步是一种查询,它从数据库中获取更新的表和视图名称、列名称以及列数据类型的列表。
SELECT
TRUE
FROM
"your_schema"."your_table_or_view"
WHERE
1 <> 1
LIMIT 0
默认情况下,此查询在设置过程中针对您的数据库运行,之后每小时再次运行。这种扫描查询对于大多数关系型数据库来说速度很快,但对于 MongoDB 和某些社区构建的数据库驱动程序可能会较慢。同步无法完全关闭,否则 Metabase 将无法工作。
以下是同步的数据类型及其原因
什么 | 为什么 |
---|---|
表名 | 没有表格,我们还能做什么? |
字段名称 | 没有字段,也是一样 |
字段数据类型 | 查询和类型处理 |
主键 | 表显示、详细视图、自动连接 |
外键 | 自动连接和关系可视化 |
数据库扫描的工作原理
Metabase **扫描**是一种查询,通过查看每个表按升序排列的前 1,000 条不同记录,来缓存用于筛选器下拉菜单的列*值*。
SELECT
"your_table_or_view"."column" AS "column"
FROM
"your_schema"."your_table_or_view"
GROUP BY
"your_table_or_view"."column"
ORDER BY
"your_table_or_view"."column" ASC
LIMIT 1000
对于每条记录,Metabase 只存储前 100 千字节的文本。因此,如果您的数据每条包含 1,000 个字符(例如地址),并且您的列中有超过 100 个唯一地址,Metabase 将只缓存扫描查询中的前 100 个值。
缓存的列值显示在筛选器下拉菜单中。如果用户在筛选器搜索框中输入的值不在前 1,000 条不同记录或 100 KB 文本中,Metabase 将即时针对您的数据库运行查询以查找这些值。
扫描比同步查询更耗费资源,因此默认情况下它只在设置时运行一次,然后每天运行一次。如果您完全禁用扫描,则需要通过运行手动扫描来更新数据。
为了减少 Metabase 需要扫描的表和字段数量,以保持与连接数据库的同步,Metabase 将只扫描过去十四天内有人使用过的字段的值。
以下是扫描获取的数据类型及其原因
什么 | 为什么 |
---|---|
类别字段的不同值 | 下拉筛选器 UI 而非文本输入 |
活动字段的缓存值 | 改善筛选器 UI 体验 |
高级字段值(带筛选上下文) | 当数据受行或列安全限制时的值 |
定期重新指纹识别表
定期重新指纹识别将增加数据库的负载。
默认情况下,Metabase 仅在您首次连接数据库时运行指纹识别查询。
如果您希望 Metabase 在 UI 中提供建议时使用更大的列值样本,请打开此设置。
- 前往管理员 > 数据库 > 您的数据库。
- 点击编辑连接详情。
- 展开显示高级选项。
- 开启定期重新指纹识别表格。
数据库指纹识别的工作原理
指纹识别查询会查看数据库中给定表或视图的前 10,000 行。
SELECT
*
FROM
"your_schema"."your_table_or_view"
LIMIT 10000
Metabase 使用此查询的结果在 Metabase 用户界面中提供更好的建议(例如自动分组)。
为避免对数据库造成压力,Metabase 仅在您首次设置数据库连接时运行指纹识别查询。
默认情况下,Metabase 在首次指纹识别后不会重新指纹识别您的数据库。要重新指纹识别您的数据,您可以打开定期重新指纹识别表格。
以下是指纹识别获取的数据类型及其原因
什么 | 为什么 |
---|---|
不同值计数 | 确定字段值缓存策略 |
最大/最小数值 | 可视化中的分箱和范围过滤器 |
日期范围(最小/最大日期) | 日期筛选器默认值和时间线显示 |
特殊类型检测(URL、电子邮件、JSON、地理数据(如美国州)) | 字段渲染和过滤 |
空值比率 | 数据质量评估 |
平均值/中位数 | 可视化默认值 |
文本长度指标 | 隐藏 UI 中的长文本字段 |
延伸阅读
Metabase 在同步和扫描过程中不进行任何缓存或速率限制。如果您的数据似乎丢失或过时,请查看
阅读其他版本的 Metabase 的文档。