ahmed_sa Ответов: 2

Как переписать запрос ниже с помощью наилучшей практики ?


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

структура базы данных
CREATE TABLE [Parts].[Nop_Part](
	[PartID] [int] IDENTITY(1,1) NOT FOR REPLICATION NOT NULL,
	[PartNumber] [nvarchar](70) NOT NULL,
	[CompanyID] [int] NOT NULL,
	[PartsFamilyID] [int] NOT NULL,
 CONSTRAINT [PK_Nop_Part] PRIMARY KEY CLUSTERED 
(
	[PartID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY],
 CONSTRAINT [UC_Partnon_LatestCompanyID] UNIQUE NONCLUSTERED 
(
	[LatestCompanyID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY],
 CONSTRAINT [uc_partnumbernonCompany] UNIQUE NONCLUSTERED 
(
	[CompanyID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
=========================================
CREATE TABLE [Parts].[FamilyIntroductionDate](
	[FamilyID] [int] NOT NULL,
	[IntroductionDate] [int] NULL,
	[FamilyLevel] [bit] NULL,
 CONSTRAINT [PK__FamilyIn__41D82F4BF2ECF001] PRIMARY KEY CLUSTERED 
(
	[FamilyID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
=========================================
CREATE TABLE [CompanyManagers].[Company](
	[CompanyID] [int] IDENTITY(1,1) NOT NULL,
	[CompanyName] [nvarchar](250) NOT NULL,
	
 CONSTRAINT [PK__Company__2D971C4C74A2E1EE] PRIMARY KEY CLUSTERED 
(
	[CompanyID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY],
 CONSTRAINT [UQ__Company__9BCE05DC0B2C281C] UNIQUE NONCLUSTERED 
(
	[CompanyName] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]


Экран плана выполнения
Общий доступ к файлам и их хранение упрощены[^]

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

SELECT 
Companies.CompanyName [CompanyName],
ISNULL(Total.FamilyTotal,0) [Total Family Count],
ISNULL(Total.Partstotal, 0) [Total Part Count],
ISNULL(Done.DoneFamily, 0) [Done Family Count],
ISNULL(Done.DoneParts, 0) [Done Part Count]
FROM
(
SELECT  CompanyID, COUNT(DISTINCT PartsFamilyID) FamilyTotal, COUNT(PartID) Partstotal
FROM Parts.Nop_Part 
GROUP  BY CompanyID
)AS Total
LEFT JOIN 
(
SELECT 
p.CompanyID,
COUNT(DISTINCT p.PartsFamilyID) DoneFamily,
COUNT(p.PartID) as DoneParts
from Parts.FamilyIntroductionDate f
inner JOIN Parts.Nop_Part p
ON p.PartsFamilyID = f.FamilyID
GROUP  BY p.CompanyID
)AS Done ON Done.CompanyID = Total.CompanyID
INNER JOIN 
(
SELECT c.CompanyID, C.CompanyName 
FROM Z2DataCompanyManagement.CompanyManagers.Company c 
)AS Companies ON Companies.CompanyID = Total.CompanyID 
ORDER BY Companies.CompanyName

2 Ответов

Рейтинг:
12

CHill60

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

INNER JOIN 
(
	SELECT c.CompanyID, C.CompanyName 
	FROM Z2DataCompanyManagement.CompanyManagers.Company c 
)AS Companies ON Companies.CompanyID = Total.CompanyID 
Просто использовать
INNER JOIN Z2DataCompanyManagement.CompanyManagers.Company c ON c.CompanyID = Total.CompanyID
Честно говоря, вы, вероятно, могли бы избавиться от всех подзапросов и получить что-то вроде
SELECT 
c.CompanyName [CompanyName],
COUNT(DISTINCT PartsFamilyID) [Total Family Count],
COUNT(PartID) [Total Part Count],
COUNT(DISTINCT p.PartsFamilyID) [Done Family Count],
COUNT(p.PartID) [Done Part Count]
FROM Parts.Nop_Part p
LEFT JOIN Parts.FamilyIntroductionDate f ON p.PartsFamilyID = f.FamilyID
INNER JOIN Z2DataCompanyManagement.CompanyManagers.Company c ON c.CompanyID = p.CompanyID 
GROUP  BY c.CompanyName
ORDER BY c.CompanyName
но поскольку я не могу запустить код для создания ваших таблиц, а вы не предоставили мне никаких образцов данных для проверки результатов, я не собираюсь копать намного глубже - так что имейте в виду, что приведенный выше код непроверен


Maciej Los

5ed!

Рейтинг:
0

Maciej Los

Ничего не зная о вашем sql-сервере, структуре базы данных и т. д. мы ничем не можем вам помочь.

Я бы посоветовал прочитать вот это:
Советы по настройке производительности SQL Server[^]
Методы оптимизации запросов в SQL Server: советы и рекомендации[^]


Patrice T

Будьте любезны с Ахмедом, он всего лишь 250+ вопросов (Новичок) и до сих пор не научился давать полезную информацию, когда просит о помощи. :)

Maciej Los

Спасибо! Меня предупреждали...
;)

ahmed_sa

можете ли вы увидеть план выполнения выше

Maciej Los

Да... Я вижу, но в каком аспекте эта информация мне полезна?
Как я уже упоминал в своем ответе: есть много вещей, которые могут повлиять на производительность sql server/query.