2015-09-18 2 views
0

Это обычно сталкивается с проблемой, если вы разрабатываете какое-либо программное решение для любого правительственного отдела. Поэтому рассмотрим этот вопрос как решающий вопрос.Оптимизированный запрос в T-SQL

Понимание сценария Каждое правительство в качестве отделов, отделов в разных городах и каждого из них несет ответственность за удовлетворение потребностей гражданских служб. Например, Industry Commiserate. Если вы хотите создать новую производственную единицу для некоторых продуктов, вы должны обратиться в правительственный департамент, должностные лица проводят проверку и другие необходимые процедуры проверки. В конце получите решение, имеете ли вы право на создание подразделения.

Требования к собранию Для удовлетворения вышеуказанных требований мы создали базу данных ... Я не буду включать все здесь, а только необходимые таблицы. 1. GovtOfficers: офицеры деталь Юридических условий, имеющие поля

enter image description here

DeptOfficers: содержит офицер отдела, Граждан: являются люди, как мы, файл приложения, Применения: являются приложением, представленным гражданином ApplicationAction: - действия, принимаемые в различных областях применения ...

Теперь наша цель состоит в том, чтобы найти последнее состояние и имя сотрудника, работающее на конкретном применении ...

Мы напишем это нравится,

Select * 
from Applications A 
inner join Citizens C on A.CitizenId=C.Id 
left join ApplicationAction AC on A.Id=AC.ApplicationId 
left join 
(
    Select max(Id) 
    from ApplicationAction 
    group by ApplicationId 
) X on AC.Id=X.Id 

Этого запрос выбирает требуемый результат и работает отлично. ... Но это не происходит, когда данные растут до 10-20 Lacks, он начинает принимать время и в конечном итоге может истечь.

Что может быть лучше подходит? OK. Основываясь на накопленном опыте, я могу добавить ActionId в таблицу приложений, в котором будут храниться последние действия, предпринятые в этой таблице .... и может решить мою проблему. Проблема в том, что я могу использовать вышеупомянутое решение для предстоящих проектов. Не проекты, которые я завершил, или у меня нет контракта.

Так что я не ищу изменения схемы в любом случае для оптимизации выше запроса.

+1

функция окна 'row_number()' должны работать в вашем случае – cha

+0

Вы можете увидеть план выполнения этого запроса с несколькими тысяч записей против 20 лакх записей? Возможно, анализатор запросов изменяет план запроса, и если это так, вы можете увидеть, какая ветка стоит больше всего. – zedfoxus

+0

Действительно, этот запрос работает нормально? ApplicationId не является столбцом в приложении - и это неправильно на диаграмме. И я сомневаюсь, что CitizenID - один для многих. Ответ только имеет хороший вопрос. Опубликуйте рабочий запрос и план запроса. – Paparazzi

ответ

1

сделать нулевое приложение отдельного

select * from 
( Select *, 
      row_number() over(partition by AC.ApplicationId order by AC.id desc) as rn 
     from Applications A 
     join Citizens C 
      on A.CitizenId = C.Id 
     join ApplicationAction AC 
      on A.Id = AC.ApplicationId 
) ttt 
where ttt.rn = 1 
Смежные вопросы