首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在SQL Server中优化select查询?

如何在SQL Server中优化select查询?
EN

Stack Overflow用户
提问于 2019-06-13 03:23:12
回答 1查看 111关注 0票数 -1

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

正如您所注意到的,我不是SQL专家。我曾尝试在用于连接的列中创建非聚集索引,还同时为所有列创建了一个索引,但这些操作似乎都不起作用。(我创建的索引在原始表上,而不在视图中)

下面是我创建视图的方式。我选择想要显示的列,然后进行左外部连接,通过id获得列的名称。

代码语言:javascript
复制
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的链接

EN

回答 1

Stack Overflow用户

发布于 2019-06-13 03:56:01

执行这么多记录的查询对服务器来说是不好的,在视图中呈现时更是如此。我推荐的是执行一个页面,然后从视图中将参数发送到一个存储过程。

你可以使用下面的例子:

代码语言:javascript
复制
SELECT * FROM User ORDER BY 1 OFFSET 0 ROWS FETCH NEXT 20 ROWS ONLY;

ROWS FETCH NEXT 20 ROWS:是上一个示例中仅显示20条记录的记录限制。

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56569082

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档