从具有多个关系的两个表中进行选择的最佳做法是什么?

Nim*_*jan 4 performance sql-server best-practices select relations query-performance

我有两个表,结构如下: 在此处输入图片说明 并且正在使用以下查询选择数据:

SELECT
(SELECT Name FROM Management_EnumerableItem ME WHERE ME.ID = DN) DN,
(SELECT Name FROM Management_EnumerableItem ME WHERE ME.ID = PN) PN,
(SELECT Name FROM Management_EnumerableItem ME WHERE ME.ID = Winder) Winder,
(SELECT Name FROM Management_EnumerableItem ME WHERE ME.ID = CouplingType) CouplingType,
(SELECT Name FROM Management_EnumerableItem ME WHERE ME.ID = Type) Type,
(SELECT Name FROM Management_EnumerableItem ME WHERE ME.ID = ILayer) ILayer,
(SELECT Name FROM Management_EnumerableItem ME WHERE ME.ID = OLayer) OLayer
FROM Product_Coupling_Serial
Run Code Online (Sandbox Code Playgroud)

那么,像这样的选择(最快的方式)的最佳性能的最佳实践是什么?

Raj*_*jan 9

在 Id 列上创建覆盖索引并在 Management_EnumerableItem 表上包含名称。

CREATE INDEX IDX_Name on Management_EnumerableItem (Id) Include (Name) with (fillfactor=90);
Run Code Online (Sandbox Code Playgroud)

并像这样写。

SELECT A.NAME,
B.NAME,
C.NAME,
D.NAME,
E.NAME,
F.NAME,
G.NAME,

FROM Product_Coupling_Serial P
LEFT OUTER JOIN Management_EnumerableItem A
ON A.ID = P.DN
LEFT OUTER JOIN Management_EnumerableItem B
ON B.ID = P.PN
LEFT OUTER JOIN Management_EnumerableItem C
ON C.ID = P.Winder
LEFT OUTER JOIN Management_EnumerableItem D
ON D.ID = P.CouplingType
LEFT OUTER JOIN Management_EnumerableItem E
ON E.ID = P.[Type]
LEFT OUTER JOIN Management_EnumerableItem F
ON F.ID = P.[ILayer]
LEFT OUTER JOIN Management_EnumerableItem G
ON G.ID = P.[OLayer]
Run Code Online (Sandbox Code Playgroud)

谢谢

  • 这类似于 OLAP 中使用的 [*star schema*](https://en.wikipedia.org/wiki/Star_schema) 的经典结构,不同之处在于 *dimensions* 始终是同一表的一部分。什么更容易理解......我猜取决于观察者的观点。我花了更长的时间来理解原来的...至于性能:我认为没有太大的改进,SQL Server 能够发现两个查询是等效的,并选择它认为最佳的执行计划。 (2认同)
  • @MatthewSontum 抱歉,但我确实看到了使用此索引而不是(可能更广泛)聚集索引的可能优势(或大或小)。 (2认同)