Navicat 不支持定时执行任意 SQL,仅提供备份等内置计划任务;需借助系统定时器(如 crontab 或 Windows 任务计划)调用命令行工具(mysql/sqlcmd)执行 ANALYZE TABLE 或 UPDATE STATISTICS。

Navicat 本身不支持定时任务执行 SQL
Navicat 是数据库管理客户端,不是调度服务,它没有内置的“定时任务”功能来自动运行 ANALYZE TABLE 或 UPDATE STATISTICS。你看到的「计划任务」仅指备份、数据同步等 Navicat 自带的作业类型,不包含任意 SQL 脚本的周期性执行。
想实现统计信息自动更新,必须借助外部调度工具 + 可执行命令,Navicat 只能作为辅助(比如生成语句、测试逻辑)。
MySQL / MariaDB:用 mysqldump + mysql 配合系统定时器
核心思路是写一个 shell 脚本(Linux/macOS)或 bat 文件(Windows),调用命令行客户端执行分析语句,再用系统级定时器触发。
- 先确认 MySQL 命令行客户端可用:
mysql --version,且能免密或通过配置文件登录(推荐用~/.my.cnf避免密码明文) - 统计信息更新语句因引擎而异:
ANALYZE TABLE t1, t2;(InnoDB/MyISAM),或对整个库批量生成:SELECT CONCAT('ANALYZE TABLE ', table_schema, '.', table_name, ';') FROM information_schema.tables WHERE table_schema = 'your_db'; - 保存为
refresh_stats.sh,内容类似:#!/bin/bash mysql -S /tmp/mysql.sock your_db -e "ANALYZE TABLE orders, users;"
- Linux 下用
crontab -e添加:0 2 * * * /path/to/refresh_stats.sh >/dev/null 2>&1(每天凌晨 2 点执行)
SQL Server:依赖 sqlcmd + Windows 任务计划程序
SQL Server 的统计信息更新常用 UPDATE STATISTICS 或更彻底的 sp_updatestats,但必须在服务器端执行,且需有足够权限(db_owner 或 sysadmin)。
- 写一个
update_stats.sql文件,内容如:USE [YourDB]; EXEC sp_updatestats;
- 用
sqlcmd调用:sqlcmd -S localhost -E -i "C:\scripts\update_stats.sql"(-E表示 Windows 身份验证;若用 SQL 登录,加-U user -P pass) - 在 Windows 任务计划程序中新建基本任务,触发器设为每天,操作设为「启动程序」,程序填
sqlcmd完整路径(如C:\Program Files\Microsoft SQL Server\Client SDK\ODBC\170\Tools\Binn\sqlcmd.exe),参数填上面的命令 - 注意:任务运行用户必须有数据库连接权限,且「不管用户是否登录都要运行」选项要勾选,否则会失败
Navicat 能帮上什么忙?别指望它自动跑,但能省三件事
虽然不能替代调度,Navicat 在这个流程里仍有实际价值:
- 右键表 →「对象信息」→「统计信息」页签,可手动查看当前直方图和采样率,判断是否真需要更新
- 用「查询」窗口写好
ANALYZE TABLE或UPDATE STATISTICS语句后,点「导出」→「SQL 文件」,直接拿到可复用的脚本内容 - 连接属性里开启「自动提交」并关闭「安全更新」(如果需要),避免脚本执行时被意外拦截
真正容易被忽略的是权限和上下文:系统定时器运行的进程默认没有你的 GUI 用户环境变量,mysql 或 sqlcmd 路径必须写绝对路径,认证方式不能依赖 Navicat 里存的密码——那只是客户端加密存储,命令行根本读不到。


















