mssql2005的优化器 遇到复杂的sql,是不是有点犯傻?

haitao 2012-03-29 11:00:57
加精
mssql2005的优化器 遇到复杂的sql,是不是有点犯傻?
2个 结果都约200行、用时都10秒以内的 查询,join起来,10多分钟都出不来!
利用2个临时表先保存2个查询的结果,再join就只需10多秒!

昨晚还有一个存储过程,一个游标(结果越1、2千行,用时15秒),经过一个循环拼凑过程,就需要6分钟!
而那个游标改为少关联一个表,少一点限制(结果几十万行,用时20秒的),也经过同样循环拼凑过程,却只需要1分钟。。。。

很多人认为mssql不可大用,会不会就是指这些问题?
...全文
1711 82 打赏 收藏 转发到动态 举报
写回复
用AI写文章
82 条回复
切换为时间正序
请发表友善的回复…
发表回复
haitao 2012-06-05
  • 打赏
  • 举报
回复
昨天又遇到一个:
多个表关联,多个条件过滤
条件里没有一个fx<>'4',则很快(2秒内)出来5条结果
增加fx<>'4',则几分钟也出不来

select * from (
原来的语句
) a
where fx<>'4'
也是几分钟出不来!

有没有办法让fx<>'4'不要参与优化?
尝试with (xxx),好像也不行

只有使用临时表先取得 原来的语句 的查询结果,再对临时表进行where fx<>'4'过滤
才避免这种错误的优化导致的慢

有没有其它语法让fx<>'4'不要参与优化?而不变使用临时表的??
haitao 2012-06-05
  • 打赏
  • 举报
回复
[Quote=引用 81 楼 的回复:]
fx<>'4' 进行了全表扫描....
占用了一些时间》。。
[/Quote]

问题是:如果它对 原来的语句 的查询结果(因为只有5条)再进行扫描,就不会慢了
如何让它这么做?而不是在前面扫描
bean_sql 2012-06-05
  • 打赏
  • 举报
回复
fx<>'4' 进行了全表扫描....
占用了一些时间》。。
handthing 2012-04-13
  • 打赏
  • 举报
回复
看楼主的结果,估计是没正确使用索引。
猪尬亮 2012-04-09
  • 打赏
  • 举报
回复
mysql 的优化器对多表join的数量有限制,它优化联接sql的时候,会去计算所有可能的组合,让sql尽可能消耗少,但是每次计算n张表join的消耗都需要n!次计算,所以当N太大的时候,mysql优化器会因为分析超市,然后根据统计算法去求解join联接的优先顺序,那么必然不一定有最优解,所以会执行比较长的时间
lei987200158 2012-04-09
  • 打赏
  • 举报
回复
我需要啊,啊哈哈哈
牡丹花香醉 2012-04-08
  • 打赏
  • 举报
回复
O(∩_∩)O哈哈~
喜阳阳 2012-04-04
  • 打赏
  • 举报
回复
志成csm 2012-04-04
  • 打赏
  • 举报
回复
恩,归根结底都是看钱啊,投资能不能带来收益,开发转了能不能拿到高薪!呵呵
jAmEs_ 2012-04-04
  • 打赏
  • 举报
回复
这么复杂的SQL,最好还是分开来,也好维护。
不过说实话,2005的优化器真是不咋地,我觉得(有时?)2000都比它好,因为很多2000不出现的问题,他就出现了。。。
DTSpark_2017 2012-04-04
  • 打赏
  • 举报
回复
SQL语句写的不怎么规范,关联的表都不加(NOLOCK),这样很容易锁表!
guguda2008 2012-04-04
  • 打赏
  • 举报
回复
[Quote=引用楼主 的回复:]
mssql2005的优化器 遇到复杂的sql,是不是有点犯傻?
2个 结果都约200行、用时都10秒以内的 查询,join起来,10多分钟都出不来!
利用2个临时表先保存2个查询的结果,再join就只需10多秒!

昨晚还有一个存储过程,一个游标(结果越1、2千行,用时15秒),经过一个循环拼凑过程,就需要6分钟!
而那个游标改为少关联一个表,少一点限制(结果几十万行,用时20秒的),也……
[/Quote]

SQL SERVER的优化器是做基于成本的优化,复杂查询是会出现有些地方计划不合理的情况,所以需要开发DBA对语句进行分析,通过建立合适的索引和指定连接方式、增加临时表等手段对语句进行一些优化。
笨鸟待展翅 2012-04-04
  • 打赏
  • 举报
回复
看看啊
jjdb01 2012-04-03
  • 打赏
  • 举报
回复
看不可动,哎。怎么办
lmc158 2012-04-01
  • 打赏
  • 举报
回复
用表变量的好处就是不用考虑用完后腰删除临时表(存储小数据量,耗一些内存)。
mgui008 2012-04-01
  • 打赏
  • 举报
回复
正在努力学习中了,谢谢
jauntlee 2012-04-01
  • 打赏
  • 举报
回复
果然是强人
Andy-W 2012-04-01
  • 打赏
  • 举报
回复
在数据库中碰到多表关联,建议采用化‘化整为零’方法,把复杂的语句变成简单的,可以考虑表变量、临时表作中间转换的方法。
有很多人在SQL Server 2005以后发现有CTE,把CTE当成是临时表和表变量使用,滥用CTE。这样的方法是错误的。在实际的应用告诉我们,在CTE被调用两次或以上,最好考虑表变量、临时表。
sunylf 2012-03-31
  • 打赏
  • 举报
回复
索引,深有體會.
prcak47 2012-03-31
  • 打赏
  • 举报
回复
如果数据库能自动搞定一切
数据库工程师就都变成要饭的了
加载更多回复(39)

22,207

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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