我必须创建一个sql查询,使所有用户的名字,中间名或姓氏都包含字符'|'。所以我做了类似的事情:
SELECT two.id,
two.username,
one.firstname,
one.middlename,
one.lastname
FROM table_one one INNER JOIN table_two two ON two.id = one.id
WHERE one.firstname LIKE '%|%'
OR one.middlename LIKE '%|%'
OR one.lastname LIKE '%|%'
该查询在约有1000个配置文件的测试环境中运行良好,但在包含成千上万个配置文件(甚至不接近一百万个)的生产环境中会超时。
我们正在运行DB2,版本8.2
您可以尝试拆分搜索以删除OR
,而该搜索由于性能不佳而臭名昭著:
SELECT
two.id,
two.username,
one.firstname,
one.middlename,
one.lastname
FROM (
SELECT id, firstname, middlename, lastname
FROM table_one
WHERE one.firstname LIKE '%|%'
UNION
SELECT id, firstname, middlename, lastname
FROM table_one
WHERE one.middlename LIKE '%|%'
UNION
SELECT id, firstname, middlename, lastname
FROM table_one
WHERE one.lastname LIKE '%|%'
) one
INNER JOIN table_two two ON two.id = one.id
在每个名称列上都有一个索引,就有机会在单独的联合查询中使用每个索引。
使用onUNION
方便地丢弃重复项,因此在多个名称列包含管道字符的情况下,不会导致重复输出。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句