Questions tagged «index»

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

4
SSD是否会降低数据库的实用性
我今天只听说过罗伯特·马丁(Robert Martin),看来他是软件界的佼佼者,所以我的意思不是要让我的头衔看起来像是点击诱饵,或者是我在他口中吐槽,但这仅仅是我以有限的经验和理解来解释我从他那里听到的信息。 我今天正在观看视频(关于软件体系结构),在Robert C. Martin的演讲中,在视频的后半部分,数据库主题是主要焦点。 根据我对他所说内容的理解,似乎他在说固态硬盘会降低数据库的实用性(相当可观)。 要解释我是如何进行这种解释的: 他讨论了使用HDD /旋转磁盘如何缓慢地检索数据。但是,这些天我们使用SSD。他以“ RAM即将到来”开始,然后继续提及RAM磁盘,但随后说他不能称其为RAM磁盘,因此只能说RAM。因此对于RAM,我们不需要索引,因为每个字节花费相同的时间来获取。(本段由我解释) 因此,他建议使用RAM(例如计算机内存中的内存)来代替数据库(因为这就是我解释他的声明的意思)没有任何意义,因为这就像说所有记录在应用程序的生命周期内都是在内存中处理的(除非您根据需要从磁盘文件中提取) 因此,我求助于RAM,他的意思是SSD。因此,在那种情况下,他说固态硬盘会降低数据库的实用性。他甚至说:“如果我是Oracle,我会感到害怕。我之所以存在的根本基础正在消失。” 从我对SSD的了解很少,不像HDD那样需要O(n)寻道时间(我认为),SSD接近O(1)或几乎是随机的。因此,他的建议对我来说很有趣,因为我从未想过。几年前,当我第一次被介绍给数据库时,一位教授描述了常规文件系统所没有的好处,我得出结论,数据库的主要作用本质上是一个索引很高的文件系统(以及优化,缓存,并发访问,等等),因此,如果SSD中不需要索引,这种方法会使数据库的使用率降低。 不管怎么说,以我是新手开头,我很难相信它们变得没有用,因为每个人仍然使用DBs作为其应用程序的主要观点,而不是纯文件系统,并且觉得他过于简化了。数据库的作用。 注意:我一直观察到最后,以确保他没有说不同的话。 供参考:42 : 22是整个数据库主题出现的时间, 43:52是他以“为什么还要拥有数据库”开始的时间 这个答案确实表明SSD大大提高了DB的速度。 此问题询问如何更改优化。 对于TL; DR,我的问题是,服务器市场上广泛使用SSD的出现(无论即将到来还是已经发生)是否会降低数据库的实用性? 似乎演示者试图传达的是,使用SSD,人们可以将数据存储在磁盘上,而不必担心像旧版HDD以及SSD一样检索数据的速度会很慢。O(1)(我认为)。因此,如果这是真的,那么假设会失去它的优势之一:建立索引,因为拥有索引以缩短查找时间的优势已荡然无存。

2
将索引视图用于聚合-太好了以至于无法实现?
我们有一个数据仓库,它的记录数很大(10-20百万行),并且经常运行查询来对某些日期之间的记录进行计数,或者对带有某些标志的记录进行计数,例如 SELECT f.IsFoo, COUNT(*) AS WidgetCount FROM Widgets AS w JOIN Flags AS f ON f.FlagId = w.FlagId WHERE w.Date >= @startDate GROUP BY f.IsFoo 性能并不是很糟糕,但可能会相对缓慢(在冷缓存中可能为10秒)。 最近,我发现我可以GROUP BY在索引视图中使用,因此尝试了类似于以下内容的操作 CREATE VIEW TestView WITH SCHEMABINDING AS SELECT Date, FlagId, COUNT_BIG(*) AS WidgetCount FROM Widgets GROUP BY Date, FlagId; GO CREATE UNIQUE CLUSTERED …

2
创建索引与更改表添加索引-MySQLism还是SQL Standard?
刚遇到一个奇怪的问题,根据我创建索引的方式,需要一个索引名称。 http://dev.mysql.com/doc/refman/5.5/zh-CN/create-index.html http://dev.mysql.com/doc/refman/5.5/en/alter-table.html CREATE INDEX `random_name` ON `my_table` (`my_column`); # Requires an index name ALTER TABLE `my_table` ADD INDEX (`my_column`); # Does not require an index name 在我看来,CREATE INDEX调用不应使索引名称成为必需。我想知道这是MySQLism还是SQL标准?

2
什么是“部分匹配指数”?
我试图了解有关SQL Server 2016中引入的“外键引用检查”查询计划运算符的更多信息。那里没有很多有关它的信息。微软在这里宣布了它,我在这里发表了博客。通过从具有254个或更多传入外键引用的父表中删除一行,可以看到new运算符:dbfiddle link。 操作员详细信息中显示三种不同的计数: 外键引用计数是传入外键的数量。 没有匹配的索引计数是没有合适索引的传入外键的数量。验证更新或删除的表不会违反该约束将需要对子表进行扫描。 我不知道部分匹配索引计数代表什么。 在这种情况下,什么是部分匹配索引?我无法进行以下任何工作: 筛选索引 将外键列作为INCLUDE索引的列 使用外键列作为第二个键列的索引 多列外键的单列索引 创建多个覆盖索引以为多列外键启用“索引连接”计划 Dan Guzman指出,即使索引键的顺序与外键列的顺序不同,多个列的外键也可以匹配索引。他的代码是在这里,以防有人能够以它为起点来进一步了解部分匹配索引。

1
带日期的索引优化
此问题是从Stack Overflow 迁移而来的,因为可以在Database Administrators Stack Exchange上回答。 迁移 7年前。 我在PostgreSQL 9.0.8中有一个很大的对象表(15M +行),我想查询该表中的过时字段。 我想将查询除以数百万,以实现可伸缩性和并发性,并且我想获取几天前带有update_at字段的所有数据。 我已经在100万个ID上尝试了许多索引和查询,但是使用Heroku的Ronin硬件在100秒内似乎无法获得性能。 我正在寻找我没有试图使其尽可能高效的建议。 尝试#1 EXPLAIN ANALYZE SELECT count(*) FROM objects WHERE (date(updated_at)) < (date(now())-7) AND id >= 5000001 AND id < 6000001; INDEX USED: (date(updated_at),id) 268578.934 ms 尝试#2 EXPLAIN ANALYZE SELECT count(*) FROM objects WHERE ((date(now()) - (date(updated_at)) > …

2
我应该如何在Postgres中为UUID编制索引?
我是PostgreSQL的新手,而对于数据库则是新手。有没有确定的方法来索引Postgres中的UUID值?我在使用散列和使用Trie之间是分开的,除非已经有一些内置的东西可以自动使用。无论我使用什么,都将处理大量数据。 SP-GiST运算符系列“ text_ops”使用特里索引。因为UUID很长且非常不同,所以即使我只进行完全匹配搜索,这些听起来也很吸引人。 还有一个哈希选项。哈希为O(1),我当然不需要做任何比较,但是,由于UUID很长,因此恐怕从它们生成哈希值会浪费很多时间。 还是这过于依赖系统和使用细节? 在大多数情况下,我宁愿使用bigserial,但有人告诉我为此使用uuid。我们需要uuid,因为我们可能有多个使用不同数据库的服务器,因此不能保证我们将拥有唯一的bigint。我们可以为每个服务器使用不同的序列(和种子),但是它仍然不如UUID灵活。例如,如果不将ID及其引用转换到各处,就无法将数据库条目从一台服务器迁移到另一台服务器。
26 postgresql  index  uuid 

6
ON与WHERE的索引表现
我有两张桌子 @T1 TABLE ( Id INT, Date DATETIME ) @T2 TABLE ( Id INT, Date DATETIME ) 这些表在(Id,Date)上具有非聚集索引 我加入这些表 SELECT * FROM T1 AS t1 INNER JOIN T2 AS t2 ON t1.Id = t2.Id WHERE t1.Date <= GETDATE() AND t2.Date <= GETDATE() 这也可以写成 SELECT * FROM T1 AS t1 INNER …

2
如何知道何时/是否索引过多?
时不时地运行Microsoft SQL Server Profiler,它建议我创建一系列新的索引和统计信息(“ ... 97%的预期改进...”)。 据我了解,每个增加的索引都可以使SQL SELECT查询更快,但由于必须调整索引,因此SQL UPDATE或SQL 查询的速度也会INSERT变慢。 我想知道的是,什么时候会有“太多”的索引/统计信息? 也许对此没有明确的答案,但有一些经验法则。

1
索引:如果节点数相同,则整数vs字符串性能
我正在使用PostgreSQL(9.4)数据库在Ruby on Rails中开发应用程序。在我的用例中,表中的列将被非常频繁地查找,因为应用程序的重点是在模型上搜索非常特定的属性。 我目前正在决定是使用一种integer类型还是只使用典型的字符串类型(例如character varying(255),Rails中的默认字符串类型)作为列,因为我不确定索引的性能会有什么不同。 这些列是枚举。对于具有的可能值的数量,它们具有固定的大小。大多数枚举长度不超过5,这意味着该索引在应用程序的整个生命周期中或多或少是固定的;因此,整数和字符串索引的节点数将相同。 但是,将被索引的字符串可能长约20个字符,这在内存中大约是整数的5倍(如果整数是4个字节,并且字符串是每个字符1个字节的纯ASCII,则成立)。我不知道数据库引擎怎么做索引查找窗口,但如果它需要“扫描”的字符,直到它匹配准确,那么在本质上这意味着该字符串查找就超过5倍的整数查找速度较慢; 直到匹配整数查找为止的“扫描”将是4个字节而不是20个字节。这就是我的想象: 查找值为(整数)4: 正在扫描.........................找到| 正在获取记录... | BYTE_1 | BYTE_2 | BYTE_3 | BYTE_4 | BYTE_5 | BYTE_6 | BYTE_7 | BYTE_8 | ... | 查找值是(字符串)“ some_val”(8个字节): 扫描................................................. ....................................发现| 正在获取记录... | BYTE_1 | BYTE_2 | BYTE_3 | BYTE_4 | BYTE_5 | BYTE_6 | BYTE_7 | …

5
两个日期列的SARGable WHERE子句
对于我来说,我有一个关于可保存性的有趣问题。在这种情况下,它是关于两个日期列之间的差异使用谓词。设置如下: USE [tempdb] SET NOCOUNT ON IF OBJECT_ID('tempdb..#sargme') IS NOT NULL BEGIN DROP TABLE #sargme END SELECT TOP 1000 IDENTITY (BIGINT, 1,1) AS ID, CAST(DATEADD(DAY, [m].[severity] * -1, GETDATE()) AS DATE) AS [DateCol1], CAST(DATEADD(DAY, [m].[severity], GETDATE()) AS DATE) AS [DateCol2] INTO #sargme FROM sys.[messages] AS [m] ALTER TABLE [#sargme] ADD …

2
提高大型PostgresSQL表中COUNT / GROUP-BY的性能?
我正在运行PostgresSQL 9.2,并具有12列的关系,大约有6,700,000行。它包含3D空间中的节点,每个节点都引用一个用户(创建它的用户)。为了查询哪个用户创建了多少个节点,我执行以下操作(添加explain analyze以获得更多信息): EXPLAIN ANALYZE SELECT user_id, count(user_id) FROM treenode WHERE project_id=1 GROUP BY user_id; QUERY PLAN --------------------------------------------------------------------------------------------------------------------------- HashAggregate (cost=253668.70..253669.07 rows=37 width=8) (actual time=1747.620..1747.623 rows=38 loops=1) -> Seq Scan on treenode (cost=0.00..220278.79 rows=6677983 width=8) (actual time=0.019..886.803 rows=6677983 loops=1) Filter: (project_id = 1) Total runtime: 1747.653 ms 如您所见,这大约需要1.7秒。考虑到数据量,这还算不错,但是我想知道是否可以改进。我试图在用户列上添加一个BTree索引,但这没有任何帮助。 您还有其他建议吗? 为了完整起见,这是完整的表定义及其所有索引(没有外键约束,引用和触发器): Column …

5
如何在MySQL中创建条件索引?
如何在MySQL中创建索引以过滤表的特定范围或子集?AFAIK无法直接创建,但我认为可以模拟此功能。 示例:我NAME只想为带有行的列创建索引STATUS = 'ACTIVE' 此功能在SQL Server中称为筛选索引,在Postgres中称为部分索引。

4
索引空间大于数据空间是否不好?
我经常需要对没有正确索引的大型表运行查询。因此,我要求DBA创建此类索引。他要做的第一件事是查看表统计信息,并查看索引空间大小。 他经常告诉我找到替代解决方案,因为“索引已经大于表”。他认为索引必须小于数据,因为他告诉我“您见过书中的索引吗?它比书本小得多,这就是表索引应该的样子”。 我认为他的理念不正确,但是我不能挑战他,因为他是首席DBA,而我是一名开发人员。我觉得如果查询需要索引,则应该只创建索引,而不是查找只会使SP变得不可读和无法维护的“替代方法”。 我只选择必填列。问题是我按日期过滤,因此引擎必须进行表扫描以匹配列。该查询每天晚上运行一次,以收集统计信息,但是运行需要15分钟(我们有另一条严格的规则:任何过程都不应超过3分钟)。 DBA向我显示了索引统计信息。该表上大约有10个索引,其中只有6个被使用(统计数据显示零命中4个)。这是一个大型系统,有20多个开发人员参与。索引是出于任何原因而创建的,并且可能不再使用。 我们需要支持SQL Server 2008,因为这就是运行测试数据库的基础。但是客户都在2014年和2016年。
22 sql-server  index 

1
重建索引时何时使用sort_in_tempdb?
我们正在讨论是否对DW表使用SORT_IN_TEMPDB选项。我的理解是,使用此选项时会有更多的写入,尽管它们的顺序更大。我们有一个SAN(众所周知,它有时速度很慢),因此在我们的情况下,我们希望尽可能地限制写入次数。我相信tempdb位于单独的LUN(磁盘集)上。 我们的数据文件和tempdb文件中都有足够的磁盘空间。在这种情况下,我们可以从使用SORT_IN_TEMPDB中受益吗? 令我震惊的是对此答案的评论 重建索引时,您将需要索引空间的两倍+ 20%进行排序。因此,通常来说,要重建数据库中的每个索引,您只需要数据库中最大索引的120%。如果您使用SORT_IN_TEMPDB,则只能赢20%,您的数据文件中仍然需要100%的附加收入。此外,在tempdb中使用sort会大大增加您的IO负载,因为您现在不再将索引一次写入数据文件,而是一次将其写入tempdb,然后再将其写入数据文件。因此,这并不总是理想的。 我们绝对不希望通过慢速/可能配置错误的SAN增加IO负载。 最好的测试方法是什么?通过简单地重建带有和不带有该选项的表并记录时间? 编辑:我们有8个tempdb文件,每个15GB。我们确实设置了TF 1117/1118标志,并且启用了IFI。当前,我们使用sort_in_tempdb选项(不带该选项)进行混合重建。 谢谢! SQL Server 2012企业版

2
LIKE使用索引,CHARINDEX不使用索引吗?
这个问题与我的旧问题有关。以下查询需要10到15秒才能执行: SELECT [customer].[Customer name],[customer].[Sl_No],[customer].[Id] FROM [company].dbo.[customer] WHERE (Charindex('123456789',CAST([company].dbo.[customer].[Phone no] AS VARCHAR(MAX)))>0) 在一些文章中,我看到使用索引CAST并CHARINDEX不会从中受益。也有一些文章说使用LIKE '%abc%'将不会从索引中受益,而LIKE 'abc%'将会: http://bytes.com/topic/sql-server/answers/81467-using-charindex-vs-like-where /programming/803783/sql-server-index-any-improvement-for -like-queries http://www.sqlservercentral.com/Forums/Topic186262-8-1.aspx#bm186568 就我而言,我可以将查询重写为: SELECT [customer].[Customer name],[customer].[Sl_No],[customer].[Id] FROM [company].dbo.[customer] WHERE [company].dbo.[customer].[Phone no] LIKE '%123456789%' 此查询提供与上一个相同的输出。我为column创建了一个非聚集索引Phone no。当我执行此查询时,它将在1秒内运行。与之前的14秒相比,这是一个巨大的变化。 如何LIKE '%123456789%'从索引中受益? 为什么列出的文章指出它不会提高性能? 我尝试重写要使用的查询CHARINDEX,但是性能仍然很慢。为什么CHARINDEX在LIKE查询中没有从索引中受益呢? 使用查询CHARINDEX: SELECT [customer].[Customer name],[customer].[Sl_No],[customer].[Id] FROM [Company].dbo.[customer] WHERE ( Charindex('9000413237',[Company].dbo.[customer].[Phone no])>0 ) 执行计划: 使用查询LIKE: SELECT [customer].[Customer …

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.