千万级数据查询索引问题

KeepMoving 2016-11-22 10:00:21
各位大神好,我现在遇到一个问题:一个表里的数据量为6000万,表中DeviceToken字段因历史原因可能会出现重复(重复量几十条),我现在想查出重复的DeviceToken所在的行,并删除掉,但执行速度特别慢,我看了下查询计划(不是很懂这个),发现开销主要集中在排序上,而且索引走的是Index Scan,不知道该怎么来优化,还请大神指点一下。谢谢了。
表结构级索引

执行计划

DeviceToken,DeviceId,CityId已经建立了索引
...全文
368 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
gw6328 2016-11-24
  • 打赏
  • 举报
回复
这个是全表里面去查,所以这里谈不上索引不索引的,因为都要查一遍。 可以用你那个号把数据分成几段来处理,加上手工记录。 如果能查出来,你就一次性查出来处理即可。
KeepMoving 2016-11-22
  • 打赏
  • 举报
回复
好的,我先查查看,谢谢@中国风
中国风 2016-11-22
  • 打赏
  • 举报
回复
那是查出来有重复的TOKEN,查一下你的索引是否有碎片,百分比过大要经常重建或整理维护 你的数据量过量放在单表影响性能是一定会存在的,可以的情况下尝试用分区表或分区索引去处理
KeepMoving 2016-11-22
  • 打赏
  • 举报
回复
谢谢@roy_88的回答,可以我执行了下,30秒还是未返回结果,我只是查了下Top100的
中国风 2016-11-22
  • 打赏
  • 举报
回复
只保留下最新一条记录时,把你的语句直接改为DELETE测测性能 e.g.

DELETE  t
FROM    ( SELECT    * ,
                    ROW_NUMBER() OVER ( PARTITION BY DeviceToken ORDER BY did DESC ) AS RN
          FROM      push_device
        ) AS t
WHERE   t.RN > 1;
中国风 2016-11-22
  • 打赏
  • 举报
回复
--DeviceToken
SELECT DeviceToken FROM push_device WITH(NOLOCK) GROUP BY DeviceToken HAVING COUNT(*)>1
中国风 2016-11-22
  • 打赏
  • 举报
回复
SELECT did FROM push_device WITH(NOLOCK) GROUP BY did HAVING COUNT(*)>1

27,580

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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