分页多表联查和效率问题


先看一个较常见的多表联查时的分页:
SELECT TOP (30) T_EVENTS.EVENT_TIME,T_EVENTS.CATALOG_ID,T_USERS.USER_NAME,T_HOSTS.HOST_NAME,T_HOSTS.HOST_ADDRESS,EVENT_NAME,EVENT_CONTENT
FROM T_CATALOGS,T_EVENTS,T_USERS,T_HOSTS
WHERE T_CATALOGS.CATALOG_ID = T_EVENTS.CATALOG_ID and T_CATALOGS.USER_ID = T_USERS.USER_ID and T_CATALOGS.HOST_ID = T_HOSTS.HOST_ID and
(T_EVENTS.EVENT_TIME NOT IN    
    (SELECT TOP (3030) EVENT_TIME
     FROM T_CATALOGS,T_EVENTS,T_USERS,T_HOSTS
     where T_CATALOGS.CATALOG_ID = T_EVENTS.CATALOG_ID and T_CATALOGS.USER_ID = T_USERS.USER_ID and T_CATALOGS.HOST_ID = T_HOSTS.HOST_ID 
     and (EVENT_FLAG = 103)    
     ORDER BY T_EVENTS.EVENT_TIME  DESC)
    )     
AND (EVENT_FLAG = 103)   
ORDER BY T_EVENTS.EVENT_TIME  DESC

这条语句是以30条为一页,查询第101页的数据(30*101 = 3030),当T_EVENTS表中的记录有26000行,其余表中的记录都在50行左右时,查询耗时在4分钟到5分钟之间。
有谁能承受这样的效率呢?

看看下面的分页查询
SELECT TOP(30) EVENT_TIME,CATALOG_ID,USER_NAME,HOST_NAME,HOST_ADDRESS,EVENT_NAME,EVENT_CONTENT,EVENT_TIME
FROM (
        SELECT ROW_NUMBER() OVER (ORDER BY V_REGION_SALES.EVENT_TIME) AS RowNumber,* FROM V_REGION_SALES WHERE   V_REGION_SALES.[USER_NAME]='devlop'
AND V_REGION_SALES.[EVENT_FLAG]=103 
        ) A
WHERE RowNumber > 30*(63)

它的耗时不到1秒,效率是第一条语句100倍以上,甚至更高。产生这么大效率的关键在哪里呢?分页的机制!
ROW_NUMBER() OVER (ORDER BY V_REGION_SALES.EVENT_TIME) AS RowNumber
是这里的关键,他以EVENT_TIME排序,建立起了一个带行号的子查询,利用行号进行分页控制,去掉了分页控制中的各种复杂条件,这是提升查询效率的关键。

提升效率还有一个隐含因素---数据库视图,上面的语句是从视图中查出结果的。

CREATE VIEW V_REGION_SALES AS
SELECT T_EVENTS.EVENT_TIME,T_EVENTS.CATALOG_ID,T_USERS.USER_NAME,T_HOSTS.HOST_NAME,T_HOSTS.HOST_ADDRESS,T_EVENTS.EVENT_NAME,T_EVENTS.EVENT_CONTENT,T_EVENTS.EVENT_FLAG
FROM T_EVENTS
LEFT JOIN T_CATALOGS ON T_EVENTS.CATALOG_ID = T_CATALOGS.CATALOG_ID
LEFT JOIN T_USERS ON T_CATALOGS.USER_ID = T_USERS.USER_ID
LEFT JOIN T_HOSTS ON T_CATALOGS.HOST_ID = T_HOSTS.HOST_ID

 

这种分页查询效率很高,但却很少有资料提及。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wolfseek

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值