我正在制作一个从表中检索数据并将其显示给用户的网站。为此,我在我的数据库上创建了一个视图,该视图通过id将主表"Historics“与其他表连接起来,以获得一些列名而不是id。但是,当我执行"SELECT * FROM VIEW“时,查询从不收费。我尝试在数据库中运行它,它需要16分钟来检索大约400万行。
正如您所注意到的,我不是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
我对连接中的每一列都建立了索引,但这仍然需要很长时间。我也不确定索引应该放在原始表上还是视图上。
我想减少查询所花费的时间,我期待着您的回复。谢谢。
编辑:这是执行计划..但目前我不知道如何优化这一点。
发布于 2019-06-13 03:56:01
执行这么多记录的查询对服务器来说是不好的,在视图中呈现时更是如此。我推荐的是执行一个页面,然后从视图中将参数发送到一个存储过程。
你可以使用下面的例子:
SELECT * FROM User ORDER BY 1 OFFSET 0 ROWS FETCH NEXT 20 ROWS ONLY;
ROWS FETCH NEXT 20 ROWS:是上一个示例中仅显示20条记录的记录限制。
偏移量:将要显示的记录组。在前面的示例中,它们将显示为从寄存器0到20,这是记录的限制。
在下面的链接中,显示了更多使用结果页的不同场景。link
https://stackoverflow.com/questions/56569082
复制相似问题