我做了如下所示的查询。目的是快速搜索订单。用户输入一个关键字,系统返回其属性与该关键字匹配的订单。例如。 keyword =“pan”,应返回与“pan”相关的任何订单记录,例如order's country =“Japan”,或description =“This is pan”。或订单的客户名称=“Pan”,或者订单中有一个名为“pan”的产品。
ORDER_TABLE
,ORDER_DESCRIPTION
,ORDER_COUNTRY
,这些表是一对一的关系。但ORDER_TABLE
和ORDER_PRODUCT
是一对多(10-100)的关系。 'ORDER_TABLE'有超过300,000行,ORDER_DESCRIPTION
,ORDER_COUNTRY
也是如此。 ORDER_PRODUCT
有大约1500,000行。
但由于数据库存储大量数据,因此速度非常慢。
SELECT ot.id, od.description, oc.country_name
FROM ORDER_TABLE ot
LEFT JOIN ORDER_DESCRIPTION od ON ot.id = od.id
LEFT JOIN ORDER_COUNTRY oc ON ot.id = oc.id
LEFT JOIN ORDER_PRODUCT op ON ot.id = op.id
WHERE ot.delete!='Y' AND od.delete!='Y' AND ot.create_date >= SYSDATE - 90
AND
(
ot.id like '%KEYWORD%'
OR UPPER(od.description) LIKE '%KEYWORD%'
OR UPPER(ot.version) LIKE '%KEYWORD%'
OR UPPER(oc.country_name) LIKE '%KEYWORD%'
...(many columns are used to match that keyword)
OR UPPER(op.product_name) LIKE '%KEYWORD%'
)
GROUP BY (...)
ORDER BY ot.id
此查询非常慢。通常需要35秒来处理。有什么想法改进吗?我听说多次加入并不是一个好主意。所以我尝试使用嵌套子查询,但没有大的改进。
感谢。
答案 0 :(得分:1)
尝试直接在join
中使用AND子句中的AND检查SELECT ot.id, od.description, oc.country_name
FROM ORDER_TABLE ot
LEFT JOIN ORDER_DESCRIPTION od ON ot.id = od.id AND ot.delete!='Y' AND od.delete!='Y' AND ot.create_date >= SYSDATE - 90
LEFT JOIN ORDER_COUNTRY oc ON ot.id = oc.id
LEFT JOIN ORDER_PRODUCT op ON ot.id = op.id
WHERE
(
ot.id like '%KEYWORD%'
OR UPPER(od.description) LIKE '%KEYWORD%'
OR UPPER(ot.version) LIKE '%KEYWORD%'
OR UPPER(oc.country_name) LIKE '%KEYWORD%'
...(many columns are used to match that keyword)
OR UPPER(op.product_name) LIKE '%KEYWORD%'
)
GROUP BY (...)
ORDER BY ot.id