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快,因为它不删除重复项,但我想您确实想在这里删除重复项。谢谢,但重复项不是一个问题,而是加快速度。如果我找到一两条记录,那没关系,重要的是有/有一个重复的账户。谢谢你的提示