我现在有一个表查询, 要用两个字段来都符合条件 来查询结果
SELECT *
FROM orders
WHERE quantity =1 AND customer = 'Tizag'
现在遇到的问题是
现在我们有一组的的数据 要查询 最简单的做法是Java里写一个循环是
for(int i=0;i<listA.size();i++){
SELECT *
FROM orders
WHERE (quantity =listA.get(0) AND customer = listB.get(0))
}
然后一条一条连接数据库查, 这样速度非常慢
或者写成一条语句
SELECT *
FROM orders
WHERE (quantity =listA.get(0) AND customer = listB.get(0))
OR (quantity =listA.get(1) AND customer = listA.get(1))
OR (quantity =listA.get(2) AND customer = listA.get(2))
这个LIST 可能有100K 条记录 这样就造成了SQL 非常的长。
而一条一条查要100K次
数据库是 oracle
大家有什么其他好的建议没有。谢谢。
1.语法错误;
[code="SQL"]select * from orders connect by prior quantity = ? and prior customer =?start with quantity =1 AND customer = 'Tizag' [/code]
改为:
[code="SQL"]select * from orders start with quantity =1 AND customer = 'Tizag' connect by prior quantity = ? and prior customer =?[/code]
2.start with ...connect by prior...是层次查询语法。
语法形式:
[code="Sql"]select level column_name ,expression,... from
table_name
[where where_condition]
start with start_condition
connect by prior prior_condition[/code]
3.该问题并不是层次查询问题。
4.该问题由于你的list中有100k的记录也就是10万条记录。建议
使用临时表分批查询。将查询结果放在临时表中。
需要注意一下几点:
1.采用PrepareStatement,减少硬解析;
2.减少连接次数,不要在循环中频繁查询;
3.为了提高查询效率,创建一个索引,在查询条件中最好
附带上该索引;
4.可以考虑使用缓存技术,mencache等等。
用oralce就好办,使用connect by start with ,下面的问号 不知道你要的是什么字段。。。你自己填上去把
[code="sql"]select * from orders connect by prior quantity = ? and prior customer =?start with quantity =1 AND customer = 'Tizag' [/code]
楼上写的对,我没有测试,随手写的
你说的jdbc写的慢,可能是你查一次创建一次connection,查询不用关闭connection就好了,所有查询完了再关闭连接就可以了
oracle这种查询使用materialized view 也可以很快的解决问题
[quote]oracle这种查询使用materialized view 也可以很快的解决问题
[/quote]
这个是物化视图会占用磁盘空间,这样做不是很好。对于历史查询,采用物化技术比较好他把查询结果的副本备份起来了下次就可以去“物化视图中查”。
刚试了下 connect by start with 这个写法没有错误
物化视图,一般用于统计,空间什么的根本就没什么,多了一张物理表而已,oracle这么强大的功能被你说成这样了。。。。
解决比较复杂的查询,基本都是秒杀,虽然可能维护的麻烦点,但是效率非常高
1.Oracle 是很强大,但在100k数据面前,她也不得不表示很有压力。
2.维护成本已经成为软件生命周期中一个很大的“负担”,系统架构
初期好的设计,良好的开端,会为后期节省很多资源和成本。
SELECT *
FROM orders
WHERE (quantity,customer) IN (
.....直接select这2个字段 from 源头表
)
循环100K次查肯定奇慢无比,不行的,要么就改成存储过程。或者用上面那句IN两个字段的方式一句sql搞定。