Glaer 2015-02-02 04:03 采纳率: 0%
浏览 1833

X亿级数据检索速度优化难题,高手进

各位高手,目前碰到一个X亿级数据检索速度优化的难题,大家帮看看怎么解决。

涉及到的表有:
KeywordIndex:2.7亿条记录
Original:1014万条记录

KeywordIndex表包括四个字段,ID(PK,int)、KeywordID(int)、OriginalID(int)、ColumnID(int)
建立的索引:
PK_KeywordIndex([ID] ASC)
IX_KeywordIndex_KeywordID([KeywordID] ASC,包含[OriginalID]列)

业务需求是从KeywordIndex表中查找到同时符合多个KeywordID的记录(交集),然后根据这个交集从Original表中取出相应记录、排序后取出前X条

基本的语句如下SELECT * FROM ( SELECT OuterID AS ResultID, ROW_NUMBER() OVER(Order by Weights Desc, ProAddtime Desc) AS RowNum FROM Original Where
ID IN (
SELECT OriginalID FROM KeywordIndex WHERE KeywordID = 1933
INTERSECT
SELECT OriginalID FROM KeywordIndex WHERE KeywordID = 1932
INTERSECT
SELECT OriginalID FROM KeywordIndex WHERE KeywordID = 1934
INTERSECT
SELECT OriginalID FROM KeywordIndex WHERE KeywordID = 1935
INTERSECT
SELECT OriginalID FROM KeywordIndex WHERE KeywordID = 1931
INTERSECT
SELECT OriginalID FROM KeywordIndex WHERE KeywordID = 14
INTERSECT
SELECT OriginalID FROM KeywordIndex WHERE KeywordID = 21
INTERSECT
SELECT OriginalID FROM KeywordIndex WHERE KeywordID = 20
INTERSECT
SELECT OriginalID FROM KeywordIndex WHERE KeywordID = 23
INTERSECT
SELECT OriginalID FROM KeywordIndex WHERE KeywordID = 22
INTERSECT
SELECT OriginalID FROM KeywordIndex WHERE KeywordID = 24
) ) AS T WHERE RowNum > 0 AND RowNum < 21

现在的问题是,上面的语句包含11个KeywordID ,查询速度需要18秒,怎样能够优化到3秒以内?
测试发现,如果符合某一个KeywordID记录数较少的话(比如几万条),查询可以再1秒内完成
如果减少KeywordID 数量,能较少一定的时间(去掉几个KeywordID ,时间在13秒左右),但并不明显
感觉主要的耗时在INTERSECT上。

我试过对KeywordIndex 分区,每5000万一个分区,按ID左右分区依据,没有效果
上面的SQL语句中,已经是按照KeywordID记录数从少到多拼接的KeywordID = 1933(346613条记录) , KeywordID = 24(10080873条记录)

执行计划如下:
SQL Server 分析和编译时间:
CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。

SQL Server 执行时间:
CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。
SQL Server 分析和编译时间:
CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。

(20 行受影响)
表 'Worktable'。扫描计数 0,逻辑读取 0 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'KeywordIndex'。扫描计数 11,逻辑读取 121615 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'Original'。扫描计数 1,逻辑读取 350977 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。

(31 行受影响)

(1 行受影响)

SQL Server 执行时间:
CPU 时间 = 15366 毫秒,占用时间 = 15479 毫秒。

SQL Server 执行时间:
CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。
SQL Server 分析和编译时间:
CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。

希望各位高手帮忙指点一下,方向不限,优化SQL,更改表结构、索引,更改实现方式,换数据库都可以,非常感谢

  • 写回答

3条回答 默认 最新

  • 我不懂电脑 2015-02-02 04:30
    关注

    这种问题很难回答,需要根据具体情况,慢慢调测

    评论

报告相同问题?

悬赏问题

  • ¥30 软件自定义无线电该怎样使用
  • ¥15 R语言mediation包做中介分析,直接效应和间接效应都很小,为什么?
  • ¥15 Jenkins+k8s部署slave节点offline
  • ¥15 如何实现从tello无人机上获取实时传输的视频流,然后将获取的视频通过yolov5进行检测
  • ¥15 WPF使用Canvas绘制矢量图问题
  • ¥15 用三极管设计一个单管共射放大电路
  • ¥15 孟德尔随机化r语言运行问题
  • ¥15 pyinstaller编译的时候出现No module named 'imp'
  • ¥15 nirs_kit中打码怎么看(打码文件是csv格式)
  • ¥15 怎么把多于硬盘空间放到根目录下