heyitsPJ Ответов: 1

Можно быстрее выполнить запрос с тысячами данных (SQL)


У меня есть 5 таблиц для получения моих данных. В настоящее время он работает в течение 8-10 минут. Может ли он работать немного быстрее? Смотрите ниже мой код. Не совсем названия моих таблиц, но я применяю ту же логику. Я получил правильные результаты, мне просто нужно сделать это быстрее, если это возможно.
Пожалуйста, спросите, нужна ли вам дополнительная информация.

select 
B.PD_idno,
B.Fullname,
C.datetime_process,
C.detail_1, 
C.detail_2,

--/get the quantity in tbl_DT2 if exists, else, just get the one in tbl_Process/--
(case when (C.PD_idno = D.PD_idno)
	then E.DT_quantity
	else C.process_quantity
end) as Quantity

from tbl_InOut A
inner join tbl_PersonDetail B on A.PD_idno = B.PD_idno
inner join tbl_Process C on B.PD_idno = C.PD_idno 
--/get only process based on time_in and time_out/--
and C.datetime_process between A.time_in and A.time_out

left join tbl_DT1 D on C.detail_1 = D.detail_1 
and C.detail_2 = D.detail_2
left join tbl_DT2 E on D.DT_code = E.DT_code
and D.datetime_process = E.datetime_process

--/get process items between current date and past 7 days/--
where C.datetime_process between CONVERT(date, GETDATE() - 7)  and CONVERT(date, GETDATE() )	


Что я уже пробовал:

Попробовал обычные советы здесь: Ускорьте запросы к базе данных SQL Server с помощью этих советов - TechRepublic[^]
и Настройка производительности SQL-запросов | SQL Tutorial - Mode Analytics[^]

Mohibur Rashid

8 минут кажутся слишком долгими для этого запроса. Какая база данных, если быть точным?

Сколько строк в каждой таблице?

heyitsPJ

Тысяча строк, особенно в tbl_Process. На данный момент tbl_Process имеет 97 158, и он будет расти каждый день, потому что есть много транзакций процесса.
У меня есть только одна база данных, и в ней есть 30 таблиц, но для этого конкретного запроса я использовал только 5 таблиц. Запрос будет возвращать только данные за последние 7 дней, включая текущую дату.

heyitsPJ

смотрите изображение здесь: https://pasteboard.co/HohQ7fR.png
это примерные данные, но в моей базе данных я получил тысячи.

Mohibur Rashid

Как называется ваша база данных?

heyitsPJ

Имя базы данных: PROCESSDB
Это на моем локальном сервере. Я использую MS SQL 2008

1 Ответов

Рейтинг:
10

Jörgen Andersson

Вы должны обратить внимание на свои соединения, у вас есть трехстороннее соединение.
PD_idno совпадает в первых трех таблицах, поэтому измените соединения так, чтобы tbl_Process соединялся только с tbl_InOut.
Подобный этому:

SELECT  B.PD_idno
       ,B.Fullname
       ,C.datetime_process
       ,C.detail_1
       ,C.detail_2
       /*get the quantity in tbl_DT2 if exists, else, just get the one in tbl_Process*/
       ,CASE 
            WHEN (C.PD_idno = D.PD_idno) THEN E.DT_quantity
            ELSE C.process_quantity
        END AS Quantity
FROM    tbl_PersonDetail B
JOIN    tbl_InOut A ON A.PD_idno = B.PD_idno
JOIN    tbl_Process C 
    ON  a.PD_idno = C.PD_idno
    /*get only process based on time_in and time_out*/
    AND C.datetime_process BETWEEN A.time_in AND A.time_out
LEFT JOIN tbl_DT1 D 
    ON  C.detail_1 = D.detail_1
    AND C.detail_2 = D.detail_2
LEFT JOIN tbl_DT2 E
    ON  D.DT_code = E.DT_code
    AND D.datetime_process = E.datetime_process
/*get process items between current date and past 7 days*/
WHERE   C.datetime_process BETWEEN CONVERT(DATE, GETDATE() - 7) AND CONVERT(DATE, GETDATE())

Также убедитесь,что у вас есть индекс на tbl_Process (PD_idno, datetime_process)