Questions tagged «index»

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

1
优化大型数据库查询(25+百万行,使用max()和GROUP BY)
我使用的是Postgres 9.3.5,并且数据库中有一个大表,目前它有2500万行,而且它往往会迅速增大。我正在尝试通过一个简单的查询来选择特定的行(所有行都unit_id只有最新的行unit_timestamp),例如: SELECT unit_id, max(unit_timestamp) AS latest_timestamp FROM all_units GROUP BY unit_id; 没有任何索引,此查询大约需要35秒才能执行。使用定义的索引(CREATE INDEX partial_idx ON all_units (unit_id, unit_timestamp DESC);),查询时间缩短到(仅)19秒左右。 我想知道是否有可能在更短的时间内(例如几秒钟)执行我的查询,如果可以,我应该采取什么步骤来进一步优化它? 我的表结构转储如下所示: CREATE TABLE "all_units" ( "unit_id" int4 NOT NULL, "unit_timestamp" timestamp(6) NOT NULL, "lon" float4, "lat" float4, "speed" float4, "status" varchar(255) COLLATE "default" ) ALTER TABLE "all_units" ADD PRIMARY …

2
高效的查询,以从大表中获取每个组的最大价值
给定表: Column | Type id | integer latitude | numeric(9,6) longitude | numeric(9,6) speed | integer equipment_id | integer created_at | timestamp without time zone Indexes: "geoposition_records_pkey" PRIMARY KEY, btree (id) 该表有2000万条记录,相对而言,这不是一个很大的记录。但这会使顺序扫描变慢。 如何获得max(created_at)每个记录的最后一条记录()equipment_id? 我已经尝试了以下两个查询,并阅读了有关该主题的许多答案的几种变体: select max(created_at),equipment_id from geoposition_records group by equipment_id; select distinct on (equipment_id) equipment_id,created_at from geoposition_records order by …

1
将主键移到文件组(SQL Server 2012)
如何将群集的主键移动到新文件组?我已经找到了可能的“算法”,但是效率很低: 删除非集群索引(要求对它们进行重新排序和重建) 删除聚簇索引(要求使用整个表) 创建新的主键约束(巨大的排序操作) 创建所有非聚集索引(需要排序和写入) 有没有更有效的方法?这是非常低效的,并且由于弱服务器上的表大小为50GB,将花费很长时间。 是否没有办法跳过所有这些,只对新文件组进行重建?那将不需要任何数据排序。

4
使用GROUP BY和ORDER BY对大表进行慢查询
我有一张桌子,上面有720万个元组,看起来像这样: table public.methods column | type | attributes --------+-----------------------+---------------------------------------------------- id | integer | not null DEFAULT nextval('methodkey'::regclass) hash | character varying(32) | not null string | character varying | not null method | character varying | not null file | character varying | not null type | character varying | …


1
如何使用“ WHERE字段为NULL”索引查询?
我的桌子上有很多插入物,将(uploaded_at)字段之一设置为NULL。然后,定期任务选择所有元组WHERE uploaded_at IS NULL,对其进行处理并更新,将其设置uploaded_at为当前日期。 我应该如何索引表? 我了解我应该使用部分索引,例如: CREATE INDEX foo ON table (uploaded_at) WHERE uploaded_at IS NULL 或类似的东西。我有点困惑,但是如果对一个始终为的字段进行索引是正确的话NULL。或者使用b树索引是否正确。哈希看起来是个更好的主意,但是它已经过时了,不能通过流热备份复制来复制。任何建议将不胜感激。 我已经尝试了以下索引: "foo_part" btree (uploaded_at) WHERE uploaded_at IS NULL "foo_part_id" btree (id) WHERE uploaded_at IS NULL 并且查询计划程序似乎总是选择foo_part索引。explain analyse也会为foo_part索引产生更好的结果: Index Scan using foo_part on t1 (cost=0.28..297.25 rows=4433 width=16) (actual time=0.025..3.649 rows=4351 loops=1) Index Cond: (uploaded_at …



3
SQL Server的8 KB数据页未使用512字节
我已经创建了下表: CREATE TABLE dbo.TestStructure ( id INT NOT NULL, filler1 CHAR(36) NOT NULL, filler2 CHAR(216) NOT NULL ); 然后创建一个聚集索引: CREATE CLUSTERED INDEX idx_cl_id ON dbo.TestStructure(id); 接下来,我为它填充30行,每个行的大小为256字节(基于表声明): DECLARE @i AS int = 0; WHILE @i < 30 BEGIN SET @i = @i + 1; INSERT INTO dbo.TestStructure (id, filler1, filler2) VALUES …

1
删除语句中未使用的聚集索引
我有一个SQL Server表定义如下 CREATE TABLE [dbo].[Production_Detail] ( [Id] [bigint] NOT NULL DEFAULT (NEXT VALUE FOR [dbo].[Production_Detail_Seq]), [Meta_Data_ID] INT NOT NULL , [Production_Detail_Time] DATETIME NOT NULL, [Production_Detail_Time_Local] DATETIME NOT NULL, [Production_Detail_Value] FLOAT NULL, [IntegratedDM] BIT NOT NULL DEFAULT 0, [DailyIntegratedDM] BIT NOT NULL DEFAULT 0, [InsertedDate] DateTime NOT NULL, [ModifiedDate] DateTime NOT …

2
向大型mysql表添加索引
我有桌子 | base_schedule_line_items | CREATE TABLE base_schedule_line_items( idint(10)unsigned NOT NULL AUTO_INCREMENT, installmentint(10)unsigned NOT NULL, on_date日期NOT NULL, actual_date日期默认值, payment_typeint(11)NOT NULL, scheduled_principal_outstanding十进制(65,0)NOT NULL, scheduled_principal_due十进制(65,0) NOT NULL, scheduled_interest_outstanding十进制(65,0)NOT NULL, scheduled_interest_due十进制(65,0)NOT NULL, currencyint(11)NOT NULL, updated_at日期时间NOT NULL缺省'2013-01-06 14:29:16', created_atdatetime NOT NULL默认值' 2013-01-06 14:29:16', loan_base_schedule_idint(10)unsigned NOT NULL, lending_idint(10)unsigned NOT NULL, rescheduletinyint(1)DEFAULT'0', PRIMARY KEY(id), KEY index_base_schedule_line_items_loan_base_schedule (loan_base_schedule_id),KEY …


2
定义索引时,列的某些顺序有什么好处
例如,如果我有两个索引: CREATE INDEX IDX_1 ON MY_TABLE_1 (ITEM, DATE, LOCATION) COMPUTE STATISTICS; CREATE INDEX IDX_2 ON MY_TABLE_1 (DATE, LOCATION, ITEM) COMPUTE STATISTICS; 这会变得IDX_2多余吗?如果没有,如何确定列的声明顺序? 我应该为常规查询量身定制索引吗?
13 oracle  index 

2
如何在PostgreSQL中将现有索引提升为主键
我知道如何在表中创建主键,但是如何使现有索引成为主键?我正在尝试将现有表从一个数据库复制到另一个数据库。当我显示表格时,底部的索引采用以下形式: "my_index" PRIMARY KEY, btree (column1, column2) 我用以下方法创建了索引: CREATE INDEX my_index ON my_table (column1, column2) 但我不知道如何使其成为主键... 更新:我的服务器版本是8.3.3

2
sys.allocation_units和sp_spaceused上的空间使用情况
众所周知的事实是DMV不能保存有关页数和行数的准确信息。但是,当您更新统计信息时,我看不到为什么他们不这样做。 我正在使用一个监视工具,想知道每个索引和数据的磁盘大小,等等。最终我想找到正确的填充因子,以及其他东西。 我的函数使用的空间和旧的sp_spaceused在空间使用上有所不同,但在记录数上却没有。 您能看到我选择的商品中缺少什么吗? 这是sp_spaceused(然后我将数字转换为MB): sp_spaceused 'tblBOrderRelationship' go select 318008/1024.00 AS reserved, 140208/1024.00 AS data, 177048/1024.00 AS index_size, 752/1024.00 AS unused 但是,当我在下面的\下面的图片中运行我的select,代码时,我得到的数字略有不同。 SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED SELECT schema_name(t.schema_id) as SchemaName, t.NAME AS TableName, t.type_desc, t.is_ms_shipped, t.is_published, t.lob_data_space_id, t.filestream_data_space_id, t.is_replicated, t.has_replication_filter, t.is_merge_published, t.is_sync_tran_subscribed, --t.is_filetable, i.name as indexName, i.type_desc, i.is_unique, …

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.