sql - 提高 SQL CTE 查询性能

标签 sql sql-server performance common-table-expression

有什么办法可以提高以下CTE查询的性能(@E@R是实际系统中带索引的表):

DECLARE @id bigint = 1

DECLARE @E TABLE
(
id bigint,
name varchar(50)
)

DECLARE @R TABLE
(
child_id bigint,
parent_id bigint
)

INSERT INTO @E SELECT 1, 'one'
INSERT INTO @E SELECT 2, 'two'
INSERT INTO @E SELECT 3, 'three'
INSERT INTO @E SELECT 4, 'four'
INSERT INTO @E SELECT 5, 'five'
INSERT INTO @E SELECT 6, 'six'
INSERT INTO @E SELECT 7, 'seven'

INSERT INTO @R SELECT 1, 2
INSERT INTO @R SELECT 1, 3
INSERT INTO @R SELECT 3, 4
INSERT INTO @R SELECT 5, 4
INSERT INTO @R SELECT 3, 6
INSERT INTO @R SELECT 7, 4

; WITH cte
(
child_id,
parent_id
)

AS (

SELECT * FROM @R R
WHERE R.child_id = @id

UNION ALL
SELECT R.* FROM @R R
INNER JOIN cte ON CTE.parent_id = R.child_id

)
SELECT * FROM @E E
WHERE e.id = @id
UNION ALL
SELECT P.* FROM @E E
INNER JOIN cte ON 1=1
INNER JOIN @E P ON P.id = cte.parent_id
WHERE e.id = @id
ORDER BY 1

预期成绩:
id | name
1  | one 
2  | two
3  | three
4  | four
6  | six

在现实世界的数据中,我将在@R 中处理数百万行,在@E 中处理大约十万行。所以我想看看是否有什么我可以做的事情来挤出更多的性能。

编辑:到目前为止,只是为了澄清和总结,R 上有一个聚集的 pk 索引,带有 child_id, parent_id并将索引添加到 @r.parent_id还将提高连接性能。

有什么可以改善的吗? CTE 后面的位带有 inner join 1=1这里有什么可以改进的吗?是否有任何其他模式设计我可以做以获得具有更好性能的类似父子映射?

最佳答案

正如 marc_s 指出的那样
[child_id, parent_id] 上的聚集索引这张表不够好 - 你应该在 (child_id) 上有单独的索引和 (parent_id)以加快 JOIN 性能。如果您在 (child_id, parent_id) 上有复合索引按照这个顺序,这可以用于 child_id单独 - 但不是为 parent_id单独(并且两者都需要)– marc_s 2011 年 12 月 19 日 12:35

这极大地提高了查询的性能,并帮助我了解 CTE 查询在内部是如何工作的。

关于sql - 提高 SQL CTE 查询性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8560596/

相关文章:

sql - Oracle Listagg 子查询

SQL 将表数据修改为更紧凑的形式

mysql - SQL:多对多关系选择多个条件

javascript - 在 javascript 中滚动时隐藏标题的性能问题

performance - 是什么导致在 Cortex-A72 上使用 -O0 而不是 -O3 的简单紧密循环的周期变化如此之大?

mysql - 如何找出 MySQL 字符集排序规则(例如 utf8_unicode_ci)中各种符号的相对顺序?

sql-server - 'Insert into linked table failed, RAISERROR could not locate entry for error x in sysmessages' 是什么意思?

sql-server - 使用 JDBC 连接到 SQL Server LocalDB

sql-server - 在数据库中查找指定类型的所有列

html - 动态内容的 css 文件中的数据 URI