我正在建立一个从表中检索数据并将其显示给用户的网站。为此,我在数据库上创建了一个视图,该视图通过ID将主表“ Historics”与其他表连接起来,以获得一些列名而不是ID。但是,当我执行“ SELECT * FROM VIEW”时,查询从不收费。我已经尝试在数据库中运行它,而检索大约400万行花了16分钟。
如您所见,我不是SQL方面的专家。我试图在用于联接的列中创建非聚集索引,并且我同时为所有列创建了一个索引,但这似乎都不起作用。 (我创建的索引在原始表上,而不在视图中)
这是我创建视图的方式。我选择要显示的列,然后进行左外部联接以按ID获取列的名称。
DROP VIEW BIHistoricoEventos
GO
CREATE VIEW BIHistoricoEventos AS
SELECT BI.HISTORICO_EVENTOS_CERRADOS.COD_EVE,
BI.HISTORICO_EVENTOS_CERRADOS.FEC_NOT,
BI.HISTORICO_EVENTOS_CERRADOS.SEMANA,
BI.HISTORICO_EVENTOS_CERRADOS.ANO,
BI.HISTORICO_EVENTOS_CERRADOS.COD_PRE,
BI.HISTORICO_EVENTOS_CERRADOS.COD_SUB,
BI.HISTORICO_EVENTOS_CERRADOS.COD_DPTO_O,
BI.HISTORICO_EVENTOS_CERRADOS.COD_MUN_O,
BI.HISTORICO_EVENTOS_CERRADOS.COD_ASE,
BI.HISTORICO_EVENTOS_CERRADOS.AJUSTE,
TipoEvento.nom_eve AS 'Nombre evento', Departamentos.Nom_dpto
AS 'Departamento',
Municipios.Nom_mun AS 'Municipio',
Ajustes.nombre AS 'Nombre Ajuste', Aseguradoras.Raz_soc AS
'Razon social aseguradora'
FROM BI.HISTORICO_EVENTOS_CERRADOS LEFT OUTER JOIN
Departamentos ON BI.HISTORICO_EVENTOS_CERRADOS.COD_DPTO_O =
Departamentos.Cod_dpto LEFT OUTER JOIN
Municipios ON CONCAT(BI.HISTORICO_EVENTOS_CERRADOS.COD_DPTO_O,
BI.HISTORICO_EVENTOS_CERRADOS.COD_MUN_O) =
Municipios.Cod_mun LEFT OUTER JOIN
Aseguradoras ON BI.HISTORICO_EVENTOS_CERRADOS.COD_ASE =
Aseguradoras.Cod_ase LEFT OUTER JOIN
TipoEvento ON BI.HISTORICO_EVENTOS_CERRADOS.COD_EVE =
TipoEvento.cod_eve LEFT OUTER JOIN
Ajustes ON BI.HISTORICO_EVENTOS_CERRADOS.AJUSTE =
SUBSTRING(Ajustes.nombre, 1, 1)
GO
我在联接中存在的每一列上建立了索引,但是仍然需要很长时间。 我也不知道索引是应该在原始表还是在视图上。
我想减少查询所花费的时间,期待您的答复。谢谢。
编辑:这是执行计划。。但是目前我不知道如何优化它。 这是图像https://i.ibb.co/NysYKVQ/execution-plan.png
的链接答案 0 :(得分:0)
看起来要执行这么多记录的查询对服务器不利,而在视图中呈现时则少得多。我建议执行一个页面,然后从视图中将参数发送到存储过程。
您可以举以下示例:
SELECT * FROM User ORDER BY 1 OFFSET 0 ROWS FETCH NEXT 20 ROWS ONLY;
仅次于前20行:是在上一个示例中仅显示20条记录的记录限制。
偏移量:将显示的记录组。在前面的示例中,它们将在寄存器0到20的范围内显示,这是记录的限制。
在下面的链接中,使用场景页显示了更多不同的场景。 link