Daeamon
@Daeamon

Как оптимизировать MSSql запрос?

SELECT distinct
  [Vv0].[Deleted],
  [LtstRev].[LatestrevisionNo],
  [Vv1].[Name]      as 'Current Status',
  [Vv8].[ValueText] as 'Component name',
  [Vv10].[ValueCache] as 'Componet cache',
  [Vv2].[ValueText] as 'PartNumber',
  [Vv4].[ValueText] as 'FootPrint',
  [Vv5].[ValueText] as 'FootPrint path',
  [Vv6].[ValueText] as 'Library path',
  [Vv7].[ValueText] as 'Library ref',
  [Vv9].[ConfigurationName] as 'Config',
  [PrjID].[ProjectID] as 'ProjectID'
       FROM    (
              (
              (
              (
              (
              (
              (
              (
              (
              (
              (
              (
              [OTD_db].[dbo].[DocumentsA] As [CurStatID] 
              INNER JOIN [OTD_db].[dbo].[Status] AS [Vv1] ON [Vv1].[StatusID] = [CurStatID].[CurrentStatusID]
              )
              INNER JOIN [OTD_db].[dbo].[VariableValueA] AS [Vv2] ON [Vv2].[DocumentID] = [CurStatID].[DocumentID]
              )
              INNER JOIN [OTD_db].[dbo].[Variable] AS [Vv3] ON [Vv3].[VariableID] = [Vv2].[VariableID]
              )
              INNER JOIN [OTD_db].[dbo].[VariableValueB] AS [Vv4] ON [Vv4].[DocumentID] = [CurStatID].[DocumentID]
              )
              INNER JOIN [OTD_db].[dbo].[VariableValueC] AS [Vv5] ON [Vv5].[DocumentID] = [CurStatID].[DocumentID]
              )
              INNER JOIN [OTD_db].[dbo].[VariableValueD] AS [Vv6] ON [Vv6].[DocumentID] = [CurStatID].[DocumentID]
              )
              INNER JOIN [OTD_db].[dbo].[VariableValueE] AS [Vv7] ON [Vv7].[DocumentID] = [CurStatID].[DocumentID]
              )
              INNER JOIN [OTD_db].[dbo].[VariableValueF] AS [Vv8] ON [Vv8].[DocumentID] = [CurStatID].[DocumentID]
              )
              INNER JOIN [OTD_db].[dbo].[DocumentsB] AS [Vv0] ON [Vv0].[DocumentID] = [CurStatID].[DocumentID]
              )
              INNER JOIN [OTD_db].[dbo].[DocumentConfiguration] AS [Vv9] ON [Vv9].[ConfigurationID] = [Vv8].[ConfigurationID]
              )
              INNER JOIN [OTD_db].[dbo].[Projects] AS [PrjID] ON [PrjID].[ProjectID] = [Vv8].[ProjectID]
              )
              INNER JOIN [OTD_db].[dbo].[VariableValueG] AS [Vv10] ON [Vv10].[DocumentID] = [CurStatID].[DocumentID]
              )
              INNER JOIN [OTD_db].[dbo].[DocumentsC] AS [LtstRev] ON [LtstRev].[DocumentID] = [Vv8].[DocumentID]
       WHERE
             [Vv1].[StatusID]   = (SELECT [V].[StatusID] from [OTD_db].[dbo].[Status] As [VA] where [VA].[Name] Like 'Шаблон') AND
             [Vv2].[VariableID] = (SELECT [V].[VariableID] from [OTD_db].[dbo].[Variable] as [VB] where [V]B.[VariableName] Like 'Условное_обозначение') AND ([Vv2].[ValueText] != '') AND
             [Vv4].[VariableID] = (SELECT [V].[VariableID] from [OTD_db].[dbo].[Variable] as [VC] where [V].C[VariableName] Like 'Footprint') AND ([Vv4].[ValueText] != '') AND
             [Vv5].[VariableID] = (SELECT [V].[VariableID] from [OTD_db].[dbo].[Variable] as [VD] where [V].[DVariableName] Like 'PcbLib') AND ([Vv5].[ValueText] != '') AND
             [Vv6].[VariableID] = (SELECT [V].[VariableID] from [OTD_db].[dbo].[Variable] as [VE] where [V].[VEariableName] Like 'SchLib') AND ([Vv6].[ValueText] != '') AND
             [Vv7].[VariableID] = (SELECT [V].[VariableID] from [OTD_db].[dbo].[Variable] as [VF] where [V].[VaFriableName] Like 'Library_ref') AND ([Vv7].[ValueText] != '') AND
             [Vv8].[VariableID] = (SELECT [V].[VariableID] from [OTD_db].[dbo].[Variable] as [VG] where [V].[VarGiableName] Like 'Наименование') AND ([Vv8].[ValueText] != 'Part') AND
             [Vv9].[ConfigurationID] = (SELECT [V].[ConfigurationID] from [OTD_db].[dbo].[DocumentConfiguration] as [VH] where [VH].[ConfigurationName] Like 'По умолчанию') AND
             [Vv10].[ValueCache] = [Vv8].[ValueCache] AND
             [Vv0].[Deleted] = 0 AND
             [LtstRev].[LatestRevisionNo] > 1
ORDER by [Vv2].[ValueText] ASC
  • Вопрос задан
  • 382 просмотра
Пригласить эксперта
Ответы на вопрос 2
Sanasol
@Sanasol
нельзя просто так взять и загуглить ошибку
Это не MySQL, а MSSQL.

У меня есть почти такой же запрос - как по мне самый оптимальный вариант. Методом проб и ошибок остановился на таком.
При таком запросе наименьшее количество запросов = скорость работы.
Если начать в цикле выборку делать дополнительных данных, то будет очень медленно работать.

Если работает очень медленно, то нужно копать в сторону explain или типо того(для mssql не знаю как называется).
И оптимизировать уже структуру таблиц, индексы создавать.
Ответ написан
k1lex
@k1lex
Программист торг. сети. C# (WPF, WinForms), T-SQL
Буду честен. Ваш запрос не то что понять, его прочитать сложно.

1. Поделите запрос на части и используйте времянки.
2. Необязательно помещать каждый JOIN в подзапрос. Сделайте вида:
SELECT  
FROM TABLE
inner join  TABLE2 ON ...
inner join  TABLE3 ON ...

3. Зачем писать условие в конце, когда можно сделать это прямо в JOUN-е
SELECT *  FROM
 [OTD_db].[dbo].[DocumentsA] As [CurStatID]  
 INNER JOIN [OTD_db].[dbo].[Status] AS [Vv1] ON [Vv1].[StatusID] = [CurStatID].[CurrentStatusID] and [Vv1].[Name] Like 'Шаблон'

4. Если данных в таблице будет много и запрос будет работать долго, то после указания таблицы или ее псевдонима допишите WITH (NOLOCK). Это снимет блокировку с таблицы на время работы запроса.
5. Старайтесь не использовать вложенные запросы. типа where ПОЛЕ in (select from TABLE). Это сильно утяжеляет запрос.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы