SQLSERVER数据库优化主要从哪几方面入手?

0
已邀请:
3

戴俊青 - 微软数据库开发和性能调优 2013-09-10 回答

我觉得,可以从这几方面入手:
1:数据库设计是否好不好
2:查询语句写的效率高不高
3:索引设计的怎么样
4:索引碎片多不多
5:统计是不是最新的
6:阻塞和死锁的情况有没有
7:有没有用到游标,尽量使用集合操作
8:执行计划是不是频繁重编译
3

gogodiy - 天善智能数据库专家、Tableau爱好者 2013-09-10 回答

首先观察应用设计领域,包括逻辑/物理数据库设计、查询设计和索引设计。

在定位问题上, 通常会先看看服务器的 CPU 和磁盘 I/O, 如果在一个比较高的值, 那么响应慢是正常的, 我们可以通过 sp_who2 结合 SQL Profile 之类, 确定连接数是否过高, 是有大部分进程都在等待资源, 还是有频繁的查询, 如果还是不好判断的话, 也可以通过关闭一些程序模块, 如果某些模块被关闭后, 服务器响应正常, 那么应该针对这些模块涉及的SQL 进行分析优化, 如果单独运行有问题的模块, 从SQL Profile看到的性能是很好的, 那么需要算是否和其他模块一起使用时, 有资源争用, 如果没有, 那么服务器的配置可能无法满足需求; 如果争用的是IO资源, 那么可能需要考虑磁盘IO性能是否无法满足需求, 如果等等被锁定的资源, 那么通常考虑T-SQL的写法之类, 降低锁定资源的时间
对于经常不足, 但确实需要面对服务器性能问题的人来说, 可以尝试SQL Server 的查询引擎优化顾问, 这个可以在一定程度上解决问题(主要以索引为主)
2

zhangmin02 2013-09-10 回答

结合最近同事的一个CASE给一些实践性的经验
    []现象: 数据库镜像同步SUSPEND[/][]分析: [/]
1) 日志: 2013-08-23 13:35:11.56 spid222 SubprocessMgr::EnqueueSubprocess: Limit on 'Max worker threads' reached.
2013-08-23 13:36:03.25 服务器 Process 21:0:0 (0x700) Worker 0x000000000562E1C0 appears to be non-yielding on Scheduler 16. Thread creation time: 13007692450043. Approx Thread CPU Used: kernel 530 ms, user 55223402 ms. Process Utilization 2%. System Idle 97%. Interval: 55105532 ms.
2) 可以得知工作线程被用完, 导致检查点进程无法申请到可用线程(WaitForSingleObject阻塞, C++开发的应该知道这是Windows线程调度的API), 其结果就是日志无穷大, 镜像挂起
3) 治标: 首先同事停掉了镜像, 这是在我参与分析之前, 情况仍未改善, 然后我建议他分两步调整, 目标是确保ONLINE止损, 首先是扩大工作线程到1024, 另外给他提出了几个问题, 逆向思维
-1- 最近有否程序上版本, 有
-2- 存储是不是新的, 是
-3- 条带划分是否优化, 否
    []结论: 最后发现的确是存储分配有问题, 都在一个GROUP上面, 最近又上线了几个IO大户, 导致问题爆发.[/][]所以: 性能调优的三大要素是 IO + IO + IO[/]
0

windy8848 - 尘封往事 2017-02-22 回答

这个话题不错,讨论的人不多啊!

要回复问题请先登录注册