例如,我有3个表:user,group和permission,和他们之间有两个many2many关系:user_groups和group_permissions.
我需要选择给定用户的所有权限,不重复.每次遇到类似问题时,我都无法确定哪个版本的查询更好:
SELECT permisson_id FROM group_permission WHERE EXISTS(
SELECT 1 FROM user_groups
WHERE user_groups.user_id = 42
AND user_groups.group_id = group_permission.group_id
)
SELECT DISTINCT permisson_id FROM group_permission
INNER JOIN user_groups ON user_groups.user_id = 42
AND user_groups.group_id = group_permission.group_id
Run Code Online (Sandbox Code Playgroud)
我有足够的经验可以根据解释得出结论.第一个查询有子查询,但我的经验表明第一个查询更快.也许是因为结果中有大量过滤后的权限.
在这个情况下,你会怎么做?为什么?谢谢!
一般来说,使用JOIN选择行与EXISTS where子句之间是否存在性能差异?搜索各种问答网站表明联接更有效率,但我记得很久以前在Teradata中学习EXISTS更好.
我确实看到了其他SO答案,像这样和这个,但我的问题是特定于Teradata.
例如,考虑这两个返回相同结果的查询:
select svc.ltv_scr, count(*) as freq
from MY_BASE_TABLE svc
join MY_TARGET_TABLE x
on x.srv_accs_id=svc.srv_accs_id
group by 1
order by 1
Run Code Online (Sandbox Code Playgroud)
-和-
select svc.ltv_scr, count(*) as freq
from MY_BASE_TABLE svc
where exists(
select 1
from MY_TARGET_TABLE x
where x.srv_accs_id=svc.srv_accs_id)
group by 1
order by 1
Run Code Online (Sandbox Code Playgroud)
两个表上的主索引(唯一)是'srv_accs_id'.MY_BASE_TABLE相当大(2亿行),MY_TARGET_TABLE相对较小(200,000行).
EXPLAIN计划有一个显着的区别:第一个表示两个表"通过RowHash匹配扫描"连接,第二个表示"通过全行扫描".两者都说它是"全AMP加入步骤",总估计时间相同(0.32秒).
两个查询都执行相同的操作(我正在使用Teradata 13.10).
类似的实验找到一个比较LEFT OUTER非匹配具有相应的连接是NULL where子句的NOT EXISTS子查询也确实表现出的性能差异:
select svc.ltv_scr, count(*) as freq
from MY_BASE_TABLE svc
left outer join MY_TARGET_TABLE x
on x.srv_accs_id=svc.srv_accs_id …Run Code Online (Sandbox Code Playgroud) 我JpaSpecificationExecutor用于创建自定义查询.如何为以下SQL创建规范?
select * from employee e, address a where e.id=23415 and e.name="Deepak" and a.city="Leeds";
Run Code Online (Sandbox Code Playgroud)
Java类:
public static Specification<Employee> searchEmployee(final Map<String,String> myMap) {
return new Specification<Employee>(){
@Override
public Predicate toPredicate(Root<Employee> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
//Need to query two tables Employee and Address
}
}
Run Code Online (Sandbox Code Playgroud) criteria-api ×1
distinct ×1
explain ×1
inner-join ×1
jpa-2.0 ×1
mysql ×1
performance ×1
spring-data ×1
sql ×1
teradata ×1