SQL2005中大数据量检索的分页收藏

仅列出实例SQL,其他的请大家自己完成吧

@StartIndex为当前页起始序号,@EndIndex为当前页结束记录序号,可以直接作为参数输入,也可以通过输入PageSize和PageIndex计算得出

select * from
(
select *,row_number() over(order by OrderColumn) as orderindex from TableName
) as a
where a.orderindex between @StartIndex and @EndIndex

/** * @param node 相关账号 * @param text title搜索 * @param status 1=已删除 * @param pageNum * @param pageSize * @return */ @RequestMapping("/getTitles1") @ResponseBody public ResultBean getTitles( @RequestParam(value = "node", required = false) String node, @RequestParam(value = "text", required = false) String text, @RequestParam(value = "status", required = false, defaultValue = "0") String status, @RequestParam(value = "userName", required = false, defaultValue = "") String userName, @RequestParam(value = "pageNum", defaultValue = "1") int pageNum, @RequestParam(value = "pageSize", defaultValue = "100") int pageSize) { ResultBean resultBean = new ResultBean(); List<Object> params = new ArrayList<>(); String baseSql = "FROM ( SELECT *, COUNT( title ) OVER ( PARTITION BY title ) AS titleCount FROM titles ) AS subquery WHERE DATE(createtime) = CURDATE()"; //如果权限不是3的账号不查xw1的数据 if(!userName.equals("111111") && !userName.equals("htt") && !userName.equals("chencheng")){ baseSql+=(" AND node != 'xw1' and node!='cc1'"); } // 动态构建WHERE条件 StringBuilder condition = new StringBuilder(); if (StringUtils.hasText(node)) { // 按逗号拆分 String[] nodes = node.split(","); // 动态生成占位符 (?, ?, ?) String placeholders = String.join(",", Collections.nCopies(nodes.length, "?")); condition.append(" AND node IN (" + placeholders + ")"); // 添加所有参数 for (String n : nodes) { params.add(n.trim()); } } //查询删除状态的时候才添加条件,默认状态的时候查询所有 由前端过滤掉已删除的数据 防止删除的时候页码跳转漏掉部分题 if ("1".equals(status)) { condition.append(" AND status = ?"); params.add(status); } if (StringUtils.hasText(text)) { condition.append(" AND title LIKE ?"); params.add("%" + text + "%"); } // 分页参数计算 int offset = (pageNum - 1) * pageSize; params.add(pageSize); params.add(offset); String orderBy; if (status.equals("1")) { orderBy = "updatetime"; } else { orderBy = "createtime"; } // 查询SQL String querySql = "SELECT * " + baseSql + condition + " ORDER BY " + orderBy + " ASC LIMIT ? OFFSET ?"; List<Titles> results = jdbcTemplate.query(querySql, params.toArray(), (rs, rowNum) -> { Titles obj = new Titles(); obj.setTitle(rs.getString("title")); obj.setUpdatenode(rs.getString("updatenode")); obj.setUpdatetime(rs.getString("updatetime")); obj.setStatus(rs.getString("status")); obj.setCreatetime(rs.getString("createtime")); obj.setNode(rs.getString("node")); obj.setRemark(rs.getString("remark")); obj.setTitleCount(rs.getString("titleCount")); return obj; }); // 总数SQL(复用条件) String countSql = "SELECT COUNT(*) " + baseSql + condition; // 移除分页参数(最后两个参数是pageSize和offset) List<Object> countParams = params.subList(0, params.size() - 2); int total = jdbcTemplate.queryForObject(countSql, Integer.class, countParams.toArray()); // 封装分页信息 Map<String, Object> pageInfo = new HashMap<>(); pageInfo.put("list", results); pageInfo.put("total", total); pageInfo.put("pageNum", pageNum); pageInfo.put("pageSize", pageSize); pageInfo.put("pages", (int) Math.ceil((double) total / pageSize)); resultBean.setCode(200); resultBean.setData(pageInfo); return resultBean; } 帮我优化一下这个sql,在几十万表中查询性能很差
09-20
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值