这是查询示例
放置索引需要考虑哪一列?每个索引可以应用每列或多列的最佳索引是什么?
我的问题是当我执行这个查询时需要很长时间才能完成
是查询或索引的复杂性吗?
蒂亚!
SELECT
a.id
a.name AS name
CASE
WHEN a.status IS NULL THEN '1111'
WHEN a.status = '2222' THEN '3333'
WHEN a.status = '4444' THEN '5555'
ELSE a.status
END AS status,
a.updated_at
FROM a
LEFT JOIN b ON a.request_id = b.request_id
LEFT JOIN (
SELECT
DISTINCT ON (id) id,
name
FROM
aa
WHERE
updated_at BETWEEN '2022-05-01 00:00:00' AND '2022-05-31 23:59:59'
AND id IN (
SELECT id
FROM a
WHERE
updated_at BETWEEN '2022-05-01 00:00:00' AND '2022-05-31 23:59:59'
AND status NOT IN ('6666', '7777', '8888')
AND id LIKE '%%'
)
)
WHERE
a.updated_at BETWEEN '2022-05-01 00:00:00' AND '2022-05-31 23:59:59'
AND status NOT IN ('6666', '7777', '8888')
AND id LIKE '%%'
UNION
SELECT
z.id
z.name AS name
CASE
WHEN z.status IS NULL THEN '1111'
WHEN z.status = '2222' THEN '3333'
WHEN z.status = '4444' THEN '5555'
ELSE z.status
END AS status,
z.updated_at
FROM z
LEFT JOIN zb ON z.request_id = zb.request_id
LEFT JOIN (
SELECT
DISTINCT ON (id) id,
name
FROM
zz
WHERE
updated_at BETWEEN '2022-05-01 00:00:00' AND '2022-05-31 23:59:59'
AND id IN (
SELECT id
FROM z
WHERE
updated_at BETWEEN '2022-05-01 00:00:00' AND '2022-05-31 23:59:59'
AND status NOT IN ('6666', '7777', '8888')
AND id LIKE '%%'
)
)
WHERE
z.updated_at BETWEEN '2022-05-01 00:00:00' AND '2022-05-31 23:59:59'
AND status NOT IN ('6666', '7777', '8888')
AND id LIKE '%%'
需要注意的一点是,聚集索引应该有一个唯一键(我推荐的标识列)作为第一列。基本上,它可以帮助您在索引末尾插入数据,并且不会导致大量磁盘 IO 和页面拆分。
其次,如果您在数据上创建其他索引并且它们构造巧妙,它们将被重用。
例如,假设您在三列上搜索表格
州、县、邮编。
然后是州、县、邮编的索引。将在所有这三个搜索中使用。
如果您仅通过 zip 进行大量搜索,则上述索引将不会被使用(无论如何,SQL Server 都不会使用),因为 zip 是该索引的第三部分,并且查询优化器不会将该索引视为有用。
然后,您可以仅在 Zip 上创建将在此实例中使用的索引。
顺便说一句,我们可以利用这样一个事实,即使用多列索引,第一个索引列始终可用于搜索,当您仅按“状态”搜索时,它是有效的,但不如“状态”上的单列索引高效'
我想您正在寻找的答案是它取决于您经常使用的查询的 where 子句以及您的 group by。
这篇文章会有很大帮助。:-)