【问题标题】:Can adding basic new SQL Server index create more problems?添加基本​​的新 SQL Server 索引会产生更多问题吗?
【发布时间】:2015-11-24 21:37:10
【问题描述】:

我对索引完全不熟悉,想加快我的一些客户系统的速度。我的组织犯了一个错误,将我们的一些客户从 SQL Server 2000 升级到 SQL Server 2008,然后在内部对其进行全面测试。结果,(新)服务器的运行速度比以往任何时候都慢。正如您所想象的那样,这让客户感到困惑。每个客户都有两个 SQL Server 用户数据库,大小都设置为大约 1GB,每个客户大约有 30 个用户。

在我的组织中,目前没有任何资源可以聘请开发人员或 DBA 来推荐如何加快新系统的速度。

如果我要花 4 周时间尽可能多地学习 SQL Server 数据库和索引,您认为添加一些索引来看看是否有什么不同可能是个好主意吗?我也可以轻松删除索引以使系统恢复原来的状态,以免造成伤害吗?除了它是一种学习体验?

【问题讨论】:

  • 索引的基本经验法则:决策上下文中使用的任何字段(wherejoinorder by 等)都应该有一个索引。话虽如此,更多的索引也意味着更多的开销,并且在某些时候,您可能最终会浪费足够的开销来维护所有额外的索引,从而失去查询效率的任何收益。
  • 是的 - 索引通常会有所帮助 - IF 您知道哪些查询会导致性能问题,哪些索引会有所帮助。所以是的 - 如果你可以添加 right 索引 - 很有可能你会获得更好的性能 - 但是 finding 并确定那些 right索引可能有点挑战....
  • 我现在正在阅读这篇文章,值得一看:SQL Server Index Design Guide
  • 问得好,祝你好运!也可以轻松删除索引,但如果您是 SQL 的新手,您可能会考虑创建一个测试环境。
  • 如果您想真正完整地了解 sql server 中的索引,从最基础的部分通过一些非常深入的部分深入了解,这里是关于该主题的精彩文章集合。 sqlservercentral.com/stairway/72399

标签: sql sql-server indexing


【解决方案1】:

使用索引通常是一把双刃剑。太多不好,太少也不好。

但是,您可以从添加对您的查询最有帮助的那些开始。

运行这个脚本

SELECT
  migs.avg_total_user_cost * (migs.avg_user_impact / 100.0) * (migs.user_seeks + migs.user_scans) AS improvement_measure,
  'CREATE INDEX [missing_index_' + CONVERT (varchar, mig.index_group_handle) + '_' + CONVERT (varchar, mid.index_handle)
  + '_' + LEFT (PARSENAME(mid.statement, 1), 32) + ']'
  + ' ON ' + mid.statement
  + ' (' + ISNULL (mid.equality_columns,'')
    + CASE WHEN mid.equality_columns IS NOT NULL AND mid.inequality_columns IS NOT NULL THEN ',' ELSE '' END
    + ISNULL (mid.inequality_columns, '')
  + ')'
  + ISNULL (' INCLUDE (' + mid.included_columns + ')', '') AS create_index_statement,
  migs.*, mid.database_id, mid.[object_id]
FROM sys.dm_db_missing_index_groups mig
INNER JOIN sys.dm_db_missing_index_group_stats migs ON migs.group_handle = mig.index_group_handle
INNER JOIN sys.dm_db_missing_index_details mid ON mig.index_handle = mid.index_handle
WHERE migs.avg_total_user_cost * (migs.avg_user_impact / 100.0) * (migs.user_seeks + migs.user_scans) > 10
ORDER BY migs.avg_total_user_cost * migs.avg_user_impact * (migs.user_seeks + migs.user_scans) DESC

(脚本来自伯特·邓肯)

然后分析 user_scans、user_seeks、avg_user_impact、last_user_seek、last_user_scan 等列。 查询返回索引创建语句。您可以更改索引名称以使用户更加友好。 我建议谨慎使用它,不要只运行所有索引,而是一个一个地运行,看看情况如何改善。

【讨论】:

    【解决方案2】:

    首先: 检查哪些查询消耗的资源最多。快速浏览一下活动监视器 - 最近的昂贵查询会告诉你很多。 如果深入挖掘,可以使用 SQL Server Profiler 进行跟踪。

    第二: 如果您知道哪些查询是“坏的”,您可以做两件事: 尝试通过使用正确的 where 语句和连接来改进查询。 或为这些查询使用的表添加索引。

    添加索引可以带来巨大的性能提升。但它也会增加数据库文件的大小。如果您在该表中添加或编辑记录,则将多个字段添加到索引或多个索引可能会降低服务器速度。

    当然,互联网是你最好的朋友。

    资源:

    https://support.microsoft.com/en-us/kb/298475

    http://www.sqlshack.com/dba-guide-sql-server-performance-troubleshooting-part-1-problems-performance-metrics/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-29
      • 1970-01-01
      相关资源
      最近更新 更多