SQL Server 使用分区函数实现查询优化

在项目中遇到一个需求,需要在商家收藏信息中,获取到该商家发布的最新一条商品的发布时间,需求很简单,SQL语句也不复杂,

select T_UserCollectMerchant.CollectID,T_UserCollectMerchant.MerchantID,T_UserCollectMerchant.UserID,T_UserCollectMerchant.AddTime,
        (select top 1 LastUpdate from T_GoodsInfo where MerchantID=T_UserCollectMerchant.MerchantID order by LastUpdate desc) as LastNewTime
from T_UserCollectMerchant
where UserID=19
order by CollectID desc offset 0 row fetch next 40 rows only

但是,当商品数据达到百万级后,这一句代码的执行效率就变得惨不忍睹,经常卡死,

再看看执行计划

商品表的扫描几乎占据了所有cpu资源

于是乎,查询商家最后更新时间的方式必须要优化了

新建了一个视图,内容如下

SELECT * FROM      (SELECT   LastUpdate, MerchantID, (ROW_NUMBER() OVER (PARTITION BY MerchantID ORDER BY LastUpdate DESC)) AS rowid
            FROM  T_GoodsInfo            ) AS T
WHERE   T .rowid < 2

按照商家ID将商品数据分组,并取出最新一条数据的时间

然后将SQL 查询语句更新为:

select T_UserCollectMerchant.CollectID,T_UserCollectMerchant.MerchantID,T_UserCollectMerchant.UserID,
        LastUpdate as LastNewTime
from T_UserCollectMerchant
left join V_GoodsInfo_MerchantCount on V_GoodsInfo_MerchantCount.MerchantID=T_UserCollectMerchant.MerchantID
where userid=19
order by CollectID desc offset 0 row fetch next 40 rows only

重新执行

效率大大提高了

从执行计划看,还可以继续优化,时间关系,暂时到这里

时间: 2024-11-09 15:57:42

SQL Server 使用分区函数实现查询优化的相关文章

SQL Server 2008 分区函数和分区表详解

SQL Server 2008 分区函数和分区表详解 2012-10-28 20:06 来源:博客园 作者:zhijianliutang 字号:T|T [摘要]本文详细介绍SQL Server 2008 分区函数和分区表,包括查询某个分区.归档数据.添加分区.删除分区等内容. 当我们数据量比较大的时候,我们需要将大型表拆分为多个较小的表,则只访问部门数据的查询就可以更快的运行,基本原理就是,因为要扫描的数据变的更小.维护任务(例如,重新生成索引或备份表)也可以更快的运行. 我们可以再不通过将表物

深入浅出SQL Server 2008 分区函数和分区表

原文:深入浅出SQL Server 2008 分区函数和分区表 当我们数据量比较大的时候,我们需要将大型表拆分为多个较小的表,则只访问部门数据的查询就可以更快的运行,基本原理就是,因为要扫描的数据变的更小.维护任务(例如,重新生成索引或备份表)也可以更快的运行. 我们可以再不通过将表物理放置在多个磁盘驱动器上来拆分表的情况下获取分区.如果将某个表放置在一个物理驱动器上,将相关表放置在另一个驱动器上,则可以提高查询性能,因为当运行涉及表间连接的查询时,多个磁盘头同时读取数据.可以使用SQL Ser

SQL Server 2008 分区函数和分区表

当我们数据量比较大的时候,我们需要将大型表拆分为多个较小的表,则只访问部门数据的查询就可以更快的运行,基本原理就是,因为要扫描的数据变的更小.维护任务(例如,重新生成索引或备份表)也可以更快的运行. 我们可以再不通过将表物理放置在多个磁盘驱动器上来拆分表的情况下获取分区.如果将某个表放置在一个物理驱动器上,将相关表放置在另一个驱动器上,则可以提高查询性能,因为当运行涉及表间连接的查询时,多个磁盘头同时读取数据.可以使用SQL Server文件组来指定放置表的磁盘. 对于分区的方式,基本就三种方式

SQL Server表分区详解

原文:SQL Server表分区详解 什么是表分区 一般情况下,我们建立数据库表时,表数据都存放在一个文件里. 但是如果是分区表的话,表数据就会按照你指定的规则分放到不同的文件里,把一个大的数据文件拆分为多个小文件,还可以把这些小文件放在不同的磁盘下由多个cpu进行处理.这样文件的大小随着拆分而减小,还得到硬件系统的加强,自然对我们操作数据是大大有利的. 所以大数据量的数据表,对分区的需要还是必要的,因为它可以提高select效率,还可以对历史数据经行区分存档等.但是数据量少的数据就不要凑这个热

SQL SERVER 表分区

一 .SQL SERVER 表分区介绍: SQL Server  引入的表分区技术,让用户能够把数据分散存放到不同的物理磁盘中,提高这些磁盘的并行处理性能以优化查询性能…… 二 .SQL SERVER 数据库表分区由三个步骤来完成: 1.创建分区函数 2.创建分区架构 3.对表进行分区 基于缓存更新机制,我使用时间来进行分区,这里大家根据业务的要求使用合适的字段来作为分区 创建数据库分区文件数量,这里存储一年的数据分成十二个分区,需要现在D盘建立好Data 的文件夹 里面包含Primary 文件

SQL Server表分区的NULL值问题

SQL Server表分区的NULL值问题 SQL Server表分区只支持range分区这一种类型,往往会被大家吐槽 人家MySQL支持四种类型:RANGE分区.LIST分区.HASH分区.KEY分区 共同点是MySQL跟SQL Server也有分区对齐的问题,都是水平切分,大家都允许分区列存在NULL值 这次我们测试SQL Server表分区的分区列的NULL值,究竟NULL值是被存放在哪个区间,以前一直没有注意 测试脚本 --1.创建文件组 ALTER DATABASE [sss] ADD

SQL Server表分区【转】

转自:http://www.cnblogs.com/knowledgesea/p/3696912.html SQL Server表分区 什么是表分区 一般情况下,我们建立数据库表时,表数据都存放在一个文件里. 但是如果是分区表的话,表数据就会按照你指定的规则分放到不同的文件里,把一个大的数据文件拆分为多个小文件,还可以把这些小文件放在不同的磁盘下由多个cpu进行处理.这样文件的大小随着拆分而减小,还得到硬件系统的加强,自然对我们操作数据是大大有利的. 所以大数据量的数据表,对分区的需要还是必要的

SQL Server数据库ROW_NUMBER()函数使用

下面以几个实例来说明ROW_NUMBER()函数的使用. 实例如下: 1.使用row_number()函数进行编号,如 select email,customerID, ROW_NUMBER() over(order by psd) as rows from QT_Customer 原理:先按psd进行排序,排序完后,给每条数据进行编号. 2.在订单中按价格的升序进行排序,并给每条记录进行排序代码如下: select DID,customerID,totalPrice,ROW_NUMBER() 

SQL SERVER 下PadLeft函数

在.net中,可以使用String.PadLeft函数左对齐字符串,在左边用指定的Unicode字符填充以达到指定的总长度.      例如:在做自动编号这样使用 1: int ID = da.GetMaxNum() + 1; 2: this.tbID.Text = ID.ToString().PadLeft(6, '0'); 1: --在sql中 2: 3: --功能:右对齐的字符,在左边用指定的字符填充以达到指定的总长度. 4: --原始字符 @num:填充字符 @paddingChar:字