优化!!同一查询语句,两台机器执行计划不同、并行度问题

贾桂权 2010-01-13 04:47:44
两台服务器,CPU及内存不同,但多是多核

相同查询如句,一台上执行计划是索引查询,另一台则被分为 索引扫描+并行度(信息提示什么分区列) ,两库、表统计信息、结构完全一样。

被分为 索引扫描+并行度 的CPU时长在1000ms左右,而使用索引查询的只有10ms左右

是什么原因引起了不同的执行计划?如何解决???


...全文
276 17 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
DB牛牛 2012-04-16
  • 打赏
  • 举报
回复
并行查询到第采用多少进程数除了跟操作的复杂程度相关外,还直接跟当时的服务器状态相关,如是否有足够的进程数等等。所以,在不同的时间,即使是相同的数据、相同的操作,其并行查询所用的进程数也可能不同。其所需要的时间也就不同了。因为只有在并行查询真正进行的时候,数据库引擎才去收集当前系统的工作负荷,如进程数,和其他对一些配置信息,然后数据库才确定最佳的并行进程数。从查询开始,到这个查询作业结束,将一直采用这个进程数。如果下次要继续查询,则数据库引擎会继续收集这些信息。此时,如果系统工作负荷有所改善,在数据库可能会采用更多的进程数来执行这个查询。从而查询作业的性能会更加的高。相反,如果此时系统的负荷比前一次查询要重了,则数据库就可能会采用比较少的进程来处理这个作业。此时,第二次查询的速度反而更慢了。所以,如果在数据库服务器中同时部署了其他应用,则其他应用所占用系统资源的多少也会对并行执行产生难以估测的影响。
jack15850798154 2010-01-14
  • 打赏
  • 举报
回复
学习中!帮顶。。。
nzperfect 2010-01-13
  • 打赏
  • 举报
回复
尝试两种解决办法:
1.显示配置option(maxdop 1)
2.修改全局:

sp_configure 'show advanced options', 1;
GO
RECONFIGURE WITH OVERRIDE;
GO
sp_configure 'max degree of parallelism', 1;
GO
RECONFIGURE WITH OVERRIDE;
GO
sp_configure 'show advanced options', 1;
GO
RECONFIGURE WITH OVERRIDE;
GO
贾桂权 2010-01-13
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 perfectaction 的回复:]
这样的问题我遇到过多次了,就算是内存相同,cpu只要不同,就有可能产生不同的执行计划。
[/Quote]

主要是因为主服务器上的被并行度了,效率较低,不然也不弄这个。
lweia 2010-01-13
  • 打赏
  • 举报
回复
with (index(xxx))
一般都是统计信息的问题导致计划不同
更新统计信息基本都能解决
或者干脆帮他指定索引
nzperfect 2010-01-13
  • 打赏
  • 举报
回复
可以限制一下并行度试试
如使用
select * from tbname option(maxdop 1)
SQL77 2010-01-13
  • 打赏
  • 举报
回复
信息提示什么分区列)

是因为有分区列?这东西太深奥
nzperfect 2010-01-13
  • 打赏
  • 举报
回复
这样的问题我遇到过多次了,就算是内存相同,cpu只要不同,就有可能产生不同的执行计划。
贾桂权 2010-01-13
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 fredrickhu 的回复:]
不行的话建立包含性列 用索引覆盖试下
[/Quote]

两台机器都用到这个索引,但别一台为扫描+并行度
nzperfect 2010-01-13
  • 打赏
  • 举报
回复
正常,不同的硬件就是会引起执行计划的不同。
mxc1225 2010-01-13
  • 打赏
  • 举报
回复
站位学习!
贾桂权 2010-01-13
  • 打赏
  • 举报
回复
--小F-- 2010-01-13
  • 打赏
  • 举报
回复
不行的话建立包含性列 用索引覆盖试下
--小F-- 2010-01-13
  • 打赏
  • 举报
回复
是不是你并行部分没有用到索引 检查一下
--小F-- 2010-01-13
  • 打赏
  • 举报
回复
DBCC   CHECKDB   (数据库名)   

DBCC CHECKTABLE (表名)

DBCC CHECKDB有多个修复选项,其中一个是REPAIR_ALLOW_DATA_LOSS

执行由 REPAIR_REBUILD 完成的所有修复,包括对行和页进行分配和取消分配以改正分配错误、结构行或页的错误,以及删除已损坏的文本对象。这些修复可能会导致一些数据丢失。修复操作可以在用户事务下完成以允许用户回滚所做的更改。如果回滚修复,则数据库仍会含有错误,应该从备份进行恢复。如果由于所提供修复等级的缘故遗漏某个错误的修复,则将遗漏任何取决于该修复的修复。修复完成后,备份数据库。

不过,需要先备份数据库,用这个选项可以修复,但可能丢失一部分数据。
SQL77 2010-01-13
  • 打赏
  • 举报
回复
并行度

这个不懂,帮顶
--小F-- 2010-01-13
  • 打赏
  • 举报
回复
先MARK考虑一下

22,300

社区成员

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

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