WebcatEE 查询限制


查询限制

WebcatEE 根据管理员的设置在查询页面最多只显示 N 条数据,且不自动分页。

1. WebcatEE 会自动为查询 sql 添加加 limit 子句或者 fetch 子句,确保查询出来的结果集只有 N 条,如果要查询更多数据,请使用 where 子句 或者 limit 子句限制。

例如: where id > 200, 或者 limit 200, 如果sql中的 limit 子句中的条数大于 N, WebcatEE 会自动修改为 N, 例如:limit 500, 1000; 实际执行的是 limit 500, 200;

查询编辑器控制台会同时显示输入的 SQL 和 真正执行的 SQL;

2. 页面上也不会展示过多的数据,如果数据量大,浏览器也撑不住;

3. 查询结果不自动进行分页,如果sql本身查询性能不佳,自动分页可能导致生产受到严重影响。一旦有自动分页,没人会愿意手动改sql, 强迫用户使用 where 条件,才可能使用更高效的查询方式;

4. WebcatEE 支持配置查询间隔,即两次查询的时间间隔,防止用户使用AJAX方式绕过审核导出数据。

不同的数据库对于大结果集的处理方式不同,例如 MySql: select * from mytable;

对于大结果集的sql, MySQL 服务器会先在服务端准备数据并传输给客户端,如果mytable数据量很大,还会使用临时表,这种操作对服务器是有影响的,而且客户端的响应速度明显下降,大表可能导致n秒之后才会响应;

所以客户端应该尽量限制查询结果集的大小,开发人员应该尽量在每个查询上都使用明确的 where 子句或者 limit 子句进行限制,WebcatEE 也会自动加 limit 以限制结果集的大小,提升响应速度。

MySQL 大数据集会导致客户端响应速度明显下降,可能需要n秒才能收到第一批数据,JDBC中可以通过 setFetchSize 提升响应速度,但仍属于治标不治本的办法。

Oracle 和 SQLServer, DB2 等均没有这种情况。但WebcatEE 仍然会使用 top 或者 fetch 子句对结果集限制,目的都是为了生产环境的安全。

Oracle12 之前的版本不支持 fetch 子句,只能使用 rownum 限制结果集,但是对于复杂查询 rownum 可能产生歧义。

WebcatEE 会自动判断版本,如果 Oracle 的版本不支持 fetch 子句,将不会加任何限制,也不会使用 rownum,因为 rownum 限制出来的结果集可能是错的。

所以版本低于12的 Oracle 请尽量使用 where 子句或者语义明确的 rownum 限制结果集的大小;

Redis 查询限制

WebcatEE 仅在 Redis 配置为单机模式时允许使用模糊查询,且仅支持向下翻页。

如果 Redis 配置为集群模式,必须输入完整的 key 名才能查询到结果。

WebcatEE 不支持也不会遍历集群内的所有的 Redis 实例和所有的 key。