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
    关注

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

    评论

报告相同问题?

悬赏问题

  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
  • ¥50 成都蓉城足球俱乐部小程序抢票
  • ¥15 yolov7训练自己的数据集
  • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)
  • ¥15 电力市场出清matlab yalmip kkt 双层优化问题
  • ¥30 ros小车路径规划实现不了,如何解决?(操作系统-ubuntu)