Как оптимизировать запрос на выборку в SQL Server? - PullRequest
0 голосов
/ 12 июня 2019

Я создаю веб-сайт, который извлекает данные из таблицы и отображает их для пользователя. Для этого я создал представление в моей базе данных, которое объединяет основную таблицу «История» с другими таблицами по идентификатору, чтобы получить имена некоторых столбцов вместо идентификатора. Однако, когда я делаю «SELECT * FROM VIEW», запрос никогда не заряжается. Я попытался запустить его в базе данных, и для получения примерно 4 миллионов строк требуется 16 минут.

time Как вы можете заметить, я не специалист по SQL. Я попытался создать некластеризованные индексы в столбцах, которые я использую для объединений, а также я создал один индекс для всех столбцов одновременно, но, похоже, ничего из этого не работает. (Созданные мной индексы находятся в исходной таблице, а не в представлении)

Вот как я создаю вид. Я выбираю столбцы, которые хочу показать, а затем выполняю внешние левые соединения, чтобы получить имена столбцов по идентификатору.

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 голосов
/ 12 июня 2019

поиск для выполнения запроса из такого большого количества записей не подходит для сервера и, тем более, при отображении этого в представлении. Я бы порекомендовал выполнить страницу и в представлении вы отправили параметры в хранимую процедуру.

Вы можете взять следующий пример:

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

ROWS FETCH NEXT ТОЛЬКО 20 ROWS: - это предел записей, который будет показан в предыдущем примере, будет отображать только 20 записей.

OFFSET: группа записей, которые будут показаны. В случае предыдущего примера они будут показаны в регистре от 0 до 20, что является пределом записей.

В следующей ссылке немного показаны другие сценарии использования страницы результатов. ссылка

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...