我有一个类似于下面的sql命令。
select * from table1
where table1.col1 in (select columnA from table2 where table2.keyColumn=3)
or table1.col2 in (select columnA from table2 where table2.keyColumn=3)
它的性能非常差,所以如何更改此命令? (请注意,paranthesis中的两个sql命令完全相同。)
答案 0 :(得分:2)
这是您的查询:
select *
from table1
where table1.col1 in (select columnA from table2 and t2.keyColumn = 3) or
table1.col2 in (select columnA from table2 and t2.keyColumn = 3);
可能最好的方法是在table2(keyColumn, columnA)
上建立一个索引。
in
也可能具有较差的性能特征。因此,您可以尝试将其重写为exists
查询:
select *
from table1 t1
where exists (select 1 from table2 t2 where t2.columnA = t1.col1 and t2.keyColumn = 3) or
exists (select 1 from table2 t2 where t2.columnA = t2.col1 and t2.keyColumn = 3);
在这种情况下,适当的索引是table2(columnA, keyColumn)
。
答案 1 :(得分:2)
尝试
select distinct t1.* from table1 t1
inner join table2 t2 ON t1.col1 =t2.columnA OR t1.col2 = t2.columnA
答案 2 :(得分:1)
假设您在VFP中执行此操作,请使用SYS(3054)查看查询是如何优化的以及哪些部分不是。
答案 3 :(得分:0)
主查询和子查询是否完全可以Rushmore优化?
由于子查询似乎没有相关性(即它们不引用table1,只要索引完全支持所有内容,你应该没问题。