如何提高这种SQL性能?

时间:2014-11-05 01:49:40

标签: sql oracle

我做了如下所示的查询。目的是快速搜索订单。用户输入一个关键字,系统返回其属性与该关键字匹配的订单。例如。 keyword =“pan”,应返回与“pan”相关的任何订单记录,例如order's country =“Japan”,或description =“This is pan”。或订单的客户名称=“Pan”,或者订单中有一个名为“pan”的产品。

ORDER_TABLEORDER_DESCRIPTIONORDER_COUNTRY,这些表是一对一的关系。但ORDER_TABLEORDER_PRODUCT是一对多(10-100)的关系。 'ORDER_TABLE'有超过300,000行,ORDER_DESCRIPTIONORDER_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秒来处理。有什么想法改进吗?我听说多次加入并不是一个好主意。所以我尝试使用嵌套子查询,但没有大的改进。

感谢。

1 个答案:

答案 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