100分求教Oracle 组合查询性能提升

七爷 2011-10-13 05:46:05
分页查询的

Tb_Trans表(主表) 要查询出的数据列ItemName,ItemId
Tb_Item 表(次表) 要查询的关联列 ItemName(别名 PPName),DistId

要求过滤 主表Tb_Trans中的相同ItemName列且不为空,主表Tb_Trans 中的DistId不为空且在 次表Tb_Item 中DistId字段对应,下面是我写的sql,功能倒是满足,但性能有点慢,我是在20W数据中抓的发现从第一页到第二页用时20秒,望前辈们指点


select * from(select a.ItemName,a.ItemId,c.ItemName as PPName,d.distId from Tb_Trans a
left join tb_item c on c.ItemId=a.ItemId
inner join tb_Item d on d.distId=a.distId
where a.ItemName is not null and d.distId is not null
group by a.ItemName,a.ItemId,c.ItemName,d.distId)
where rownum<=80
minus
select * from(select a.ItemName,a.ItemId,c.ItemName as PPName,d.distId from Tb_Trans a
left join tb_item c on c.ItemId=a.ItemId
inner join tb_Item d on d.distid=a.distId
where a.ItemName is not null and d.distId is not null
group by a.ItemName,a.ItemId,c.ItemName,d.distId)
where rownum<=60
...全文
260 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
七爷 2011-10-14
  • 打赏
  • 举报
回复
顶啊,这么快沉了
七爷 2011-10-14
  • 打赏
  • 举报
回复
再顶一下,有没有高手了?
lcaiyhh 2011-10-14
  • 打赏
  • 举报
回复
可能是left join 跟is net null引起的

你把left 去掉 直接用join

把is not null这个条件去掉

看会不会快起来,如果是,问题就出在这了·看看有什么办法代替left join,或其它的方法
xiangaylian 2011-10-14
  • 打赏
  • 举报
回复
就你两个人聊了大半天啊,围观下。。
七爷 2011-10-13
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 roy_88 的回复:]
沒Oracle環境,改一下別名試試

SQL code




select ItemName,ItemId,PPName,distId
FROM
(
select
a.ItemName,a.ItemId,c.ItemName as PPName,d.distId,ROW_NUMBER()OVER(ORDER BY a.ItemName) AS Num
fro……
[/Quote]
前辈,这个先不讨论,如果对于这样的查询在sqlserver中有什么好的优化方法吗?该用索引的我也用了,在该成存储过程,还有别的方面东西能介绍介绍吗?今天是第一次碰到大量数据几张表组合查询的
中国风 2011-10-13
  • 打赏
  • 举报
回复
沒Oracle環境,改一下別名試試



select ItemName,ItemId,PPName,distId
FROM
(
select
a.ItemName,a.ItemId,c.ItemName as PPName,d.distId,ROW_NUMBER()OVER(ORDER BY a.ItemName) AS Num
from Tb_Trans a
left join tb_item c on c.ItemId=a.ItemId
inner join tb_Item d on d.distId=a.distId
where a.ItemName is not null and d.distId is not null
group by a.ItemName,a.ItemId,c.ItemName,d.distId
) t
WHERE Num BETWEEN 61 AND 80
七爷 2011-10-13
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 roy_88 的回复:]
SQL code

select ItemName,ItemId,PPName,distId
FROM
(
select
a.ItemName,a.ItemId,c.ItemName as PPName,d.distId,ROW_NUMBER()OVER(ORDER BY a.ItemName) AS row
from Tb_Trans a
left jo……
[/Quote]
我知道那是页索引的,可是加上as row 后就报“未找到要求的from关键字”错误,去掉 as row 就不报错了,但是一样很慢,比我原来写的还慢啊
中国风 2011-10-13
  • 打赏
  • 举报
回复
select ItemName,ItemId,PPName,distId 
FROM
(
select
a.ItemName,a.ItemId,c.ItemName as PPName,d.distId,ROW_NUMBER()OVER(ORDER BY a.ItemName) AS row
from Tb_Trans a
left join tb_item c on c.ItemId=a.ItemId
inner join tb_Item d on d.distId=a.distId
where a.ItemName is not null and d.distId is not null
group by a.ItemName,a.ItemId,c.ItemName,d.distId
) t
WHERE row BETWEEN 61 AND 80


這樣用,你試試
中国风 2011-10-13
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 woainikeaibibi 的回复:]

引用 3 楼 roy_88 的回复:
a.ItemName,a.ItemId,c.ItemName as PPName,d.distId,ROW_NUMBER()OVER(ORDER BY a.ItemName) AS row

不给用别名啊
[/Quote]

這一列生成序號是用於條件,不是用於顯示的
七爷 2011-10-13
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 roy_88 的回复:]
a.ItemName,a.ItemId,c.ItemName as PPName,d.distId,ROW_NUMBER()OVER(ORDER BY a.ItemName) AS row[/Quote]

不给用别名啊
七爷 2011-10-13
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 roy_88 的回复:]
提示樓主,貼子別亂轉啊

剛才SQL Server ,現在又是.NET
[/Quote]
谢谢,呵呵,我知道asp.net 版块人气旺,所以... ,我是拿20W那张表的做测试的发现很慢的,还有张100W的都不知道我的电脑抗不抗的住
中国风 2011-10-13
  • 打赏
  • 举报
回复
提示樓主,貼子別亂轉啊

剛才SQL Server ,現在又是.NET
中国风 2011-10-13
  • 打赏
  • 举报
回复
Distinct--保留順序
group by --會改變順序
中国风 2011-10-13
  • 打赏
  • 举报
回复
用distinct后再分頁這樣用,建議直接用group by

select *,ROW_NUMBER()OVER(ORDER BY a.ItemName) AS row
from (select distinct col2,col3 from tablename)t
七爷 2011-10-13
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 roy_88 的回复:]
SQL code

select *
FROM
(
select
a.ItemName,a.ItemId,c.ItemName as PPName,d.distId,ROW_NUMBER()OVER(ORDER BY a.ItemName) AS row
from Tb_Trans a
left join tb_item c on c.ItemId=a.I……
[/Quote]

谢谢前辈,但是我想如果一用到分组group by 的话基本就要慢好多,但是不分组用distinct好像不支持多列,也不知道有什么好方法吗?
中国风 2011-10-13
  • 打赏
  • 举报
回复
利用這個函數ROW_NUMBER分頁
中国风 2011-10-13
  • 打赏
  • 举报
回复
select * 
FROM
(
select
a.ItemName,a.ItemId,c.ItemName as PPName,d.distId,ROW_NUMBER()OVER(ORDER BY a.ItemName) AS row
from Tb_Trans a
left join tb_item c on c.ItemId=a.ItemId
inner join tb_Item d on d.distId=a.distId
where a.ItemName is not null and d.distId is not null
group by a.ItemName,a.ItemId,c.ItemName,d.distId
) t
WHERE row BETWEEN 61 AND 80
七爷 2011-10-13
  • 打赏
  • 举报
回复
唉,人气不旺啊,还是跑到旺区吧
中国风 2011-10-13
  • 打赏
  • 举报
回复
Oracle也來了,發錯版了

62,067

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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