Postgresql 优化多个或多个查询

Postgresql 优化多个或多个查询,postgresql,sqlperformance,sql-optimization,Postgresql,Sqlperformance,Sql Optimization,我有一个数据库表,需要在其中验证用户是否输入了相同或部分相同的信息 这就是我的想法 数据库布局 rec_id (pk), user_id, name, phone, address_1, address_2, zip, company, co_phone, co_address_1, co_address_2, co_zip, billing, bi_phone, bi_address_1, bi_address_2, bi_zip 询问 SELECT rec_id FROM tbl_n

我有一个数据库表,需要在其中验证用户是否输入了相同或部分相同的信息

这就是我的想法

数据库布局

rec_id (pk), user_id,
name, phone, address_1, address_2, zip, 
company, co_phone, co_address_1, co_address_2, co_zip, 
billing, bi_phone, bi_address_1, bi_address_2, bi_zip
询问

SELECT rec_id 
FROM tbl_name
WHERE user_id = '123456789'
OR '1112223333' IN (phone, co_phone, bi_phone)
OR 'John Doe' IN (name, business, billing)
OR '12345' IN (zip, co_zip, bi_zip)
OR '123 main street' IN (address_1, co_address_1, bi_address_1)
OR 'po box 123' IN (address_2, co_address_2, bi_address_2)
如果任何数据匹配(是的,将是误报),我需要旧的记录id

想知道有没有更好的方法


感谢

为了使此查询能够很好地执行,您需要为正在测试的每一列创建单独的索引。所有列上的组合索引对于或条件都没有任何帮助(但如果您有AND,则会有所帮助)

但是,我可以想象,无论添加了哪些索引,查询都会导致完整的表扫描。您可能希望尝试使用联合,而不是或看看这是否会有所不同:

SELECT rec_id FROM tbl_name WHERE tax_id = '123456789'
UNION
SELECT rec_id FROM tbl_name WHERE phone = '1112223333'
UNION
SELECT rec_id FROM tbl_name WHERE co_phone = '1112223333'
UNION
SELECT rec_id FROM tbl_name WHERE bi_phone = '1112223333'
UNION
SELECT rec_id FROM tbl_name WHERE name = 'John Doe'
UNION
SELECT rec_id FROM tbl_name WHERE business = 'John Doe'
UNION
SELECT rec_id FROM tbl_name WHERE billing = 'John Doe'
UNION
-- etc...

这样重写的想法是,现在每个子查询都可以使用一个索引(当然,假设您已经添加了必要的索引)

嗯,很有意思,可能得试试这个。@Phill Pafford:UNION ALL比UNION快,因为它不删除重复项,但我想您确实想在这里删除重复项。谢谢,但重复项不是一个问题,而是加快速度。如果我找到一两条记录,那没关系,重要的是有/有一个重复的账户。谢谢你的提示