Questions tagged «index»

一种数据库结构,可以以磁盘空间为代价提高查询速度,并降低插入/更新的速度。它存储一个或多个排序的列的副本,但以不同的方式构造数据以允许更快地访问。

2
当现有索引包括新索引中的所有列时,为什么创建此新索引会大大提高性能?
我有Log和LogItem表;我正在编写查询以从这两者中获取一些数据。有成千上万个Logs,每个Log最多可以有125个LogItems 有问题的查询很复杂,因此我跳过了它(如果有人认为它很重要,可以将其发布),但是当我运行SSMS估计查询计划时,它告诉我一个新的非聚集索引可以将性能提高多达100% 。 Existing Index: Non-clustered Key Colums (LogItem): ParentLogID, DateModified, Name, DatabaseModified Query Plan Recommendation CREATE NONCLUSTERED INDEX [LogReportIndex] ON [dbo].[LogItem] ([ParentLogID],[DatabaseModified]) 只是为了好玩,我创建了这个新索引并运行了查询,令我惊讶的是,现在查询运行大约需要1秒钟的时间,而这才是10秒钟以上。 我以为现有索引可以覆盖这个新查询,所以我的问题是,为什么在新查询中仅使用的列上创建新索引会提高性能?我应该为where子句中使用的每种唯一组合的列都有索引吗? 注意:我不认为这是因为SQL Server正在缓存我的结果,在创建索引之前,我运行查询约25-30次,并且始终花了10-15秒,而在索引之后,索引一直都在〜1或更少。
19 sql-server  index 



6
与简单地重建每个索引相比,ALTER INDEX ALL REBUILD是否使用具有简单恢复模型的事务日志空间更多?
由于事务日志空间不足,SQL Server 2012上的“ ALTER INDEX ALL REBUILD”操作失败。索引从未进行过重组或重建,因此几乎所有索引上的碎片都超过80%。 数据库使用简单的恢复模型。我假设在命令的“ ALL”形式执行的每个索引操作之后,在下一次重建索引之前将刷新事务日志数据。这是它的实际工作方式,还是索引重建记录为好像是单个事务的一部分? 换句话说,是否可以通过编写脚本来分别执行每个重建来减少事务日志的增长?还有其他要考虑的因素吗?
18 sql-server  index 

4
内存优化表-它们真的很难维护吗?
我正在研究从MS SQL 2012升级到2014的好处。SQL2014的最大卖点之一是内存优化表,该表显然使查询超快。 我发现在内存优化表上有一些限制,例如: 没有(max)大小字段 每行最大〜1KB 没有timestamp领域 没有计算列 无UNIQUE约束 这些都是令人讨厌的东西,但是如果我真的想解决这些问题以获得性能上的好处,我可以制定一个计划。 真正的缺点是您不能运行一条ALTER TABLE语句,并且每次将一个字段添加到索引列表中时,都必须经过这个严格INCLUDE的规定。此外,似乎必须将用户拒之于系统之外,以便对实时DB上的MO表进行任何模式更改。 我发现这完全是令人发指的,以至于我实际上无法相信Microsoft可以在此功能上投入这么多的开发资金,而使它的维护非常不切实际。这使我得出一个结论,就是我一定弄错了方向。我一定对内存优化表有误解,这使我相信维护它们的难度要比实际困难得多。 那么,我误会了什么?您是否使用过MO表?是否有某种秘密的开关或过程使它们易于使用和维护?

1
为什么要在文本列上索引text_pattern_ops?
今天,《七周》中的七个数据库向我介绍了每个操作员的索引。 您可以通过创建text_pattern_ops运算符类别索引来为模式与先前查询匹配的字符串建立索引,只要这些值以小写形式索引即可。 CREATE INDEX moves_title_pattern ON movies ( (lower(title) text_pattern_ops); 我们使用了,text_pattern_ops因为标题是文本类型。如果需要指数VARCHAR处理,字符,或名称,使用相关的OPS: ,varchar_pattern_ops,bpchar_pattern_ops和name_pattern_ops。 我发现该示例确实令人困惑。为什么这样做有用? 如果列是文本类型,在用作搜索值之前,是否会将其他类型(varchar,char,name)强制转换为文本? 该索引的行为与使用默认运算符的索引有何不同? CREATE INDEX moves_title_pattern ON movies (lower(title));

5
无法在计算列上创建过滤索引
在我的上一个问题中,在向表中添加新的计算列时禁用锁升级是个好主意吗?,我正在创建一个计算列: ALTER TABLE dbo.tblBGiftVoucherItem ADD isUsGift AS CAST ( ISNULL( CASE WHEN sintMarketID = 2 AND strType = 'CARD' AND strTier1 LIKE 'GG%' THEN 1 ELSE 0 END , 0) AS BIT ) PERSISTED; 计算所得的列是PERSISTED,并且根据computed_column_definition(Transact-SQL): 坚持 指定数据库引擎将物理地将计算出的值存储在表中,并在更新计算出的列所依赖的任何其他列时更新这些值。将计算列标记为PERSISTED允许在确定的但不精确的计算列上创建索引。有关更多信息,请参见计算列上的索引。任何用作分区表分区列的计算列都必须显式标记为PERSISTED。当指定PERSISTED时,computed_column_expression必须是确定性的。 但是,当我尝试在列上创建索引时,出现以下错误: CREATE INDEX FIX_tblBGiftVoucherItem_incl ON dbo.tblBGiftVoucherItem (strItemNo) INCLUDE (strTier3) WHERE isUsGift = 1; …

2
活页和非活页有什么区别?
我一直在运行一些索引使用情况报告,并且正在尝试获取Leaf和Non-leaf的定义。似乎同时存在叶子和非叶子插入,更新,删除,页面合并和页面分配。我真的不知道这意味着什么,或者一个比另一个更好。 如果有人可以给每个简单的定义,并解释为什么叶子或非叶子很重要,不胜感激!

2
更新所有列(即使是未更改的列)的开销是多少?
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 2年前关闭。 在更新行时,许多ORM工具都会发出UPDATE语句来设置与该特定实体相关联的每一列。 优点是您可以轻松批处理update语句,因为UPDATE无论您更改什么实体属性,该语句都是相同的。此外,您甚至还可以使用服务器端和客户端语句缓存。 因此,如果我加载一个实体并仅设置一个属性: Post post = entityManager.find(Post.class, 1L); post.setScore(12); 所有列都将被更改: UPDATE post SET score = 12, title = 'High-Performance Java Persistence' WHERE id = 1 现在,假设我们在title属性上也有一个索引,DB难道不应该意识到该值没有改变吗? 在本文中,Markus Winand说: 所有列上的更新都显示了我们在上一节中已经观察到的相同模式:响应时间随每个其他索引的增加而增加。 我不知道为什么会产生这种开销,因为数据库将相关的数据页从磁盘加载到内存中,从而可以确定是否需要更改列值。 即使对于索引,它也不会重新平衡任何内容,因为对于未更改的列,索引值不会更改,但是它们已包含在UPDATE中。 是否也需要导航与冗余未更改列关联的B +树索引,只是为了让数据库意识到叶值仍然相同? 当然,某些ORM工具允许您仅更新已更改的属性: UPDATE post SET score = 12, WHERE id = 1 但是,当为不同的行更改不同的属性时,这种类型的UPDATE可能并不总是从批量更新或语句缓存中受益。

1
为什么不重建页数小于1000的索引?
我使用Ola Hallengrens脚本进行索引维护。在此之前,我使用以下查询来查看哪些索引最分散: SELECT dbschemas.[name] as 'Schema', dbtables.[name] as 'Table', dbindexes.[name] as 'Index', indexstats.avg_fragmentation_in_percent, indexstats.page_count FROM sys.dm_db_index_physical_stats (DB_ID(), NULL, NULL, NULL, NULL) AS indexstats INNER JOIN sys.tables dbtables on dbtables.[object_id] = indexstats.[object_id] INNER JOIN sys.schemas dbschemas on dbtables.[schema_id] = dbschemas.[schema_id] INNER JOIN sys.indexes AS dbindexes ON dbindexes.[object_id] = indexstats.[object_id] AND indexstats.index_id …

2
在调用数据库上下文中执行的中央存储过程
我正在使用该sys.dm_db_index_physical_stats视图开发定制的维护解决方案。我目前有从存储过程中引用它。现在,当该存储过程在我的一个数据库上运行时,它会执行我想要的操作,并拉出与任何数据库有关的所有记录的列表。当我将其放置在其他数据库上时,它会拉出仅与该数据库有关的所有记录的列表。 例如(底部代码): 针对数据库6的查询运行显示了[请求的]数据库1-10的信息。 针对数据库3运行的查询仅显示数据库3的[请求的]信息。 我要对数据库3专门执行此过程的原因是,我希望将所有维护对象保留在同一数据库中。我想把这项工作放在维护数据库中,就像在该应用程序数据库中一样工作。 码: ALTER PROCEDURE [dbo].[GetFragStats] @databaseName NVARCHAR(64) = NULL ,@tableName NVARCHAR(64) = NULL ,@indexID INT = NULL ,@partNumber INT = NULL ,@Mode NVARCHAR(64) = 'DETAILED' AS BEGIN SET NOCOUNT ON; DECLARE @databaseID INT, @tableID INT IF @databaseName IS NOT NULL AND @databaseName NOT IN ('tempdb','ReportServerTempDB') BEGIN …


2
从未使用以DATETIME作为复合键第一部分的主键索引
我在将DATETIME(甚至日期)作为PRIMARY KEY的第一部分时遇到问题。 我使用MySQL 5.5 这是我的两张桌子: -- This is my standard table with dateDim as a dateTime CREATE TABLE `stats` ( `dateDim` datetime NOT NULL, `accountDim` mediumint(8) unsigned NOT NULL, `execCodeDim` smallint(5) unsigned NOT NULL, `operationTypeDim` tinyint(3) unsigned NOT NULL, `junkDim` tinyint(3) unsigned NOT NULL, `ipCountryDim` smallint(5) unsigned NOT NULL, `count` …



By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.