AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 18943
Accepted
mehdi lotfi
mehdi lotfi
Asked: 2012-06-08 04:59:37 +0800 CST2012-06-08 04:59:37 +0800 CST 2012-06-08 04:59:37 +0800 CST

识别所需索引的工具

  • 772

我想为我的数据库中的每个表创建最佳索引。SQL Server 中是否有查询或工具可帮助完成此过程?

sql-server database-design
  • 3 3 个回答
  • 22887 Views

3 个回答

  • Voted
  1. Best Answer
    Aaron Bertrand
    2012-06-08T05:21:13+08:002012-06-08T05:21:13+08:00

    是的,有一些工具,比如数据库引擎优化顾问。它随 SQL Server 一起提供,并做了一些非常讨厌的事情:

    • 它允许您只考虑非常小的工作负载(甚至是单个查询)。然后,它会建议可能只帮助小工作负载的索引,而不考虑其他工作负载(索引有助于加快某些查询,但它们可以减慢其他查询,尤其是插入/更新/删除),别管其余的的商业周期。
    • 它通常会推荐仅因尾随列或包含列而异的冗余索引。
    • 它真的,真的,真的很喜欢包含的专栏——我认为这可能是一种迷信。

    索引调优的正确方法是考虑整个业务周期内的整个工作负载。有时,使用 3rd 方工具比重新发明轮子更好。DBSophic制作了一个名为 Qure Workload Analyzer 的免费产品,我认为它比 DTA 做得更好——但他们的许可工具(Qure Workload Optimizer)在它的作用上绝对是惊人的。去年,我在博客中介绍了该工具与 SQL Sentry 集成时的工作原理)。

    还有一些其他选项,例如 DMV 中报告缺少索引,您还可以发现正在写入哪些索引(因此它们占用空间并影响插入/更新/删除操作)但从不(或很少) 用户查询使用:

    • 使用 DMV 查找缺失的索引
    • 使用基于策略的管理查找未使用的索引
    • 发现未使用的索引
    • 更深入地了解未使用的索引

    但这些也需要注意,DMV 仅在上次 SQL Server 重新启动后才有效,并且它们不一定涵盖适当的业务周期(因此可能会丢失重要信息

    • 15
  2. Thomas Stringer
    2012-06-08T05:05:13+08:002012-06-08T05:05:13+08:00

    您所说的工具称为数据库引擎优化顾问(简称 DTA)。它可以接受大量输入,并就缺失索引等问题提供建议。但值得注意的是,这些只是建议,应慎重考虑,而不是盲目遵循 DTA 的建议。

    DTA 教程链接

    还值得注意的是,有用于收集此类信息的内置 DMV:

    • sys.dm_db_missing_index_columns
    • sys.dm_db_missing_index_details
    • sys.dm_db_missing_index_group_stats
    • sys.dm_db_missing_index_groups
    • 6
  3. Francesco Mantovani
    2020-09-17T02:39:50+08:002020-09-17T02:39:50+08:00

    这听起来好得令人难以置信,但我发现一个查询正是这样做的:

    USE YourDatabase
    GO
    
    SELECT db.[name] AS [DatabaseName]
        ,id.[object_id] AS [ObjectID]
        ,OBJECT_NAME(id.[object_id], db.[database_id]) AS [ObjectName]
        ,id.[statement] AS [FullyQualifiedObjectName]
        ,id.[equality_columns] AS [EqualityColumns]
        ,id.[inequality_columns] AS [InEqualityColumns]
        ,id.[included_columns] AS [IncludedColumns]
        ,gs.[unique_compiles] AS [UniqueCompiles]
        ,gs.[user_seeks] AS [UserSeeks]
        ,gs.[user_scans] AS [UserScans]
        ,gs.[last_user_seek] AS [LastUserSeekTime]
        ,gs.[last_user_scan] AS [LastUserScanTime]
        ,gs.[avg_total_user_cost] AS [AvgTotalUserCost]  -- Average cost of the user queries that could be reduced by the index in the group.
        ,gs.[avg_user_impact] AS [AvgUserImpact]  -- The value means that the query cost would on average drop by this percentage if this missing index group was implemented.
        ,gs.[system_seeks] AS [SystemSeeks]
        ,gs.[system_scans] AS [SystemScans]
        ,gs.[last_system_seek] AS [LastSystemSeekTime]
        ,gs.[last_system_scan] AS [LastSystemScanTime]
        ,gs.[avg_total_system_cost] AS [AvgTotalSystemCost]
        ,gs.[avg_system_impact] AS [AvgSystemImpact]  -- Average percentage benefit that system queries could experience if this missing index group was implemented.
        ,gs.[user_seeks] * gs.[avg_total_user_cost] * (gs.[avg_user_impact] * 0.01) AS [IndexAdvantage]
        ,'CREATE INDEX [IX_' + OBJECT_NAME(id.[object_id], db.[database_id]) + '_' + REPLACE(REPLACE(REPLACE(ISNULL(id.[equality_columns], ''), ', ', '_'), '[', ''), ']', '') + CASE
            WHEN id.[equality_columns] IS NOT NULL
                AND id.[inequality_columns] IS NOT NULL
                THEN '_'
            ELSE ''
            END + REPLACE(REPLACE(REPLACE(ISNULL(id.[inequality_columns], ''), ', ', '_'), '[', ''), ']', '') + '_' + LEFT(CAST(NEWID() AS [nvarchar](64)), 5) + ']' + ' ON ' + id.[statement] + ' (' + ISNULL(id.[equality_columns], '') + CASE
            WHEN id.[equality_columns] IS NOT NULL
                AND id.[inequality_columns] IS NOT NULL
                THEN ','
            ELSE ''
            END + ISNULL(id.[inequality_columns], '') + ')' + ISNULL(' INCLUDE (' + id.[included_columns] + ')', '') AS [ProposedIndex]
        ,CAST(CURRENT_TIMESTAMP AS [smalldatetime]) AS [CollectionDate]
    FROM [sys].[dm_db_missing_index_group_stats] gs WITH (NOLOCK)
    INNER JOIN [sys].[dm_db_missing_index_groups] ig WITH (NOLOCK) ON gs.[group_handle] = ig.[index_group_handle]
    INNER JOIN [sys].[dm_db_missing_index_details] id WITH (NOLOCK) ON ig.[index_handle] = id.[index_handle]
    INNER JOIN [sys].[databases] db WITH (NOLOCK) ON db.[database_id] = id.[database_id]
    WHERE  db.[database_id] = DB_ID()
    --AND OBJECT_NAME(id.[object_id], db.[database_id]) = 'YourTableName'
    ORDER BY ObjectName, [IndexAdvantage] DESC
    OPTION (RECOMPILE);
    
    • 0

相关问题

  • 我需要为每种类型的查询使用单独的索引,还是一个多列索引可以工作?

  • 什么时候应该使用唯一约束而不是唯一索引?

  • 死锁的主要原因是什么,可以预防吗?

  • 在数据仓库中实现多对多关系有哪些方法?

  • 如何确定是否需要或需要索引

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何查看 Oracle 中的数据库列表?

    • 8 个回答
  • Marko Smith

    mysql innodb_buffer_pool_size 应该有多大?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    从 .frm 和 .ibd 文件恢复表?

    • 10 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    如何选择每组的第一行?

    • 6 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    pedrosanta 使用 psql 列出数据库权限 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    bernd_k 什么时候应该使用唯一约束而不是唯一索引? 2011-01-05 02:32:27 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve