Sql 糟糕的表演

Sql 糟糕的表演,sql,sql-server,database,performance,Sql,Sql Server,Database,Performance,有什么有用的建议吗 @编辑 执行计划如下: 您肯定必须取消子选择。每次迭代一行时都会执行它们。你应该试着向左加入他们,这并不容易,因为我看到你通过选择top 1来限制他们 糟糕的性能是使用子选择。 我不知道它的结构,也不知道你一眼就能做什么,但也许这个简单的提示会让你找到你的解决方案 让我们考虑加载的一行< /强>。< /P> 从[2009_Zlecenia]加载行 加载子选择MZR的所有 你把MZR分类 除MZR2中的第一行外,您将刷新所有行 加载子选择MZR2的所有 您可以对MZR2进行

有什么有用的建议吗

@编辑

执行计划如下:


您肯定必须取消子选择。每次迭代一行时都会执行它们。你应该试着向左加入他们,这并不容易,因为我看到你通过选择top 1来限制他们

糟糕的性能是使用子选择。

我不知道它的结构,也不知道你一眼就能做什么,但也许这个简单的提示会让你找到你的解决方案

让我们考虑<强>加载的一行< /强>。< /P>

  • 从[2009_Zlecenia]加载行
  • 加载子选择MZR的所有
  • 你把MZR分类
  • 除MZR2中的第一行外,您将刷新所有行
  • 加载子选择MZR2的所有
  • 您可以对MZR2进行排序
  • 除MZR2中的第一行外,您将刷新所有行
  • 加载子选择FP1的所有
  • 你把FP1分类吗
  • 除FP1中的第一行外,您将刷新所有行
  • 加载子选择FP2的所有
  • 你把FP2分类
  • 除FP2中的第一条线外,所有线均齐平
  • 加载子选择KD的所有
  • 你能分类吗
  • 除KD中的第一条外,您可以冲洗所有管路
  • 加载子选择ZP的所有
  • 你把ZP分类
  • 除ZP中的第一条线外,所有线均齐平
您只能一次执行10个左连接(fast),但请考虑子选择为每行加载的数据。它们每行都是新加载的

另外,尝试为筛选的列编制索引:
索引将提高内存和硬盘丢失的执行时间。

您必须明确取消子选择。每次迭代一行时都会执行它们。你应该试着向左加入他们,这并不容易,因为我看到你通过选择top 1来限制他们

糟糕的性能是使用子选择。

我不知道它的结构,也不知道你一眼就能做什么,但也许这个简单的提示会让你找到你的解决方案

让我们考虑<强>加载的一行< /强>。< /P>

  • 从[2009_Zlecenia]加载行
  • 加载子选择MZR的所有
  • 你把MZR分类
  • 除MZR2中的第一行外,您将刷新所有行
  • 加载子选择MZR2的所有
  • 您可以对MZR2进行排序
  • 除MZR2中的第一行外,您将刷新所有行
  • 加载子选择FP1的所有
  • 你把FP1分类吗
  • 除FP1中的第一行外,您将刷新所有行
  • 加载子选择FP2的所有
  • 你把FP2分类
  • 除FP2中的第一条线外,所有线均齐平
  • 加载子选择KD的所有
  • 你能分类吗
  • 除KD中的第一条外,您可以冲洗所有管路
  • 加载子选择ZP的所有
  • 你把ZP分类
  • 除ZP中的第一条线外,所有线均齐平
您只能一次执行10个左连接(fast),但请考虑子选择为每行加载的数据。它们每行都是新加载的

另外,尝试为筛选的列编制索引:
索引将提高内存和硬盘丢失的执行时间。

该计划似乎包含许多
索引假脱机文件,这是一个SQL Server在tempdb中构建临时索引的操作程序。至少在这些情况下,永久索引应该会大大提高性能

执行
select count(column)
SQL Server计算该列的非空值。使用
select count(*)
时,将计算行数,SQL Server只需对任何索引执行索引扫描即可

最好检查计划中的键查找,如果存在实际执行计数较高的此类查找,则将这些列添加为索引中的包含字段将删除键查找。这会增加插入/更新的成本


此外,将一个大的查询分解成更小的部分可以帮助优化器选择更好的计划。在具有多个大表的查询中,查询计划创建也可能以超时结束,从而导致非常糟糕的计划。这可以从查询计划(“优化级别”)的第一个节点的属性中看出。

该计划似乎包含大量的
索引假脱机
,这是一个SQL Server在tempdb中构建临时索引的操作符。至少在这些情况下,永久索引应该会大大提高性能

执行
select count(column)
SQL Server计算该列的非空值。使用
select count(*)
时,将计算行数,SQL Server只需对任何索引执行索引扫描即可

最好检查计划中的键查找,如果存在实际执行计数较高的此类查找,则将这些列添加为索引中的包含字段将删除键查找。这会增加插入/更新的成本


此外,将一个大的查询分解成更小的部分可以帮助优化器选择更好的计划。在具有多个大表的查询中,查询计划创建也可能以超时结束,从而导致非常糟糕的计划。这可以从查询计划(“优化级别”)的第一个节点的属性中看出。

尽管执行计划很好,可能使用SQL Sentry Plan Explorer来显示它?以及工作表在select语句中的位置?工作表是SQL Server在tempdb上创建的临时表,用于执行临时工作-
排序、
分组等。请参阅。我猜您的查询是一系列
outerapply
语句。如果您发布了执行计划,我们可以看到是否存在关于缺少索引的任何明显瓶颈,您是否尝试以较小的部分获取数据?自从你
SET STATISTICS IO ON;
SET STATISTICS TIME ON;
SET STATISTICS PROFILE ON;

SELECT <STUFF TO SELECT>
FROM [dbo].[2009_Zlecenia] AS Z 
OUTER APPLY (SELECT TOP 1 M1.DataDo AS 'DataRozladunku', M1.Kod, M1.Miasto, MK1.Skrot FROM [dbo].[MiejscaZaladunkuRozladunku] AS M1 LEFT JOIN [dbo].[Kraje] AS MK1 ON M1.Kraj = MK1.Id WHERE M1.Zlecenie = Z.Id AND M1.Rodzaj = 2 ORDER BY Data DESC) AS MZR 
OUTER APPLY (SELECT TOP 1 M2.DataDo AS 'DataZaladunku', M2.Kod, M2.Miasto, MK2.Skrot FROM [dbo].[MiejscaZaladunkuRozladunku] AS M2 LEFT JOIN [dbo].[Kraje] AS MK2 ON M2.Kraj = MK2.Id WHERE M2.Zlecenie = Z.Id AND M2.Rodzaj = 1 ORDER BY Data ASC) AS MZR1 
OUTER APPLY (Select count(FP1.Id) 'Count' FROM [dbo].[2009_FakturyPrzewoznika] AS FP1 WHERE FP1.ZlecenieId = Z.Id group by FP1.ZlecenieId) AS FP 
OUTER APPLY (SELECT count(FP3.ZlecenieId) 'Count' FROM [dbo].[2009_FakturyPrzewoznika] AS FP3 WHERE FP3.ZlecenieId IN (Select Id FROM [dbo].[2009_Zlecenia] WHERE IdZlecenieNadrzedne <> 0 And IdZlecenieNadrzedne = Z.Id) GROUP BY FP3.ZlecenieId) AS FP2 
OUTER APPLY (SELECT TOP 1 Nr FROM [dbo].[2009_KartyDrogowe] AS KD1 LEFT JOIN [dbo].[ZleceniaKartyDrogowej] AS ZKD1 ON ZKD1.KartaDrogowa = KD1.Id WHERE ZKD1.Zlecenie = Z.Id) AS KD 
OUTER APPLY ( Select count(Id) 'Count' FROM [dbo].[2009_Zlecenia] WHERE IdZlecenieNadrzedne <> 0 And IdZlecenieNadrzedne = Z.Id) AS ZP 
LEFT JOIN [dbo].[ZleceniaWalutaObca] AS ZWO ON Z.Id = ZWO.OrderId 
LEFT JOIN [dbo].[Kraje] AS K1 ON Z.TransportZ = K1.Id 
LEFT JOIN [dbo].[Kraje] AS K2 ON Z.TransportDo = K2.Id 
LEFT JOIN [dbo].[Lista] AS L1 ON Z.Status = L1.Id 
LEFT JOIN [dbo].[Uzytkownicy] AS U ON Z.Uzytkownik = U.Id 
LEFT JOIN [dbo].[Oddzialy] AS UO ON U.Oddzial = UO.Id 
LEFT JOIN [dbo].[FakturyZlecen] AS FZ ON FZ.Zlecenie = Z.Id 
LEFT JOIN [dbo].[FakturyZlecen] AS FZ1 ON FZ1.Zlecenie = Z.IdZlecenieNadrzedne 
LEFT JOIN [dbo].[2009_Faktury] AS F1 ON FZ.Faktura = F1.Id 
LEFT JOIN [dbo].[2009_Faktury] AS F2 ON FZ1.Faktura = F2.Id 
LEFT JOIN [dbo].[Firmy] AS FO ON FO.Id = Z.ZleceniodawcaId 
LEFT JOIN [dbo].[Uzytkownicy] AS O1 ON FO.Opiekun1 = O1.Id 
LEFT JOIN [dbo].[Uzytkownicy] AS O2 ON FO.Opiekun2 = O2.Id 
LEFT JOIN [dbo].[Uzytkownicy] AS O3 ON FO.Opiekun3 = O3.Id 
WHERE Z.TypZlecenia = 4 AND Z.Importowane=0 ORDER BY YEAR(Z.DataZlecenia) DESC, Z.Idx DESC, Z.Nr DESC


SET STATISTICS IO OFF;
SET STATISTICS TIME OFF;
SET STATISTICS PROFILE OFF;