如何决定表列时使用索引(How to decide when use index on table

2019-07-31 00:55发布

什么时候应该在表上使用索引?

  1. 从多少行指数有道理?
  2. 如果我有表不变的行,刚才编辑来列(不“其中”条款),使得指数的意义,即使表中有差不多15行? 编辑:可以在这样的情况下,非指数选择/读取比指数更有效的阅读?

编辑:现在我用火鸟2.5工作,但大部分时间我使用的SQL Server 2005/2008。

Answer 1:

在一般情况下,我的索引策略会是这样的(我使用SQL Server专为现在 - 根据需要适应自己的数据库系统):

  • 聚集键-不是一个GUID,而不是VARCHAR(250)或东西-一个很好的聚集键是窄的,独特的,稳定的,持续增长 -有点像INT IDENTITY是完美的。 这使得您的聚集主键 - >让你在桌子上的第一个索引

  • 对于正在使用的外键到另一个表中的任何列 - 增加一个索引。 它可以是单个列索​​引 - 或者它可能是一个复合索引 - 无论最适合你的情况。 重要的是,外键列在该索引的第一列(如果您使用的是复合索引) -否则,对于带来的好处JOIN的或用于检查参照完整性,不会提供给您的系统

这就是现在它。

然后:运行系统 - 观察和测量 - 建立一个基准。 是应用程序速度不够快? 如果是 - >你就大功告成了 - 回家,享受你的空闲时间。

如果不是:然后开始收集数据和指示,为什么应用程序的速度不够快。 看看像DMV的SQL Server中如的东西,告诉你表现最差的查询,或缺失索引DMV。 分析这些。 见你可以改进的地方。 添加一个索引的时间和再次:观察,测量,比较,以你的基线。

如果您有改善 - >离开这个指标到位,这种测量是你的新基准。 冲洗和重复,直到你(和你的用户)很高兴能与应用程序的性能( 然后回家享受你的休息时间)。

在索引中的SQL Server可以比没有任何指标恶化 。 不要用太多的指标,开始下手了! 只有建立良好的集群PK和外键的非聚集索引-这一切-然后观察,测量,优化和重复这种循环。



Answer 2:

这是一个非常复杂的讨论,也有你要记住几件事情。 主要是你不应该考虑你有你的表,但基于你对其运行查询的行数的指数。 A股指数将有助于只能选择查询,并在同一时间将稍微降低刀片的性能,删除和更新,因为除了改变上表中的行,你必须改变指数。

你似乎对此事的新,所以我的建议是,你看看你的执行计划,并试图消除所有的“扫描”操作,因为他们几乎阅读所有的表,甚至所有的索引。 你应该看看总是有追求,但尚未你应该与你有你的表上的索引量平衡。

如果您正在使用SQL Server,你可以运行与SQL Server Profiler来帮助你踪

编辑:

可在这种情况下,非指数选择/读取更有效的比指数看?

是的,但如果发生这种情况下,发动机将不够使用索引智能



Answer 3:

索引是很好的从桌上拿起行的一小部分。 通过主键值查询是索引的最佳利用。 最坏的情况是通过索引访问表中的所有行,因为它具有读取索引页引用的数据页。 另一个例子是,一个内存中排序的结果集的可能比经由排序上排序列的索引的结果集更快。 而且永远不会忘记,而索引可以提高查询性能,指数下降的写入性能。

有些人提到采取了基线,使用某种跟踪工具来衡量性能等,如果你的罚款既定的性能,继续前进。 如果没有,分析执行计划,物理数据模型(可用的指标),重新计算统计数据,看看是否有助于优化器选择更好的执行计划。 确保DBMS能够(允许)利用可用的RAM。 尽量减少磁盘I / O等。

在火鸟2.5情况下,新增加的火鸟跟踪API是一大福音。 您现在终于能够得到什么反对与性能计数器数据库执行的近实时跟踪(执行计划,执行时间,I / O统计...)。 和所谓的第三方产品FB TraceManager通过Upscene制作使得跟踪API使用一种快乐。



Answer 4:

关于你的问题的secong一部分,如果表中有仅15行,它极有可能是,无论你有多少索引在表将始终被扫描,因为它是如此之小。



Answer 5:

我用这个查询得到一个线索,我这表的需要索引:

-- Missing Indexes for current database by Index Advantage  (Query 57) (Missing Indexes)
SELECT DISTINCT CONVERT(decimal(18,2), user_seeks * avg_total_user_cost * (avg_user_impact * 0.01)) AS [index_advantage], 
migs.last_user_seek, mid.[statement] AS [Database.Schema.Table],
mid.equality_columns, mid.inequality_columns, mid.included_columns,
migs.unique_compiles, migs.user_seeks, migs.avg_total_user_cost, migs.avg_user_impact,
OBJECT_NAME(mid.[object_id]) AS [Table Name], p.rows AS [Table Rows]
FROM sys.dm_db_missing_index_group_stats AS migs WITH (NOLOCK)
INNER JOIN sys.dm_db_missing_index_groups AS mig WITH (NOLOCK)
ON migs.group_handle = mig.index_group_handle
INNER JOIN sys.dm_db_missing_index_details AS mid WITH (NOLOCK)
ON mig.index_handle = mid.index_handle
INNER JOIN sys.partitions AS p WITH (NOLOCK)
ON p.[object_id] = mid.[object_id]
WHERE mid.database_id = DB_ID() 
ORDER BY index_advantage DESC OPTION (RECOMPILE);

请注意,这样只会给你一个北,你还需要什么上面已经回答了考虑。



文章来源: How to decide when use index on table column