问题描述
- 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,更改表结构、索引,更改实现方式,换数据库都可以,非常感谢
解决方案
这种问题很难回答,需要根据具体情况,慢慢调测
解决方案二:
没有这样的数据,没有经验,你可以把数据传给我分析一下吗,让我来试试。
我的邮箱14707253
解决方案三:
看你的sql,感觉OriginalID 跟 KeywordID 应该是多对多的。
那么你可以先查出KeywordID in(11个数) 的数据集,然后对OriginalID 进行group by 求和,having count(1) = 11的数据,就是你要的数据了。
最后在用你的外层语句把这个子集包起来。
只是提供个想法,换个思路。