使用 ROW_NUMBER 为什么这样查询这么慢的

zuizuisha 2015-11-02 05:57:28
WITH temp AS
(
SELECT ROW_NUMBER() OVER(ORDER BY BD.FitemId DESC) AS RowNo,POS.*,BD.dalei,BD.zhonglei,BD.xiaolei,BD.xilie ,BD.F2C005 AS Whether,BD.f2c006 AS MOQ,BD.F2C007 AS ReadTime,BD.F2C002 AS OEM,BD.F2C003 AS InternalBuy,BD.fenPdate AS StorageData
,ERP_TB.*,ERP_WL.*
,(cast(cast((((POS.SPRICE)/(ERP_TB.fsaleprice))*100)as
decimal(18,0))as varchar)+'%')zklv,(CAST(CAST((((POS.SPRICE-(ERP_TB.forderprice*1.17))/POS.SPRICE)*100)AS DECIMAL(18,1))AS VARCHAR)+'%')gplv
FROM F2C_MANAGE AS BD --F2C_MANAGE本地基础数据
LEFT JOIN
(SELECT MS.FITEMID,MS.FName , cast(MS.forderprice as
decimal(18,2))FOrderprice, cast(MS.fsaleprice as
decimal(18,2))FSaleprice,MS.f_108 AS BarCode, KS.FQty AS KSF2C,TM.FQty AS TMF2C,F2C.FQty AS F2C,MD.FQty AS MDF2C,TI.FNAME AS Country FROM [ERP].[AIS20150111112601].[dbo].T_ICITEM MS
LEFT JOIN
(SELECT FITEMID,FQty FROM [ERP].[AIS20150111112601].[dbo].ICInventory --ICInventory根据门店号获取ITEMID
WHERE FStockId=112411)KS ON KS.FITEMID=MS.FITEMID
LEFT JOIN
(SELECT FITEMID,FQty FROM [ERP].[AIS20150111112601].[dbo].ICInventory --ICInventory根据门店号获取ITEMID
WHERE FStockId=90823)TM ON TM.FITEMID=MS.FITEMID
LEFT JOIN
(SELECT FITEMID,FQty FROM [ERP].[AIS20150111112601].[dbo].ICInventory --ICInventory根据门店号获取ITEMID
WHERE FStockId=109876)F2C ON F2C.FITEMID=MS.FITEMID
LEFT JOIN
(SELECT FITEMID,FQty FROM [ERP].[AIS20150111112601].[dbo].ICInventory --ICInventory根据门店号获取ITEMID
WHERE FStockId=
(select FItemId from [ERP].AIS20150111112601.dbo.t_Stock

where Fname='特卖仓'))MD ON MD.FITEMID=MS.FITEMID--变量
Left join
(SELECT FNAME,FITEMID FROM [ERP].AIS20150111112601.dbo.t_Item) TI on MS.F_114 = TI.FITEMID
WHERE MS.fsaleprice!=0
) as ERP_TB on BD.FITEMID = ERP_TB.FItemID
LEFT JOIN(
-- 查询POS数据
SELECT SOURCE,SPRICE,PPRICE FROM openquery(POS,'
select t1.*,t2.SALE_QTY from (SELECT
TG.CHAIN_NO,MG.MS_NO,MG.GOODS_CD,MG.GOODS_NM,MS.SOURCE,TG.ERP_CD1 AS ERP_CD
,F_GET_MPRICE(TO_CHAR(SYSDATE,''YYYYMMDD''),''0'',MG.MS_NO,MG.GOODS_CD) AS SPRICE
,F_GET_TPRICE(TO_CHAR(SYSDATE,''YYYYMMDD''),''0'',''C001'',MG.GOODS_CD) AS PPRICE
FROM MGOODSTB MG,TGOODSTB TG,MMSSRCTB MS,MMEMBSTB MP
WHERE MG.MS_NO = ''GC0140''
AND MG.MS_NO = MS.MS_NO
AND MG.GOODS_CD = MS.GOODS_CD
AND TG.CHAIN_NO = ''C001''
AND MG.GOODS_CD = TG.GOODS_CD
AND MG.MS_NO = MP.MS_NO
--过滤保留F2C商品
AND F_GET_MPRICE(TO_CHAR(SYSDATE,''YYYYMMDD''),''0'',MG.MS_NO,MG.GOODS_CD)
<> F_GET_TPRICE(TO_CHAR(SYSDATE,''YYYYMMDD''),''0'',''C001'',MG.GOODS_CD)
--
) t1
left join (
SELECT GOODS_CD,SUM(SG.SALE_QTY) SALE_QTY
FROM SGOODSTB SG
WHERE MS_NO=''GC0140''
and SG.SALE_DATE>=20151028
GROUP BY GOODS_CD
) t2
on t1.goods_cd=t2.goods_cd where SPRICE!=0')
) as POS ON POS.SOURCE = ERP_TB.BarCode
LEFT JOIN (
SELECT ERP.EMPAREA,Uuid,FName AS Model,FModel,FName AS Picture,described,wlName,spColour,guige,yongtu,tedian1,wlGw,daxiao
FROM [LOCK2ERPWLWW].[dbo].[M_WLXZMM] MWM,
[LOCK2ERPWLWW].[dbo].[M_WLXZ] MW,[LOCK2ERPWLWW].[dbo].[CM_EMP] ERP
where MW.PUuid=MWM.PUuid AND (gcNumber='' OR gcNumber IS NULL)
and ERP.EMPID=MW.ApplyUser
) AS ERP_WL ON ERP_WL.Model=ERP_TB.FName and ERP_WL.EMPAREA =BD.WLAREA)
SELECT *
FROM temp
WHERE RowNo>3500 and rowno <4300




如果RowNo只一个 会很快 加其他条件没有问题 但是加上and 或者between 超慢 求教
...全文
801 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
zuizuisha 2015-11-03
  • 打赏
  • 举报
回复
给temp表加个RowNo的非聚集索引[/quote] 怎么创建 sql现在还不太熟悉
Yole 2015-11-03
  • 打赏
  • 举报
回复
引用 11 楼 zuizuisha 的回复:
[quote=引用 10 楼 u010192842 的回复:] SELECT * FROM temp WHERE RowNo>3500 and rowno <4300 这一段慢 就给RowNo加个索引
加索引 还要建临时表?[/quote] 给temp表加个RowNo的非聚集索引
zuizuisha 2015-11-03
  • 打赏
  • 举报
回复
引用 10 楼 u010192842 的回复:
SELECT * FROM temp WHERE RowNo>3500 and rowno <4300 这一段慢 就给RowNo加个索引
加索引 还要建临时表?
Yole 2015-11-03
  • 打赏
  • 举报
回复
SELECT * FROM temp WHERE RowNo>3500 and rowno <4300 这一段慢 就给RowNo加个索引
zuizuisha 2015-11-03
  • 打赏
  • 举报
回复
引用 8 楼 u010192842 的回复:
引用 7 楼 zuizuisha 的回复:
[quote=引用 4 楼 xiaoxiangqing 的回复:] 看下执行计划,看慢在哪个地方
为什么使用了根据RowNo between and 查询的时候那么慢 其他的条件都还好
您这个是前面插临时表慢?还是后面查 SELECT * FROM temp WHERE RowNo>3500 and rowno <4300 这个慢啊? 要是前面那个慢,您可以把左联接的语句一个一个网上加,看看是不是左联接的语句慢了。[/quote] SELECT * FROM temp WHERE RowNo>3500 and rowno <4300 这一段慢
Yole 2015-11-03
  • 打赏
  • 举报
回复
引用 7 楼 zuizuisha 的回复:
引用 4 楼 xiaoxiangqing 的回复:
看下执行计划,看慢在哪个地方
为什么使用了根据RowNo between and 查询的时候那么慢 其他的条件都还好
您这个是前面插临时表慢?还是后面查 SELECT * FROM temp WHERE RowNo>3500 and rowno <4300 这个慢啊? 要是前面那个慢,您可以把左联接的语句一个一个网上加,看看是不是左联接的语句慢了。
zuizuisha 2015-11-03
  • 打赏
  • 举报
回复
引用 4 楼 xiaoxiangqing 的回复:
看下执行计划,看慢在哪个地方
为什么使用了根据RowNo between and 查询的时候那么慢 其他的条件都还好
zuizuisha 2015-11-03
  • 打赏
  • 举报
回复
引用 5 楼 u010192842 的回复:
发一下执行计划,看看是不是缺索引。
Yole 2015-11-03
  • 打赏
  • 举报
回复
发一下执行计划,看看是不是缺索引。
xiaoxiangqing 2015-11-03
  • 打赏
  • 举报
回复
看下执行计划,看慢在哪个地方
zuizuisha 2015-11-03
  • 打赏
  • 举报
回复
引用 1楼shoppo0505 的回复:
between是全表搜索的,不会用index。 可以尝试先把所有数据插入表,再把不需要删除。
除了放临时表还有别的方法么
zuizuisha 2015-11-03
  • 打赏
  • 举报
回复
除了存放临时表还有别的办法吗
shoppo0505 2015-11-02
  • 打赏
  • 举报
回复
between是全表搜索的,不会用index。 可以尝试先把所有数据插入表,再把不需要删除。

34,575

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧