急!如果和优化大量数据的join

a793682400 2017-07-26 02:48:19
有个标签表有大概50w的数据.每个用户多的有30多标签.查询的标签的时候是查询某个标签的所有用户去join另外的标签的所有用户.所以查询标签数量多的话会执行的很慢,求解决方案!!!!
...全文
203 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
二月十六 2017-07-26
  • 打赏
  • 举报
回复
引用 4 楼 a793682400 的回复:
[quote=引用 3 楼 sinat_28984567 的回复:] [quote=引用 2 楼 a793682400 的回复:] [quote=引用 1 楼 sinat_28984567 的回复:] 楼主先把目前的查询语句发上来看看,另外没太看明白join 另外的标签的所有用户什么意思
select a.用户id,count(a.删除标记) over(partition by a.删除标记) as ct from 用户表 a join ( select distinct 用户id from 标签表 where 用户id>0 and 删除标记=0 and 一级标签=1) as a0 on a.用户id = a0.用户id join ( select distinct 标签表 from tblObjectTags where 用户id >0 and 删除标记=0 and 一级标签=56) as a1 on a.用户id= a1.用户id 大概就是这么个意思,这里查询两个标签的时候,如果是20个标签就要join20次 速度很慢[/quote] 试试这样可以吗
SELECT  a.用户id ,
        COUNT(a.删除标记) OVER ( PARTITION BY a.删除标记 ) AS ct
FROM    用户表 a
        JOIN ( SELECT   用户id ,
                        COUNT(DISTINCT 一级标签) AS count
               FROM     标签表
               WHERE    用户id > 0
                        AND 删除标记 = 0
                        AND 一级标签 IN ( 1, 56 )  --把条件都写到这里
               GROUP BY 用户id
               HAVING   COUNT(DISTINCT 一级标签) = 2  --这里等于条件数量
             ) AS a0 ON a.用户id = a0.用户id
[/quote] 这个标签有四级的.. [/quote] 那可以写四个where条件和四个having判断
a793682400 2017-07-26
  • 打赏
  • 举报
回复
引用 3 楼 sinat_28984567 的回复:
[quote=引用 2 楼 a793682400 的回复:] [quote=引用 1 楼 sinat_28984567 的回复:] 楼主先把目前的查询语句发上来看看,另外没太看明白join 另外的标签的所有用户什么意思
select a.用户id,count(a.删除标记) over(partition by a.删除标记) as ct from 用户表 a join ( select distinct 用户id from 标签表 where 用户id>0 and 删除标记=0 and 一级标签=1) as a0 on a.用户id = a0.用户id join ( select distinct 标签表 from tblObjectTags where 用户id >0 and 删除标记=0 and 一级标签=56) as a1 on a.用户id= a1.用户id 大概就是这么个意思,这里查询两个标签的时候,如果是20个标签就要join20次 速度很慢[/quote] 试试这样可以吗
SELECT  a.用户id ,
        COUNT(a.删除标记) OVER ( PARTITION BY a.删除标记 ) AS ct
FROM    用户表 a
        JOIN ( SELECT   用户id ,
                        COUNT(DISTINCT 一级标签) AS count
               FROM     标签表
               WHERE    用户id > 0
                        AND 删除标记 = 0
                        AND 一级标签 IN ( 1, 56 )  --把条件都写到这里
               GROUP BY 用户id
               HAVING   COUNT(DISTINCT 一级标签) = 2  --这里等于条件数量
             ) AS a0 ON a.用户id = a0.用户id
[/quote] 这个标签有四级的..
二月十六 2017-07-26
  • 打赏
  • 举报
回复
引用 2 楼 a793682400 的回复:
[quote=引用 1 楼 sinat_28984567 的回复:] 楼主先把目前的查询语句发上来看看,另外没太看明白join 另外的标签的所有用户什么意思
select a.用户id,count(a.删除标记) over(partition by a.删除标记) as ct from 用户表 a join ( select distinct 用户id from 标签表 where 用户id>0 and 删除标记=0 and 一级标签=1) as a0 on a.用户id = a0.用户id join ( select distinct 标签表 from tblObjectTags where 用户id >0 and 删除标记=0 and 一级标签=56) as a1 on a.用户id= a1.用户id 大概就是这么个意思,这里查询两个标签的时候,如果是20个标签就要join20次 速度很慢[/quote] 试试这样可以吗
SELECT  a.用户id ,
        COUNT(a.删除标记) OVER ( PARTITION BY a.删除标记 ) AS ct
FROM    用户表 a
        JOIN ( SELECT   用户id ,
                        COUNT(DISTINCT 一级标签) AS count
               FROM     标签表
               WHERE    用户id > 0
                        AND 删除标记 = 0
                        AND 一级标签 IN ( 1, 56 )  --把条件都写到这里
               GROUP BY 用户id
               HAVING   COUNT(DISTINCT 一级标签) = 2  --这里等于条件数量
             ) AS a0 ON a.用户id = a0.用户id
a793682400 2017-07-26
  • 打赏
  • 举报
回复
引用 1 楼 sinat_28984567 的回复:
楼主先把目前的查询语句发上来看看,另外没太看明白join 另外的标签的所有用户什么意思
select a.用户id,count(a.删除标记) over(partition by a.删除标记) as ct from 用户表 a join ( select distinct 用户id from 标签表 where 用户id>0 and 删除标记=0 and 一级标签=1) as a0 on a.用户id = a0.用户id join ( select distinct 标签表 from tblObjectTags where 用户id >0 and 删除标记=0 and 一级标签=56) as a1 on a.用户id= a1.用户id 大概就是这么个意思,这里查询两个标签的时候,如果是20个标签就要join20次 速度很慢
二月十六 2017-07-26
  • 打赏
  • 举报
回复
楼主先把目前的查询语句发上来看看,另外没太看明白join 另外的标签的所有用户什么意思

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧