【发布时间】:2014-02-05 01:06:45
【问题描述】:
我在下面有一个用于搜索功能的 oracle SQL 查询,它包含在存储过程中。
它运行得很慢。
打开 p_cursor FOR 选择 表A.*, TB_S.someColumn, TB_S.SomeColumn ..
FROM customer_site TableA LEFT JOIN TableB TB on TB.some_id = TableA.some_id LEFT JOIN TableC TB_S on TB_S.Bla_ID = TB.Bla_ID LEFT JOIN TableC TB_CS on TB_CS.Bla2_ID = TB.Bla2_ID LEFT JOIN TableC TB_1 on TB_1.Bla3_ID = TB.Bla3_ID LEFT JOIN TableC TB_2 on TB_DC.Bla4_ID = TB.Bla4_ID LEFT JOIN TableD SP on SP.SP_ID = TableA.SP_ID LEFT JOIN TableC TB_3 on TB_3.Bla5_ID = TB.Bla5_ID LEFT JOIN TableC TB_4 on TB_4.Bla6_ID = TB.Bla6_ID LEFT JOIN TableC TB_5 on TB_5.Bla7_ID = TB.Bla7_ID WHERE (p_nmi IS NULL OR TableA.someid LIKE p_nmi) AND (p_last_name IS NULL OR TableA.last_name LIKE p_last_name) AND (p_full_address IS NULL OR UPPER(assemble_address(flat_number, street_number, street_name, street_suffix, apartment_number, building_name, suburb, state, postcode)) LIKE p_full_address) AND (p_param1 IS NULL OR TB.owner = p_param1) AND (p_param2 IS NULL OR TB.status = p_param2) AND (p_param3 IS NULL OR TB.contact_stage = p_param3) AND (p_param4 IS NULL OR TB.no_access_code = p_param4) AND (p_param5 IS NULL OR TB.defect_code = p_param5) AND (p_param6 IS NULL OR TB.REFUSAL_RESOLUTION = p_param6) AND (p_param7 IS NULL OR TB.DEFECT_LEVEL = p_param7) AND (p_param8 IS NULL OR TB.AMI_CTR_STATUS = p_param8) AND (p_param9 IS NULL OR TableA.meter_route LIKE p_param9) AND (p_param10 IS NULL OR TableA.sp_id = p_param10) AND (p_inTBdent_date_from IS NULL OR TB.inTBdent_date >= p_inTBdent_date_from) AND (p_inTBdent_date_to IS NULL OR TB.inTBdent_date <= p_inTBdent_date_to) AND rownum < 1001 ORDER BY TB.inTBdent_date;
数据库专家可以帮助我如何调整上述查询吗?
谢谢。
【问题讨论】:
-
assemble_address似乎是一个函数。考虑在其上创建基于函数的索引。您也可以尝试更改AND子句,如AND TB.owner = NVL(p_param1,TB.owner)等。 -
如果您仅从
tableA中选择并仅通过tableA和tableB进行过滤,那么为什么其他表上有这么多连接?同样,您正在执行left joins,它不会过滤来自tableA或tableB的任何行。此外,如果您将过滤条件放在where子句中,最好将inner join与tableB放在一起。您是否尝试过在过程之外使用硬编码参数运行此查询?如果您这样做并发布该查询的解释计划,将对我们有所帮助。 -
我的错,选择查询肯定需要从每个已连接的表中获取列。
-
请出示解释计划
标签: sql oracle join query-tuning