在PolarDB我加这个好像没起效果?现在查询2 秒,想1 秒以内达不到。
SELECT t1.sell_record_id id,t1.sell_record_id,t1.sell_record_code,t1.deal_code_list,t1.sale_channel_code,t1.store_code,t1.shop_code,t1.express_code,t1.delivery_time,t1.plan_send_time,t1.record_time,t1.pay_time,t1.buyer_name,t1.express_no,t1.express_money,t1.payable_money,t1.paid_money,t1.fx_express_money,t1.fx_payable_money,t1.goods_weigh,t1.goods_num,t1.pay_type,t1.is_back,t1.pay_status,t1.order_status,t1.shipping_status,t1.must_occupy_inv,t1.lock_inv_status,t1.is_pending,t1.is_problem,t1.is_combine_new,t1.is_split_new,t1.is_change_record,t1.is_handwork,t1.is_copy,t1.sale_mode,t1.is_fenxiao,t1.is_rush,t1.is_replenish,t1.order_remark,t1.store_remark,t1.buyer_remark,t1.seller_remark,t1.seller_flag,t1.order_type,t1.is_hx,t1.cn_date,t1.return_status,t1.receiver_name,t1.receiver_phone,t1.receiver_mobile,t1.receiver_address,t1.is_bj,t1.bj_je,t1.invoice_status,main.transport_mode,main.virtual_store_code FROM oms_sell_record t1 LEFT JOIN oms_sell_record_main main ON t1.sell_record_code=main.record_code WHERE t1.shop_code IN('tb002','12697403','13961149','14632902','10688625','10805738','10688722','11665749','13706526','14034891','10783567','14765793','12597064','14398503','13552442','13074907','12854030','12697486','12707476','13552464','13236068','13400475','14594666','14590426','14993880','14994782','15016784','jd034','ht036','ht037','15035749','15070232') AND (t1.store_code IN ('WXCK001','WXCK002','WXCK003','WXCK004','WXCK005','WXCK006','WXCK007','WXCK008','SZCK001','JSJCK001','JSJCK002','JSJCK003','JSJCK004','JSJCK005','JSJCK006','JSJCK007','WXCK001-70','SZCK001-20','CGTEST') OR t1.store_code='' OR t1.store_code is NULL) AND t1.is_problem = 1 AND t1.order_status = 0 ORDER BY t1.record_time DESC,t1.sell_record_id DESC LIMIT 0,2000
根据您提供的查询语句,我注意到您T N 和 IN 子句。这些操作可能会导查询性能下降。以下是一些建议来优:
减少 JOIN 的数量:尽量避免使用过多的 JOIN 操作,因为它们会增加查询的复杂性和执行时间。如果可能的话,尝试将多个表合并为一个表,或者使用子查询来减少 JOIN 的数量。
使用索引:确保在查询中涉及的列上创建了适当的索引。这将帮助数据库更快地查找和过滤数据。例如,您可以在 t1.shop_code、1.store_code 和 t1.is_proble列上创建索引。
限制结果集的大小:使用 LIMIT子句来限制返回的结果数量。这可以减少数据传输和处理的时间。在您的查询中,您已经使用了 LIMIT 0,2000,这意味着只返回前 2000 条记录。这是一个合理的选择,但如果您需要更多的结果,可以考虑分页查询。
优化排序:根据您的查询,您正在按照 t1.record_time 和 t1.sell_record_id 进行排序。确保这两个列都有索引,以加快排序过程。
分析查询计划:使用数据库提供的工具(如 EXPLAIN 或 EXPLAIN ANALYZE)来分析查询计划,并找出潜在的性能瓶颈。根据分析结果,可以进一步优查询。
请注意,这些建议可能需要根据您的具体数据模型和查询需求进行调整。在进行任何更改之前,请务必备份数据并在测试环境中验证更改的影响。
这个走行存的话,默认并行是会在1s内的 ,你可以通过设置 set use_imci_engine = on/off 来看看列存/行存的执行效率,CALL dbms_outln.add_optimizer_outline('', '', 1, '/+ SET_VAR(use_imci_engine=OFF) /', 'SELECT * FROM t1 WHERE id = 1');
通过这样的 outline 可以辅助固化这一条的计划。
此回答整理自钉群“PolarDB专家面对面 - HTAP(列存索引)”
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
阿里云关系型数据库主要有以下几种:RDS MySQL版、RDS PostgreSQL 版、RDS SQL Server 版、PolarDB MySQL版、PolarDB PostgreSQL 版、PolarDB分布式版 。