Questions tagged «index»

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

2
限时降低ORDER BY
我有这个查询: SELECT * FROM location WHERE to_tsvector('simple',unaccent2("city")) @@ to_tsquery('simple',unaccent2('wroclaw')) order by displaycount 我对此感到满意: "Sort (cost=3842.56..3847.12 rows=1826 width=123) (actual time=1.915..2.084 rows=1307 loops=1)" " Sort Key: displaycount" " Sort Method: quicksort Memory: 206kB" " -> Bitmap Heap Scan on location (cost=34.40..3743.64 rows=1826 width=123) (actual time=0.788..1.208 rows=1307 loops=1)" " Recheck Cond: (to_tsvector('simple'::regconfig, unaccent2((city)::text)) …



1
从具有聚集索引的SQL Server表删除数据期间,B树是否重新平衡?
我在SQL Server数据库中有一个表,在主键上有聚簇索引。该表有100万行。如果我从表中删除了1万行,执行删除操作期间索引是否会被重组? 删除操作是存储过程的一部分。一次,一个以上的客户端可以执行该存储过程,但是每个单独的运行都将删除其自己的一组行(由主键唯一标识)。当多个客户端执行该过程时,我将无法使用(U型)键锁。阻止程序锁属于同一表中的一行,并且不属于任何同时运行的事务。不应有任何阻塞,因为每次运行都试图删除自己的行集。由于已关闭锁升级,因此不会发生。 我怀疑,删除操作一定会导致索引重新平衡,因此在重组过程中,它可能会对表的任何行进行键锁定。 我对此表示感谢。

2
创建表时聚簇索引创建失败
运行以下脚本时出现错误; IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE='BASE TABLE' AND TABLE_NAME='Table_Name') BEGIN CREATE TABLE Table_Name ( Field_Name_1 binary(32) NOT NULL CONSTRAINT PK_Name_Goes_Here PRIMARY KEY NONCLUSTERED , Field_Name_2 int NOT NULL , Field_Name_3 datetime NOT NULL INDEX IX_Name_Goes_Here CLUSTERED ) END 特别是聚集索引的创建会引发以下错误: 消息1018,级别15,状态1,第15行 'INDEX'附近的语法不正确。如果要将其用作表提示的一部分,则现在需要A WITH关键字和括号。有关正确的语法,请参见SQL Server联机丛书。 这很奇怪,因为它适用于我们所有的服务器,但特定的质量检查服务器除外。我们已经解决的问题是在表创建语句之外创建聚簇索引,但是如果有人之前遇到过此问题,我将很感兴趣。

3
在非持久计算列SQL Server上创建非聚集索引
我正在努力寻找有关SQL Server如何实际存储非持久计算列的任何文档。 请看以下示例: --SCHEMA CREATE TABLE dbo.Invoice ( InvoiceID INT IDENTITY(1, 1) PRIMARY KEY, CustomerID INT FOREIGN KEY REFERENCES dbo.Customer(CustomerID), InvoiceStatus NVARCHAR(50) NOT NULL, InvoiceStatusID AS CASE InvoiceStatus WHEN 'Sent' THEN 1 WHEN 'Complete' THEN 2 WHEN 'Received' THEN 3 END ) GO --INDEX CREATE NONCLUSTERED INDEX IX_Invoice ON Invoice …

1
报告的索引大小和执行计划中的缓冲区数之间存在巨大的不匹配
问题 我们有一个类似的查询 SELECT COUNT(1) FROM article JOIN reservation ON a_id = r_article_id WHERE r_last_modified < now() - '8 weeks'::interval AND r_group_id = 1 AND r_status = 'OPEN'; 由于超时(通常在10分钟后)更多,因此我决定调查此问题。 该EXPLAIN (ANALYZE, BUFFERS)输出如下所示: Aggregate (cost=264775.48..264775.49 rows=1 width=0) (actual time=238960.290..238960.291 rows=1 loops=1) Buffers: shared hit=200483 read=64361 dirtied=666 written=8, temp read=3631 written=3617 I/O Timings: …

3
仅当过滤的部分位于JOIN而不是WHERE时才使用过滤的索引
我在下面创建了过滤索引,但是当我进一步向下运行2个查询时,该索引仅在JOIN中具有END_DTTM而不是where子句的第一个示例中用于查找(这是查询中的唯一区别) 。谁能解释为什么会这样? 索引创建 CREATE NONCLUSTERED INDEX [ix_PATIENT_LIST_BESPOKE_LIST_ID_includes] ON [dbo].[PATIENT_LIST_BESPOKE] ( [LIST_ID] ASC, [END_DTTM] ASC ) WHERE ([END_DTTM] IS NULL) 查询 DECLARE @LIST_ID INT = 3655 --This one seeks on the index SELECT PATIENT_LISTS.LIST_ID FROM DBO.PATIENT_LISTS LEFT JOIN DBO.PATIENT_LIST_BESPOKE ON PATIENT_LISTS.LIST_ID = PATIENT_LIST_BESPOKE.LIST_ID AND PATIENT_LIST_BESPOKE.END_DTTM IS NULL WHERE PATIENT_LISTS.LIST_ID = @LIST_ID …

3
PostgreSQL可以在索引中使用空值吗?
我读过这本书说 数据库假定Indexed_Col IS NOT NULL覆盖的范围太大而无用,因此数据库不会从这种情况驱动到索引。 我认识到这本书已有十多年的历史了,但是它已经被证明是非常有用的-使用从书页中收集到的指令,我将查询速度提高了十倍。 此外,在运行EXPLAIN ANALYZE上一SELECT查询,我发现没有我的指标正在使用,所有的权利,即使他们应该是。 因此,我的问题是: 假设有一个表包含一个列,该列的列定义包括“ NOT NULL”,并且存在一个覆盖该列的索引,那么该索引是否可以用于该表的查询中,该列是查询的一部分? 喜欢: CREATE TABLE my_table( a varchar NOT NULL ); CREATE INDEX ix_my_table ON my_table(a); SELECT a from my_table;

2
如何确定添加索引的成本/收益?
根据Craig Ringer的说法: 虽然在引用侧外键列上(或包括)创建索引通常是一个好主意,但这不是必需的。每个索引添加减慢DML操作略有下降,所以你在每交纳履约成本INSERT,UPDATE或DELETE。如果很少使用该索引,则可能不值得使用。 您如何确定添加索引的好处是否超过其成本? 您是否在添加索引之前/之后分析了单元测试,并检查整体性能提升?或者,还有更好的方法?

1
MySqlDump的DISABLE KEYS对导入无效
我对我之前关于Inno-Tables的导入速度的问题有一个后续问题(惊奇!)。 方案 我尝试在合理的时间内在本地开发计算机上导入一些big *数据库转储。我们KEY在表上附加了许多s,这些表原来是瓶颈,但对于我们的实时系统仍然很重要。 在问完上述问题后,我的方法是KEY ...从转储,导入和重新添加键中删除语句。 但是,我经常发现自己正在编辑当前的转储以将其导入本地,并且偶然发现了这些有趣的“注释”(- disable/enable keys行) -- -- Dumping data for table `monster` -- LOCK TABLES `monster` WRITE; /*!40000 ALTER TABLE `monster` DISABLE KEYS */; INSERT … INSERT … INSERT /*!40000 ALTER TABLE `monster` ENABLE KEYS */; UNLOCK TABLES; 但实际上,这些“注释”是有条件的MySql语句 这对我来说是个新闻,但好的,鉴于输出形式mysql --version对我来说一切正常: mysql Ver 14.14 Distrib 5.5.38, …

1
在表上创建MySQL索引失败
更新:tl; dr:问题是MySQL TMPDIR在创建索引时使用。而我TMPDIR的磁盘空间不足。 原始问: 我正在尝试向InnoDB表添加索引,并获得一个table is full error。我有足够的磁盘空间,MySQL配置的文件表数量为1。表数据为85GB,我假设索引约为20GB-30GB,并且我的磁盘空间要大得多。我也在使用ext3,因此从操作系统的角度来看,文件大小限制没有任何问题。 记录的错误如下所示: 140616 13:04:33 InnoDB: Error: Write to file (merge) failed at offset 3 1940914176. InnoDB: 1048576 bytes should have been written, only 970752 were written. InnoDB: Operating system error number 0. InnoDB: Check that your OS and file system support files of …
10 mysql  innodb  index 

1
在80M行索引表上运行插入查询时,MSG 666
奇怪的是,我的存储过程开始收到某些输入数据的消息666。 当存储过程尝试将行插入具有以下结构的表中时,存储过程在最后一步失败: Columns: A_Id: PK, int B_Id: PK, FK, int C_Id: PK, FK, int D_Id: PK, smallint 这实际上是一个将所有引用的实体连接在一起的表。 Indexes: IX_TableName_D_id - Clustered index on D_id column PK_TableName - Unique non-clustered index on all columns (A_Id, B_Id, C_Id, D_Id) 两个索引的碎片率都很​​低(<25%)。但是,由于对表的操作量非常大,PK_TableName碎片迅速增加。 桌子尺寸: Row count: ~80,000,000 rows 因此,当我尝试运行简单的查询时,对于某些D_Id,我会收到以下消息: 消息666。对于分区ID为422223771074560的索引,超出了复制组的最大系统生成的唯一值。删除并重新创建索引可能会解决此问题;否则,请使用另一个群集密钥。 查询示例: INSERT INTO TableName …

2
用过滤的(非空值)索引替换索引有什么作用?
我们的项目运行着非常大,非常复杂的数据库。因此,大约一个月前,我们注意到包含空值的索引列使用的空间变得太大。为此,我编写了一个脚本,该脚本将动态搜索包含大于1%的空值的所有单列索引,然后在值不为空的情况下删除并重新创建这些索引作为筛选索引。这将在整个数据库中删除并重新创建数百个索引,通常会释放整个数据库使用的近15%的空间。 现在我对此有两个问题: A)以这种方式使用过滤索引的不利之处是什么?我认为这只会提高性能,但是会涉及性能风险吗? B)在删除和重新创建索引时,我们收到错误消息(“无法删除索引XYZ,因为它不存在或您没有权限”),即使事后检查,一切都按预期进行。怎么会这样 谢谢你的帮助! 编辑:响应@Thomas Kejser 嗨,谢谢,但事实证明这是一场灾难。当时我们还不了解几件事,例如: 在查询期间,SQLOS在确定不能使用NULL值联接表列之前先制定索引计划。IE,您确实确实需要有WHERE子句过滤器,以适合查询中使用的每个过滤索引的索引,否则该索引将根本不使用。 删除和创建索引,然后再次冗余更新其统计信息可能仍然不足以产生更新的计划,而我们认为是可以的。在某些情况下,似乎只有足够高的工作量会迫使SQL Server重新评估计划。 执行计划程序的功能有些奇特之处,仅凭常识和逻辑很难确定。甚至在成千上万的由代码背后生成的不同查询的变体中,看似无用的索引也可以帮助进行某些统计和查询计划,最终将其用于关键查询中。 最后,这些更改被还原。因此,过滤后的索引是一个强大的工具,但是您需要真正了解从这些列中获取的数据。除了空间问题以外的常规索引都非常容易应用,而过滤后的索引则代表了非常定制的解决方案。它们当然不能代替常规索引,而是在需要它们的特殊情况下对其的扩展。

1
对值为NULL的布尔值进行查询时发生意外的Seq扫描
我有一个称为auto_review列类型为的数据库列boolean。使用ActiveRecord ORM创建该字段的索引。 CREATE INDEX index_table_on_auto_renew ON table USING btree (auto_renew); 当我在字段中查询布尔值时,PG会按预期使用索引。 EXPLAIN for: SELECT "table".* FROM "table" WHERE "table"."auto_renew" = 'f' QUERY PLAN ---------------------------------------------------------------------------------------------- Bitmap Heap Scan on table (cost=51.65..826.50 rows=28039 width=186) Filter: (NOT auto_renew) -> Bitmap Index Scan on index_domains_on_auto_renew (cost=0.00..44.64 rows=2185 width=0) Index Cond: (auto_renew = false) (4 …

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.