【发布时间】:2017-07-12 20:57:08
【问题描述】:
我有一个具有关系的医疗数据表(类似于父母和孩子)。 为了简单起见,我考虑了一个具有实际父子关系的表。 下表是:
表名:关系
Parent | Child
------ | ------
Mike |John
Aliss |John
John |Chris
Brad |David
Kate |Brad
Alexa |Shawn
Matt |Thoa
我已经编写了获取 GrandParent、Parent 和 Grandchild 关系的查询。
SELECT t1.grandchild,
t2.grandparent,
t1.parent,
t2.child
FROM (SELECT child AS Grandchild,
parent
FROM relations
WHERE parent IN (SELECT DISTINCT( r.parent )
FROM relations r
JOIN relations t
ON r.parent = t.child)) AS t1
INNER JOIN (SELECT parent AS Grandparent,
child
FROM relations
WHERE child IN (SELECT DISTINCT( r.parent )
FROM relations r
JOIN relations t
ON r.parent = t.child)) AS t2
ON t1.parent = t2.child
ORDER BY t1.grandchild;
这是关键,现在实际数据有 30015924 行,当我使用上述查询运行报告时,需要很长时间才能获取数据。
我看到了执行计划,并且有许多“嵌套循环”和惰性线轴。 我正在尝试编写一个更高效的查询,该查询在大型数据集上执行速度更快。
联合为不同的关系工作。 这是我编写的最有效的查询还是有更好的版本?
谢谢。
【问题讨论】:
-
DISTINCT 关键字会使其运行缓慢。如果不需要,您可以将其取出。表格是否也被索引了?
-
表上没有索引,因为它非常频繁地更新和插入。
-
您使用的是什么版本的 sql server?你有什么索引?
-
这个样本数据的期望结果是什么?
-
我得到了想要的结果,只是执行速度很慢
标签: sql sql-server sqlperformance