问题标签 [covering-index]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
sql - 为什么 PostgreSQL 在这个查询中不使用 *just* 覆盖索引取决于它的 IN() 子句的内容?
我有一个带有覆盖索引的表,它应该只使用索引来响应查询,而不需要检查表。事实上,如果 IN() 子句中有 1 个或几个元素,Postgres 会这样做。但是,如果 IN 子句有很多元素,它似乎是在索引上进行搜索,然后去表并重新检查条件......
我不明白为什么 Postgres 会这样做。它可以直接从索引提供查询,也可以不提供,如果它(理论上)没有其他要添加的内容,为什么要进入表?
桌子:
我正在运行的查询是:
如您所见,索引具有回复该查询所需的所有字段。
如果我在 IN 子句中只有一个或几个数字,它会:
1个号码:
在 phone_numbers 上使用 index_phone_numbers_on_hashed_phone_number 进行索引扫描(成本=0.41..8.43 行=1 宽度=4)
索引条件:((hashed_phone_number)::text = 'bebd43a6eb29b2fda3bcb63dcc7ffaf5433e78660ccd1a495c1180a3eaaf6b6a'::text)
过滤器:“
3个数字:
Index Only Scan using index_phone_numbers_covering_hashed_ghost_and_user on phone_numbers (cost=0.42..17.29 rows=1 width=4)
Index Cond: ((hashed_phone_number = ANY ('{8228a8116f1fdb12e243102cb85ecd859ebf7873d9332dce5f1343a481ec72e8,43ddeebdca2ea829d468d5debc84d475c8322cf4bf6edca286c918b04216387e,1578bf773eb6eb8a9b57a130922a28c9c91f1bda67202ef5936b39630ca4cfe4}'::text[])) AND (.. .)
过滤器:(不是幽灵)”
但是,当我在 IN 子句中有很多数字时,Postgres 正在使用索引,但随后击中表,我不知道为什么:
Bitmap Heap Scan on phone_numbers (cost=926.59..1255.81 rows=106 width=4) Recheck
Cond: ((hashed_phone_number)::text = ANY ('{b6459ce58f21d99c462b132cce7adc9ea947fa522a3849321e9fb65893006a5e,8228a8116f1fdb12e243102cb85ecd859ebf7873d9332dce5f1343a481ec72e8,ab3554acc1f287bb2e22ff20bb855e19a4177ef552676689d217dbb2a1a6177b,7ec9f58 (...)
Filter: (NOT ghost)
-> Bitmap Index Scan on index_phone_numbers_covering_hashed_ghost_and_user (cost=0.00..926.56 rows=106 width=0)
Index Cond: (((hashed_phone_number)::text = ANY ('{b6459ce58f21d99c462b132cce7adc9ea947fa522a3849321e9fb65893006a5e,8228a8116f1fdb12e243102cb85ecd859ebf7873d9332dce5f1343a481ec72e8,ab3554acc1f287bb2e22ff20bb855e19a4177ef552676689d217dbb2a1a6177b,7e (... )
当前正在执行此查询,该查询在总行数为 50k 的表中查找 250 条记录,大约是在另一个表上查找类似查询的两倍,后者在具有 500 万行的表中查找 250 条记录,而不是很有意义。
任何想法可能会发生什么,以及我是否可以做任何事情来改善这一点?
更新:将覆盖索引中的列顺序更改为先显示重影,然后再使用 hashed_phone_number 也不能解决问题:
Bitmap Heap Scan on phone_numbers (cost=926.59..1255.81 rows=106 width=4) Recheck
Cond: ((hashed_phone_number)::text = ANY ('{b6459ce58f21d99c462b132cce7adc9ea947fa522a3849321e9fb65893006a5e,8228a8116f1fdb12e243102cb85ecd859ebf7873d9332dce5f1343a481ec72e8,ab3554acc1f287bb2e22ff20bb855e19a4177ef552676689d217dbb2a1a6177b,7ec9f58 (...)
Filter: (NOT ghost)
-> Bitmap Index Scan on index_phone_numbers_covering_ghost_hashed_and_user (cost=0.00..926.56 rows=106 width=0)
Index Cond: ((ghost = false) AND ((hashed_phone_number)::text = ANY ('{b6459ce58f21d99c462b132cce7adc9ea947fa522a3849321e9fb65893006a5e,8228a8116f1fdb12e243102cb85ecd859ebf7873d9332dce5f1343a481ec72e8,ab3554acc1f287bb2e22ff20bb855e19a4177ef55267668 (...)
php - 在mysql中覆盖索引和两个表
我有两个正在比较的表(NewProducts 和 OldProducts)。NewProducts 有大约 68,000 条记录,OldProducts 大约有 51,000 条记录。我在每个表上都使用了覆盖索引,但是查询需要 20 分钟才能执行,所以我没有正确使用它。覆盖索引真的适用于多个表吗?我究竟做错了什么?谢谢你。
这是我的查询代码和索引:
mysql - MySQL select 看起来很慢但是想不出怎么改进?
我有一个有四列的表......
id是唯一的主键。其他列不是唯一的。
我想返回具有特定tid和cid值并按名称排序的所有id值的列表。所以这...
表中有大约 125k 条记录,并且应该有大约 50k 条恰好符合此条件。所有四列都有单独的索引。
在我的机器上,查询运行大约需要 140 毫秒。我需要把它降低到大约 20 毫秒或更好。我认为解决方案是添加一个新的覆盖索引,该索引按cid、tid和 name 的顺序定义。虽然没有任何区别。
有任何想法吗?我的覆盖指数是否设置不正确?
sqlite - sqlite:唯一覆盖索引
假设我有一个包含三列 A、B、C 的表 t1,其中 (A,B) 包含一个唯一键(具有数十万行)。由于 90% 的查询将采用 SELECT C FROM t1 WHERE A=? 和 B =?,我想我想要 A、B 和 C 的覆盖索引。
如何拥有包含 C 并将 (A,B) 定义为唯一的覆盖索引?
我正在考虑拥有两个索引:一个唯一索引和一个覆盖索引,并使用 INDEXED BY 强制选择覆盖索引。
这合理吗?
indexing - 列存储索引多少列
我有一个有 7 列的表。用户可能希望这些列中的任何一个用于查询。所以我要为所有 7 列创建一个列存储索引。这是一个合理的计划吗?还是为所有列创建有问题?
mysql - MySQL涵盖索引优化?
我有一个具有以下结构的表:
我希望为此 SELECT 查询创建一个覆盖索引:
我了解覆盖索引会删除磁盘 I/O 的数量,因为索引存储在内存缓存中,从而提高了性能。
对于我的 SELECT 查询,我是否正确地说,由于 WHERE 子句需要访问 Telephone_Number 值,所以将 Id 设为索引不会消除对磁盘 I/O 的需求?
如果是这样,综合指数是否(Id, Telephone_Number)
可以作为覆盖指数?还是覆盖索引必须是单列的?
sql-server - 非聚集主键和覆盖索引在性能方面的区别
我有一个包含非聚集主键的表。我打算删除这个主键并在同一列上创建一个唯一的覆盖索引。
那么该表将没有主键,而是一个唯一的覆盖索引。
我搜索了谷歌,但找不到相关主题。这从根本上是错误的吗?或者没关系。
更新:
为什么我需要将此索引转换为覆盖索引?
因为这是主键,我有很多基于这个键的选择查询。目前,对于每个选择,都需要 RID 查找,因为这是一个 NONE 聚集键。如果我将它转换为覆盖索引,那么对于那些选择查询,这个 RID 查找将消失,并且希望会有更好的性能(至少执行计划是这样说的)。
当然,完整性也是意料之中的,这就是我将其设为唯一覆盖索引的原因。主键是唯一标识符。
我想知道的是,这是否会对其他任何事情产生负面影响。
之前的执行计划:
之后的执行计划:
sql - 为什么即使使用仅索引扫描 PostgresQL 计数也如此缓慢
我有一个可以使用仅索引扫描的简单计数查询,但在 PostgresQL 中仍然需要很长时间!
我有一个cars
有 2 列的表,type bigint
并且active boolean
我在这些列上也有一个多列索引
我插入了一些带有 950k 记录的测试数据,type=1 有 600k 记录
让我们运行 VACUUM ANALYZE 并强制 PostgresQL 使用 Index Only Scan
好的,我有一个简单的type
查询active
结果:
查看查询解释结果,
它使用
Index Only Scan
,仅索引扫描,取决于visibilities map
,PostgresQL 有时需要获取表堆来检查元组的可见性,但我已经运行VACUUM ANALYZE
所以你可以看到Heap fetch = 0
,所以读取索引足以回答这个查询。索引的大小非常小,可以全部放在 Buffer cache (
Buffers: shared hit=2806
) 上,PostgresQL 不需要从磁盘获取页面。
从那里,我无法理解为什么 PostgresQL 需要那么长时间(4.5s)来回答查询,1M 记录并不是很多记录,所有内容都已经缓存在内存中,并且索引上的数据是可见的,它不需要获取堆。
x86_64-pc-linux-gnu 上的 PostgreSQL 9.5.10,由 gcc 编译(Debian 4 在此处输入代码.9.2-10)4.9.2,64 位
我在 docker 17.09.1-ce,Macbook pro 2015 上对其进行了测试。
我对 PostgresQL 还是新手,并试图将我的知识与真实案例相结合。非常感谢,
sql-server - 覆盖索引如何满足多个查询?
我继承了 Azure 中托管的 MS Sql 数据库。寻找性能改进,我一直在阅读很多关于索引和覆盖索引的内容。(也许这是我发现的最完整的阅读:https ://www.red-gate.com/simple-talk/sql/learn-sql-server/using-covering-indexes-to-improve-query-性能/ )
但仍有一个疑问...
因此,例如,对于下面的计费表(大约有 800 万行),我发现查询的 where 子句中使用最多的字段是(是否在连接内):
PAYMENT_DATE, DUE_DATE, CUSTOMER_ID, DELAY_DAYS, AMOUNT
。
此外,用于优化的目标查询对 select 子句进行计算:
AMOUNT, DELAY_DAYS, COUNT(ID)
. 例如:
因此,在我看来,以下索引可以解决我的所有问题:
相反,当我在 Management Studio 上询问查询计划时,SQL Server 不使用此索引并建议我创建一个新索引:
所以,疑问是:
覆盖索引是否需要正是 WHERE 子句搜索的内容?
如果是真的,覆盖索引如何满足多个查询?
否则,为什么以前的索引不满足查询?
我真的不知道我错过了什么......
提前致谢!
configuration - 在 Oracle Sql Developer (Data Modeller) 版本 4.1.5.21 中应如何配置 MSSql 覆盖索引
有人可以帮助我了解如何在 Oracle Sql Developer(Data Modeller)版本 4.1.5.21 中配置覆盖索引(INCLUDE 选项)。我只能找到创建普通索引或使用“索引表达式”的选项,我们可以直接放置索引脚本。
目标是使用工具本身来构建覆盖索引,例如,如果我们对列名进行更改,这会在创建 ddl 时自动反映在索引中。
谢谢莫伊纳克罗伊