2015-09-15 2 views
1

Ниже приведен запрос. Я хочу улучшить производительность. Пожалуйста, руководство меняВопрос о производительности TSql

Declare @guidTenantId UNIQUEIDENTIFIER 
Declare @guidPriceBookId UNIQUEIDENTIFIER 
Declare @strTextSearch nvarchar(100) = NULL 
Declare @bitHasProdServTemplate bit = 0 

DECLARE @guidPriceBookLineRelation UNIQUEIDENTIFIER 
DECLARE @guidProductRelation UNIQUEIDENTIFIER 
declare @guidProdServiceTemplateContext UNIQUEIDENTIFIER 



BEGIN 

SELECT 
     TB.PBL_IT_GUID, 
     TB.PBL_TN_GUID, 
     TB.PBL_LineContext, 
     TB.PBL_UnitofMeasure, 
     TB.PBL_PriceType, 
     TB.PBL_Price, 
     TB.PBL_StartDate, 
     TB.PBL_EndDate, 
     PR_IT_GUID, 
     IT_Name, 
     PR_ProductNumber, 
     PR_MVA 
FROM  
( 
     SELECT IR_IT_GUID_TO,IR_CLSID,TA.PBL_IT_GUID, 
      TA.PBL_TN_GUID, 
      TA.PBL_LineContext, 
      TA.PBL_UnitofMeasure, 
      TA.PBL_PriceType, 
      TA.PBL_Price, 
      TA.PBL_StartDate, 
      TA.PBL_EndDate  
     FROM   
     (
      SELECT 
       PBL_IT_GUID, 
       PBL_TN_GUID, 
       PBL_LineContext, 
       PBL_UnitofMeasure, 
       PBL_PriceType, 
       PBL_Price, 
       PBL_StartDate, 
       PBL_EndDate 

      FROM 
       dbo.PBL_PriceBookLines INNER JOIN IR_ItemRelation ON PBL_IT_GUID = IR_IT_GUID_From  
       WHERE IR_IT_GUID_To = @guidPriceBookId 
       AND IR_CLSID = @guidPriceBookLineRelation 
       AND PBL_TN_GUID = @guidTenantId 
     ) AS TA INNER JOIN IR_ItemRelation ON IR_IT_GUID_From = TA.PBL_IT_GUID 
) AS TB   



     INNER JOIN IT_Item ON IT_Item.IT_GUID = TB.IR_IT_GUID_TO 
     INNER JOIN dbo.PR_Product ON IT_Item.IT_GUID = PR_IT_GUID 
     INNER JOIN dbo.IR_ItemRelation [IR] ON [IR].IR_IT_GUID_From = PR_IT_GUID AND [IR].IR_CLSID = @guidProdServiceTemplateContext   
     WHERE TB.IR_CLSID = @guidProductRelation 
     AND (@strTextSearch is null OR(@strTextSearch is not null AND(IT_Name LIKE '%'[email protected]+'%'))) 

END 
+0

Вам нужно добавить псевдонимы столбцов в запрос, чтобы было ясно, откуда идут столбцы. –

+0

Что вы уже пробовали? – CPMunich

+0

Настольная структура была бы очень полезной! – CeOnSql

ответ

0

Посмотрите на обычных местах:

  1. Включите статистики Ио и проверить, какие таблицы вызывает большинство I/O.
  2. Включите фактический план выполнения и найдите дорогостоящие операции (сканирование, катушки, толстые линии, ключевые поиски для огромного количества строк) и, возможно, большие различия между оцененными и фактическими подсчетами строк. - и помните, что проценты - это просто оценки.
  3. Проверка индексации столбцов используется в соединениях и с (простой/SARGable) критерии поиска

Без деталей это действительно невозможно дать точные рекомендации.

0

Это просто выстрел в темноте, так как мы не знаем, что ваша таблица-структуру и где столбцы точно приходят из НО, что я не вижу, почему ваш запрос вложен более чем однажды !? Может быть, это может выглядеть следующим образом:

SELECT PBL.PBL_IT_GUID, 
     PBL.PBL_TN_GUID, 
     PBL.PBL_LineContext, 
     PBL.PBL_UnitofMeasure, 
     PBL.PBL_PriceType, 
     PBL.PBL_Price, 
     PBL.PBL_StartDate, 
     PBL.PBL_EndDate, 
     PR.PR_IT_GUID, 
     IT.IT_Name, 
     PR.PR_ProductNumber, 
     PR.PR_MVA 
FROM dbo.PBL_PriceBookLines PBL 
     INNER JOIN dbo.IR_ItemRelation IR1 ON PBL.PBL_IT_GUID = IR1.IR_IT_GUID_From 
     INNER JOIN dbo.IT_Item IT ON IT.IT_GUID = IR1.IR_IT_GUID_TO 
     INNER JOIN dbo.PR_Product PR ON IT.IT_GUID = PR.PR_IT_GUID 
     INNER JOIN dbo.IR_ItemRelation IR2 ON IR2.IR_IT_GUID_From = PR.PR_IT_GUID   
WHERE IR1.IR_IT_GUID_To = @guidPriceBookId 
     AND IR1.IR_CLSID = @guidPriceBookLineRelation 
     AND PBL.PBL_TN_GUID = @guidTenantId 
     AND IR2.IR_CLSID = @guidProdServiceTemplateContext  
     AND IR1.IR_CLSID = @guidProductRelation 
     AND (
       @strTextSearch IS NULL 
      OR 
      (
       @strTextSearch IS NOT NULL 
       AND IT.IT_Name LIKE '%'[email protected]+'%' 
      ) 
      ) 

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

+0

В моей базе данных каждая вещь классифицируется как единица, элемент и атрибут. Есть отношение единиц к единице, отношение единиц к объекту и т. Д. Таблица IR_ItemRelation дает отношение между элементом к элементу. Существует контекст отношения. – sks

+0

В моей базе данных каждая вещь классифицируется как единица, элемент и атрибут. Есть отношение единиц к единице, отношение единиц к объекту и т. Д. Таблица IR_ItemRelation дает отношение между элементом к элементу. Существует контекст отношения. Например, структура IR_ITemRelation (IR_Clsid, IR_From, IR_To), где IR_Clsid - уникальный контекст, через который связаны два элемента. Таблица IT_item содержит все основные сведения, такие как имя и т. Д. Это означает, что это базовая таблица для элементов. – sks

+0

ОК, но что здесь нужно здесь, вот некоторые сведения! Сколько строк для таблиц? Первичные ключи? Индексы? Типы данных? .... – CeOnSql

Смежные вопросы