如何在 SQL 中为选择查询创建索引?
Posted
技术标签:
【中文标题】如何在 SQL 中为选择查询创建索引?【英文标题】:How to create index for select query in SQL? 【发布时间】:2022-01-17 13:14:19 【问题描述】:我有一个查询如下,需要为XYZ字段创建索引,能否在select语句中创建索引:
SELECT ABC,
CASE
WHEN B IS NULL AND C IS NOT NULL THEN CONCAT(C,'/',D)
WHEN B IS NOT NULL AND C IS NULL THEN CONCAT(B,'/',D)
WHEN C IS NOT NULL AND C IS NOT NULL THEN CONCAT(B,'/',C,'/',D)
ELSE -1
END AS XYZ,
FROM TABLE_NAME
WHERE ABC=123
由于这个 XYZ 字段在“from table”中不可用,我们无法像往常一样在 create table 中创建索引。 请帮忙。
谢谢
【问题讨论】:
查询结果上的索引有什么用?这是另一个查询的一部分吗? 通过(ABC)
或(ABC, B, C, D)
创建索引。 由于这个XYZ字段在'from table'中不可用,我们无法像往常一样在create table中创建索引。你不需要这样的索引。或者您可以使用显示的表达式添加生成的列并对其进行索引。
.. WHEN C IS NOT NULL AND C IS NOT NULL ..
列两次查是什么原因?
你的CASE可以用简单的CONCAT_WS('/', B, C, D)
代替。
【参考方案1】:
您可以更改表定义以包含XYZ
作为生成的计算列。然后,在该计算列上添加一个索引。
ALTER TABLE TABLE_NAME ADD COLUMN XYZ VARCHAR(50) GENERATED ALWAYS AS
CASE
WHEN B IS NULL AND C IS NOT NULL THEN CONCAT(C, '/', D)
WHEN B IS NOT NULL AND C IS NULL THEN CONCAT(B, '/', D)
WHEN C IS NOT NULL AND C IS NOT NULL THEN CONCAT(B, '/', C, '/', D)
ELSE '-1' END
STORED;
CREATE INDEX idx_xyz ON TABLE_NAME (XYZ);
【讨论】:
我怀疑该索引是否有助于查询。【参考方案2】:通常,首先查看WHERE
子句以确定INDEX
。在这种情况下,INDEX(ABC)
很有可能会有所帮助。
【讨论】:
以上是关于如何在 SQL 中为选择查询创建索引?的主要内容,如果未能解决你的问题,请参考以下文章
Oracle创建索引SQL简单的例子,在表中的指定字段和如何使用索引呢?
Oracle创建索引SQL简单的例子,在表中的指定字段和如何使用索引呢?
如果我在 sql server 中为表创建索引,看起来索引表的视图会受到影响吗?