Questions tagged «index»

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

1
使用非聚集索引更新不同行时出现死锁
我正在解决一个死锁问题,但我发现在id字段上使用聚集索引和非聚集索引时,锁的行为有所不同。如果将聚集索引或主键应用于id字段,则似乎可以解决死锁问题。 我有不同的事务对一个不同的行进行一个或多个更新,例如事务A将仅更新ID = a的行,事务B将仅触摸ID = b的行,等等。 而且我知道没有索引,更新将获取所有行的更新锁,并在必要时隐式转换为排他锁,这最终将导致死锁。但是我无法找出为什么非聚集索引仍然存在死锁(尽管命中率似乎下降了) 数据表: CREATE TABLE [dbo].[user]( [id] [int] IDENTITY(1,1) NOT NULL, [userName] [nvarchar](255) NULL, [name] [nvarchar](255) NULL, [phone] [nvarchar](255) NULL, [password] [nvarchar](255) NULL, [ip] [nvarchar](30) NULL, [email] [nvarchar](255) NULL, [pubDate] [datetime] NULL, [todoOrder] [text] NULL ) 死锁跟踪 deadlock-list deadlock victim=process4152ca8 process-list process id=process4152ca8 taskpriority=0 logused=0 …

2
在PostgreSQL中使用GIN索引时如何加快ORDER BY排序?
我有一个这样的表: CREATE TABLE products ( id serial PRIMARY KEY, category_ids integer[], published boolean NOT NULL, score integer NOT NULL, title varchar NOT NULL); 一个产品可以属于多个类别。category_ids列包含所有产品类别的ID列表。 典型查询如下所示(始终搜索单个类别): SELECT * FROM products WHERE published AND category_ids @> ARRAY[23465] ORDER BY score DESC, title LIMIT 20 OFFSET 8000; 为了加快速度,我使用以下索引: CREATE INDEX idx_test1 ON products …

2
为什么我的WHERE子句从“包含”列中受益?
根据此答案,除非在用于限制的列上建立索引,否则查询将不会从索引中受益。 我有这个定义: CREATE TABLE [dbo].[JobItems] ( [ItemId] UNIQUEIDENTIFIER NOT NULL, [ItemState] INT NOT NULL, [ItemPriority] INT NOT NULL, [CreationTime] DATETIME NULL DEFAULT GETUTCDATE(), [LastAccessTime] DATETIME NULL DEFAULT GETUTCDATE(), -- other columns ); CREATE UNIQUE CLUSTERED INDEX [JobItemsIndex] ON [dbo].[JobItems]([ItemId] ASC); GO CREATE INDEX [GetItemToProcessIndex] ON [dbo].[JobItems]([ItemState], [ItemPriority], [CreationTime]) INCLUDE (LastAccessTime); …

1
如何优化查询,使其首先查找一个索引,然后查找另一个索引
我有两组来自卫星数据的地球测量数据,每组都有时间字段(均值朱利安日期为mjd)和地理位置(GeoPoint,空间),并且我正在寻找两组数据之间的重合,以使它们的时间与阈值相匹配。 3小时(或0.125天),且彼此之间的距离不超过200公里。 我已经为表和空间表上的mjd字段都建立了索引。 当我刚刚加入时间限制时,数据库将在8秒内计算100,000个匹配项,并计算该时间内所有100,000个匹配项的距离。查询如下所示: select top 100000 h.Time, m.Time, h.GeoPoint.STDistance(m.GeoPoint)/1000.0 from L2V5.dbo.header h join L2.dbo.MLS_Header m on h.mjd between m.mjd-.125 and m.mjd+.125 option( table hint ( h, index(ix_MJD) ), table hint( m, index(ix_MJD) ) ) 执行的计划是: 排序后,有9条距离在200公里以下,因此有比赛。问题是,当我添加距离约束并改为运行它时, select top 10 h.Time, m.Time, h.GeoPoint.STDistance(m.GeoPoint)/1000.0 from L2V5.dbo.header h join L2.dbo.MLS_Header m on …

2
使用复杂条件最小化索引读取
我正在优化工作票的Firebird 2.5数据库。它们存储在这样声明的表中: CREATE TABLE TICKETS ( TICKET_ID id PRIMARY KEY, JOB_ID id, ACTION_ID id, STATUS str256 DEFAULT 'Pending' ); 我通常想查找尚未处理的第一张票证并且处于Pending状态。 我的处理循环将是: 取回第一张票 Pending 使用票务。 更新故障单状态=> Complete 重复。 没什么好看的。如果在此循环运行时正在观察数据库,则可以看到每次迭代的索引读取次数都在增加。据我所知,性能似乎并没有显着下降,但是我正在测试的机器很快。但是,我从一些用户那里收到了性能随时间下降的报告。 我在上有一个索引Status,但看起来仍然像它在Ticket_Id每次迭代时向下扫描列。似乎我正在忽略某些内容,但是我不确定是什么。是这种预期的索引读取数目攀升,还是索引行为异常? -编辑评论- 在Firebird中,您可以限制行检索,例如: Select First 1 Job_ID, Ticket_Id From Tickets Where Status = 'Pending' 因此,当我说“第一”时,我只是在询问它在哪里的有限记录集Status = 'Pending'。

2
为什么此查询不使用我的非聚集索引,我该如何进行查询?
在跟进有关提高查询性能的这个问题之后,我想知道是否有一种方法可以使我的索引默认使用。 该查询运行大约2.5秒: SELECT TOP 1000 * FROM [CIA_WIZ].[dbo].[Heartbeats] WHERE [DateEntered] BETWEEN '2011-08-30' and '2011-08-31'; 这大约需要33毫秒: SELECT TOP 1000 * FROM [CIA_WIZ].[dbo].[Heartbeats] WHERE [DateEntered] BETWEEN '2011-08-30' and '2011-08-31' ORDER BY [DateEntered], [DeviceID]; [ID]字段(pk)上有一个聚集索引,[DateEntered],[DeviceID]上没有聚集索引。第一个查询使用聚集索引,第二个查询使用我的非聚集索引。我的问题分为两个部分: 为什么,由于两个查询在[DateEntered]字段上都有WHERE子句,服务器为什么在第一个而不是第二个上使用聚集索引? 即使没有orderby,如何使该查询默认使用非聚集索引?(或者为什么我不想要那种行为?)

4
确定表上的索引未使用
我一直在运行此脚本以尝试查找无关的索引 select o.name as TableName, i.name as IndexName, p.reserved_page_count * 8.0 / 1024 as SpaceInMB, s.* from sys.dm_db_index_usage_stats s inner join sys.objects o on s.object_id = o.object_id inner join sys.indexes i on i.index_id = s.index_id and i.object_id = o.object_id inner join sys.dm_db_partition_stats p on i.index_id = p.index_id and o.object_id = …

2
与索引相关的NOT逻辑的使用
根据Microsoft的有关数据库开发的书,考试70-433:Microsoft SQL Server 2008数据库开发: 前导通配符和NOT逻辑都不允许查询优化器使用索引来优化搜索。为了获得最佳性能,应避免使用NOT关键字和前导通配符。 所以我认为是NOT IN,NOT EXISTS等等 现在关于这个SO问题,我认为@GBN选择的解决方案将违反上面给出的声明。 显然,事实并非如此。 所以我的问题是:为什么?


3
索引如何影响查询性能?
显然,保留几个不同的索引会对插入和删除性能产生负面影响。查询性能如何:在一个表上保留太多索引完全有意义吗?在任何情况下添加索引都会提高查询性能(当然,对于使用索引的查询而言)还是会因为索引过多而降低查询性能,因为有必要查询所有索引以获取索引。结果? 如果表上有不同的索引:是否会全部考虑这些索引,或者从优化程序的角度来看仅是最佳索引?Oracle是否实现多维索引?


2
大表中索引扫描缓慢
使用PostgreSQL 9.2时,我在相对较大的表(200+百万行)上的慢查询遇到了麻烦。我没有尝试任何疯狂的事情,只是增加了历史价值。以下是查询和查询计划输出。 我的表格布局: Table "public.energy_energyentry" Column | Type | Modifiers -----------+--------------------------+----------------------------------------------------------------- id | integer | not null default nextval('energy_energyentry_id_seq'::regclass) prop_id | integer | not null timestamp | timestamp with time zone | not null value | double precision | not null Indexes: "energy_energyentry_pkey" PRIMARY KEY, btree (id) "energy_energyentry_prop_id" btree (prop_id) …

3
索引最大行大小错误
array列有上限吗? 插入数组字段时出现此错误- PG::Error: ERROR: index row size 3480 exceeds maximum 2712 for index "ix_data" 这是我的表格定义- create table test_array(id varchar(50), data text[]); ALTER TABLE test_array ADD PRIMARY KEY (id); CREATE INDEX ix_data ON test_array USING GIN (data); 我需要在数组字段上建立索引,因为我正在对其进行一些查询。


1
如何在mysql中的复合主键上进行INDEX?
当为两个或更多列创建复合主键时,例如PRIMARY KEY(col1, col2, col3);系统会分别对INDEX每一列进行吗? 我问这个问题的原因是,当我们使用时UNIQUE INDEX (col1, col2, col3),它仅充当INDEX第一列,而我们需要INDEX为其他列创建其他。我想知道复合主键是否也是如此。

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.