如何在SQL Server中优化选择查询?

时间:2019-06-12 19:23:12

标签: sql sql-server tsql

我正在建立一个从表中检索数据并将其显示给用户的网站。为此,我在数据库上创建了一个视图,该视图通过ID将主表“ Historics”与其他表连接起来,以获得一些列名而不是ID。但是,当我执行“ SELECT * FROM VIEW”时,查询从不收费。我已经尝试在数据库中运行它,而检索大约400万行花了16分钟。

time 如您所见,我不是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

我在联接中存在的每一列上建立了索引,但是仍然需要很长时间。 我也不知道索引是应该在原始表还是在视图上。

我想减少查询所花费的时间,期待您的答复。谢谢。

编辑:这是执行计划。。但是目前我不知道如何优化它。 exec plan 这是图像https://i.ibb.co/NysYKVQ/execution-plan.png

的链接

1 个答案:

答案 0 :(得分:0)

看起来要执行这么多记录的查询对服务器不利,而在视图中呈现时则少得多。我建议执行一个页面,然后从视图中将参数发送到存储过程。

您可以举以下示例:

SELECT * FROM User ORDER BY 1 OFFSET 0 ROWS FETCH NEXT 20 ROWS ONLY;

仅次于前20行:是在上一个示例中仅显示20条记录的记录限制。

偏移量:将显示的记录组。在前面的示例中,它们将在寄存器0到20的范围内显示,这是记录的限制。

在下面的链接中,使用场景页显示了更多不同的场景。 link