休完15天的假,问一个数据库查询优化的问题

wxxloveu 2011-08-09 02:31:50
原始语句

SELECT distinct tb_8450999_N109_PointBasicInfo.spareID,tb_SpareInfo.spareChildName
FROM tb_8450999_N109 INNER JOIN tb_8450999_N109_PointBasicInfo ON tb_8450999_N109.pointID = tb_8450999_N109_PointBasicInfo.pointID
INNER JOIN tb_SpareInfo ON tb_8450999_N109_PointBasicInfo.spareID = tb_SpareInfo.spareID
where tb_8450999_N109.pointMeaDate>='2011-03-10' and tb_8450999_N109.pointMeaDate<='2011-08-09'
and tb_8450999_N109_PointBasicInfo.pointSharpType!='孔_S' and tb_8450999_N109_PointBasicInfo.pointSharpType!='孔_S_F'
group by tb_8450999_N109_PointBasicInfo.spareID,tb_SpareInfo.spareChildName
--(3 行受影响)
--表 'tb_8450999_N109'。扫描计数 1,逻辑读取 1636413 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
--表 'Worktable'。扫描计数 0,逻辑读取 0 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
--表 'tb_8450999_N109_PointBasicInfo'。扫描计数 1,逻辑读取 18 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
--表 'tb_SpareInfo'。扫描计数 1,逻辑读取 5 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
--
--SQL Server 执行时间:
-- CPU 时间 = 35422 毫秒,占用时间 = 35765 毫秒。

第一次修改后

SELECT distinct tb_SpareInfo.spareID,tb_SpareInfo.spareChildName
FROM tb_8450999_N109 INNER JOIN tb_8450999_N109_PointBasicInfo ON tb_8450999_N109.pointID = tb_8450999_N109_PointBasicInfo.pointID
INNER JOIN tb_SpareInfo ON tb_8450999_N109_PointBasicInfo.spareID = tb_SpareInfo.spareID
where tb_8450999_N109.pointMeaDate>='2011-03-10' and tb_8450999_N109.pointMeaDate<='2011-08-09'
and tb_8450999_N109_PointBasicInfo.pointSharpType!='孔_S' and tb_8450999_N109_PointBasicInfo.pointSharpType!='孔_S_F'
group by tb_SpareInfo.spareID,tb_SpareInfo.spareChildName
--(3 行受影响)
--表 'Worktable'。扫描计数 1,逻辑读取 168036 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
--表 'tb_8450999_N109'。扫描计数 1,逻辑读取 1511 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
--表 'tb_8450999_N109_PointBasicInfo'。扫描计数 1,逻辑读取 5193 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
--表 'tb_SpareInfo'。扫描计数 1,逻辑读取 5 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
--
--SQL Server 执行时间:
-- CPU 时间 = 6391 毫秒,占用时间 = 6489 毫秒。

第二次修改很意外的更慢,不知道为什么,求解

;with ct as
(select distinct tb_8450999_N109_PointBasicInfo.spareID from tb_8450999_N109_PointBasicInfo inner join tb_8450999_N109 on tb_8450999_N109.pointID = tb_8450999_N109_PointBasicInfo.pointID
where tb_8450999_N109.pointMeaDate>='2011-03-10' and tb_8450999_N109.pointMeaDate<='2011-08-09'
and tb_8450999_N109_PointBasicInfo.pointSharpType!='孔_S' and tb_8450999_N109_PointBasicInfo.pointSharpType!='孔_S_F'
)
SELECT distinct tb_SpareInfo.spareID,tb_SpareInfo.spareChildName
from tb_SpareInfo
where tb_SpareInfo.spareID in (select * from ct)
--(3 行受影响)
--表 'tb_8450999_N109'。扫描计数 1,逻辑读取 1636413 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
--表 'tb_8450999_N109_PointBasicInfo'。扫描计数 1,逻辑读取 18 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
--表 'tb_SpareInfo'。扫描计数 1,逻辑读取 3 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
--
--SQL Server 执行时间:
-- CPU 时间 = 35610 毫秒,占用时间 = 36182 毫秒。
...全文
277 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
nzperfect 2011-08-10
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 wxxloveu 的回复:]

引用 10 楼 perfectaction 的回复:

引用 9 楼 liangck 的回复:

我现在基本不用cte,那玩意很慢。


我印象中在一些重复统计报表中,用cte可以避免重复统计,也不是都慢。

问一个问题啊,我是用.Net做的程序,需要读取数据库里的数据,这样建立临时表会有问题么?比如在数据库服务器中临时表太多会不会带来压力?
[/Quote]

一般不会有什么问题,临时表很常用。
oO寒枫Oo 2011-08-10
  • 打赏
  • 举报
回复
用了之后当场删除就可以了
truncate table table_name
drop table table_name
wxxloveu 2011-08-10
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 perfectaction 的回复:]

引用 9 楼 liangck 的回复:

我现在基本不用cte,那玩意很慢。


我印象中在一些重复统计报表中,用cte可以避免重复统计,也不是都慢。
[/Quote]
问一个问题啊,我是用.Net做的程序,需要读取数据库里的数据,这样建立临时表会有问题么?比如在数据库服务器中临时表太多会不会带来压力?
wxxloveu 2011-08-10
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 perfectaction 的回复:]

把ct变结果insert到一个临时表,再和tb_SpareInfo关联看看怎么样?
[/Quote]
谢谢,已经做了测试,相当快,这是为什么呢?

;with ct as
(select distinct tb_8450999_N109_PointBasicInfo.spareID from tb_8450999_N109_PointBasicInfo inner join tb_8450999_N109 on tb_8450999_N109.pointID = tb_8450999_N109_PointBasicInfo.pointID
where tb_8450999_N109.pointMeaDate>='2011-03-10' and tb_8450999_N109.pointMeaDate<='2011-08-09'
and tb_8450999_N109_PointBasicInfo.pointSharpType!='孔_S' and tb_8450999_N109_PointBasicInfo.pointSharpType!='孔_S_F'
)
--create table #tb_spare(spareID int)
--select spareID into #tb_spare from ct
SELECT distinct tb_SpareInfo.spareID,tb_SpareInfo.spareChildName
from tb_SpareInfo
where tb_SpareInfo.spareID in (select spareID from #tb_spare)

--SQL Server 分析和编译时间:
-- CPU 时间 = 16 毫秒,占用时间 = 48 毫秒。
--
--(3 行受影响)
--表 '#tb_spare___________________________________________________________________________________________________________000000000002'。
--扫描计数 1,逻辑读取 614 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
--表 'tb_SpareInfo'。扫描计数 1,逻辑读取 5 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
--
--SQL Server 执行时间:
-- CPU 时间 = 15 毫秒,占用时间 = 2 毫秒。
wujianfeng32 2011-08-10
  • 打赏
  • 举报
回复
ly745455 2011-08-10
  • 打赏
  • 举报
回复
只能看懂理论。看不懂代码 ,真奇怪 !!
y360515419 2011-08-09
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 wxxloveu 的回复:]
引用 4 楼 chtzhking 的回复:

表 'tb_8450999_N109'。扫描计数 1,逻辑读取 1636413 次,你的这个表在第一次修改后读取168036 次,修改后读取次数多了近10倍。

搞不懂,以下的查询只要这么点时间啊

SQL code


;with ct as
(select distinct tb_8450999_N109_PointBasicI……
[/Quote]

同意
弘毅致远 2011-08-09
  • 打赏
  • 举报
回复
嚴重同意樓上的說法,效率問題95%以上都是設計和編碼問題。
wangkun520 2011-08-09
  • 打赏
  • 举报
回复
看看sql server的查询计划和统计信息。设定一个优化目标。数据库效率问题多半是设计不好和sql思路问题。换一种思路可能会达到更好的效果
快溜 2011-08-09
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 perfectaction 的回复:]
把ct变结果insert到一个临时表,再和tb_SpareInfo关联看看怎么样?
[/Quote]同意。
geniuswjt 2011-08-09
  • 打赏
  • 举报
回复
如果你几次查询时sql在某次做了比较重负荷的事也会影响速度的
nzperfect 2011-08-09
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 liangck 的回复:]

我现在基本不用cte,那玩意很慢。
[/Quote]

我印象中在一些重复统计报表中,用cte可以避免重复统计,也不是都慢。
liangCK 2011-08-09
  • 打赏
  • 举报
回复
我现在基本不用cte,那玩意很慢。
nzperfect 2011-08-09
  • 打赏
  • 举报
回复
把ct变结果insert到一个临时表,再和tb_SpareInfo关联看看怎么样?
wxxloveu 2011-08-09
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 chtzhking 的回复:]

表 'tb_8450999_N109'。扫描计数 1,逻辑读取 1636413 次,你的这个表在第一次修改后读取168036 次,修改后读取次数多了近10倍。
[/Quote]
搞不懂,以下的查询只要这么点时间啊

;with ct as
(select distinct tb_8450999_N109_PointBasicInfo.spareID from tb_8450999_N109_PointBasicInfo inner join tb_8450999_N109 on tb_8450999_N109.pointID = tb_8450999_N109_PointBasicInfo.pointID
where tb_8450999_N109.pointMeaDate>='2011-03-10' and tb_8450999_N109.pointMeaDate<='2011-08-09'
and tb_8450999_N109_PointBasicInfo.pointSharpType!='孔_S' and tb_8450999_N109_PointBasicInfo.pointSharpType!='孔_S_F'
)
select * from ct
--(3 行受影响)
--表 'Worktable'。扫描计数 0,逻辑读取 0 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
--表 'tb_8450999_N109'。扫描计数 1,逻辑读取 1511 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
--表 'tb_8450999_N109_PointBasicInfo'。扫描计数 1,逻辑读取 18 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
--
--SQL Server 执行时间:
-- CPU 时间 = 47 毫秒,占用时间 = 51 毫秒。
NBDBA 2011-08-09
  • 打赏
  • 举报
回复
想问问,为什么我没有15天的假,从来没有过.....
NBDBA 2011-08-09
  • 打赏
  • 举报
回复
不加索引怎么该语句也没有,你先增加以下索引

tb_8450999_N109(pointMeaDate)
tb_8450999_N109_PointBasicInfo(pointSharpType)
chtzhking 2011-08-09
  • 打赏
  • 举报
回复
表 'tb_8450999_N109'。扫描计数 1,逻辑读取 1636413 次,你的这个表在第一次修改后读取168036 次,修改后读取次数多了近10倍。
--小F-- 2011-08-09
  • 打赏
  • 举报
回复
查看执行计划 用SQL PROFILTER跟踪
chtzhking 2011-08-09
  • 打赏
  • 举报
回复
对于你的第二次修改,请仔细看一下1楼的第5条
加载更多回复(1)

34,593

社区成员

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

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