优化具有多个连接的SQL查询

Tim*_*çin 3 sql sql-server join query-optimization sql-server-2008-r2

我的数据库中有以下表格,我无法更改或修改.我保持Log表格简单但LogDetail与我的数据库中的相同.

记录表

 Id  User Department Service     Method

 21  John Sales      UserService GetUser
Run Code Online (Sandbox Code Playgroud)

LogDetail表

Id LogRef ParamName  ParamValue

30 21     FirstName  Adam
31 21     LastName   Smith     
32 21     Age        35
33 21     Gender     M
Run Code Online (Sandbox Code Playgroud)

现在,我正在使用以下查询来搜索谁(Adam,Smith,35,M)

SELECT 
L.*, D1.ParamName, D2.ParamName, D3.ParamName, D4.ParamName
FROM Log as L
INNER JOIN LogDetail as D1 on L.Id = D1.LogRef
INNER JOIN LogDetail as D2 on L.Id = D2.LogRef
INNER JOIN LogDetail as D3 on L.Id = D3.LogRef
INNER JOIN LogDetail as D4 on L.Id = D4.LogRef
WHERE
D1.ParamName='FirstName' and D1.ParamValue='Adam' and
D2.ParamName='LastName' and D2.ParamValue='Smith' and
D3.ParamName='Age' and D3.ParamValue=35 and
D4.ParamName='Gender' and D4.ParamValue='M'
Run Code Online (Sandbox Code Playgroud)

有一个更好的方法吗?

gbn*_*gbn 6

当您使用EAV架构(基本上是键值对)时会发生这种情况

除了(ParamName, ParamValue)为其添加索引之外,没有什么可以做的LogDetail.这假设聚簇索引保持为LogRef