相关疑难解决方法(0)

如何确定哪些更有效:DISTINCT还是EXES EXISTS?

例如,我有3个表:user,grouppermission,和他们之间有两个many2many关系:user_groupsgroup_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)

我有足够的经验可以根据解释得出结论.第一个查询有子查询,但我的经验表明第一个查询更快.也许是因为结果中有大量过滤后的权限.

在这个情况下,你会怎么做?为什么?谢谢!

mysql performance inner-join distinct explain

11
推荐指数
1
解决办法
6369
查看次数

加入与EXISTS的表现

一般来说,使用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)

sql teradata

7
推荐指数
1
解决办法
2万
查看次数

如何通过组合表使用JpaSpecificationExecutor创建规范?

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 jpa-2.0 spring-data spring-data-jpa

7
推荐指数
1
解决办法
9550
查看次数