Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Pomoc w optymalizacji zapytania SQL
Forum PHP.pl > Forum > Bazy danych
Tweaty
Witam,

Potrzebuję pomocy przy optymalizacji zapytania SQL, które wykonuje się zdecydowanie za wolno. Próbowałem sam się uporać z tym problemem jednak brakuje mi już pomysłów jak to rozwiązać.

Kod zapytania w poniższym linku.
http://wklej.org/id/1087334/

  1. SELECT dbo.MetaOffer.MetaOfferId, dbo.MetaOffer.OfferName, dbo.MetaOffer.CheckOutDate, dbo.MetaOffer.CreateDate, dbo.MetaOffer.CoordinatorDate,
  2. dbo.MetaOffer.DeploymentDate, ohii.UserId, dbo.Customer.CustomerNip, dbo.Customer.DisplayName AS CustomerFullName, dbo.ObjectType.ObjectTypeName,
  3. creator.FirstName + ' ' + creator.LastName AS CreatorFullName, Kozu.ProcessStatus.STATUS, owner.FirstName + ' ' + owner.LastName AS OwnerFullName,
  4. owner.Sfid AS OwnerSfid, creator.Sfid AS CreatorSfid, analyst.FirstName + ' ' + analyst.LastName AS AnalystFullName,
  5. coord.FirstName + ' ' + coord.LastName AS CoordFullName, coord.Sfid AS CoordSfid, analyst.Sfid AS AnalystSfid, ownerGroup.Name AS NazwaGrupy,
  6. deployer.FirstName + ' ' + deployer.LastName AS DeployerFullName, deployer.Sfid AS DeployerSfid, dbo.Customer.S2KNumber, dbo.MetaOffer.ObjectTypeId,
  7. dbo.MetaOffer.LastStatusChangeDate, dbo.MetaOffer.LastProcessStatusId, dbo.MetaOffer.SourceMetaOfferId, CAST(SUBSTRING
  8. ((SELECT ' ,' + CAST(Nip AS nvarchar(50))
  9. FROM CustomerNip cn
  10. WHERE cn.CustomerId = dbo.Customer.CustomerId FOR XML PATH('')), 3, 100) AS nvarchar(200)) AS NIPs, dbo.MetaOffer.IsArchive, dbo.MetaOffer.TemplateName,
  11. CAST(LastHistory.ActionComment AS nvarchar(400)) AS ActionComment, dbo.Customer.City, dbo.Trade.TradeName,
  12. checkout.FirstName + ' ' + checkout.LastName AS CheckOutFullName
  13. FROM dbo.MetaOffer WITH (nolock) INNER JOIN
  14. dbo.OfferHistoryItem AS LastHistory WITH (nolock) ON LastHistory.OfferHistoryItemId = dbo.MetaOffer.LastOfferHistoryItem INNER JOIN
  15. (SELECT dbo.MetaOffer.MetaOfferId,ohi.UserId
  16. FROM dbo.MetaOffer WITH (nolock) INNER JOIN
  17. dbo.OfferHistoryItem AS LastHistory WITH (nolock) ON LastHistory.OfferHistoryItemId = dbo.MetaOffer.LastOfferHistoryItem INNER JOIN
  18. (SELECT UserId, MetaOfferId
  19. FROM dbo.OfferHistoryItem WITH (nolock)
  20. WHERE (UserId IS NOT NULL)
  21. UNION
  22. SELECT DestinationUserId, MetaOfferId
  23. FROM dbo.OfferHistoryItem AS OfferHistoryItem_2 WITH (nolock)
  24. WHERE (DestinationUserId IS NOT NULL)
  25. UNION
  26. SELECT Substitute4UserId, MetaOfferId
  27. FROM dbo.OfferHistoryItem AS OfferHistoryItem_1 WITH (nolock)
  28. WHERE (Substitute4UserId IS NOT NULL)) AS ohi ON dbo.MetaOffer.MetaOfferId = ohi.MetaOfferId
  29. WHERE (dbo.MetaOffer.ObjectTypeId != 3)
  30.  
  31. UNION
  32.  
  33. SELECT dbo.MetaOffer.MetaOfferId, Kozu.UserUserGroup.UserId
  34. FROM dbo.MetaOffer WITH (nolock) INNER JOIN
  35. dbo.OfferHistoryItem AS LastHistory WITH (nolock) ON LastHistory.OfferHistoryItemId = dbo.MetaOffer.LastOfferHistoryItem INNER JOIN
  36. (SELECT UserGroupId, MetaOfferId
  37. FROM dbo.OfferHistoryItem WITH (nolock)
  38. WHERE (UserGroupId IS NOT NULL)
  39. UNION
  40. SELECT DestinationUserGroupId, MetaOfferId
  41. FROM dbo.OfferHistoryItem AS OfferHistoryItem_2 WITH (nolock)
  42. WHERE (DestinationUserGroupId IS NOT NULL)) AS ohi2 ON dbo.MetaOffer.MetaOfferId = ohi2.MetaOfferId INNER JOIN
  43.  
  44. Kozu.UserUserGroup WITH (nolock) ON Kozu.UserUserGroup.UserGroupId = ohi2.UserGroupId
  45. WHERE (dbo.MetaOffer.ObjectTypeId != 3)) AS ohii ON dbo.MetaOffer.MetaOfferId = ohii.MetaOfferId INNER JOIN
  46. dbo.Customer WITH (nolock) ON dbo.MetaOffer.CustomerId = dbo.Customer.CustomerId INNER JOIN
  47. dbo.Trade WITH (nolock) ON dbo.Trade.TradeId = dbo.Customer.TradeId INNER JOIN
  48. dbo.ObjectType WITH (nolock) ON dbo.MetaOffer.ObjectTypeId = dbo.ObjectType.ObjectTypeId INNER JOIN
  49. Kozu.ProcessStatus WITH (nolock) ON dbo.MetaOffer.LastProcessStatusId = Kozu.ProcessStatus.ProcessStatusId LEFT OUTER JOIN
  50. Kozu.[User] AS deployer WITH (nolock) ON dbo.MetaOffer.DeployUserId = deployer.UserId LEFT OUTER JOIN
  51. Kozu.UserGroup AS ownerGroup WITH (nolock) ON dbo.MetaOffer.OwnerGroupId = ownerGroup.UserGroupId LEFT OUTER JOIN
  52. Kozu.[User] AS coord WITH (nolock) ON dbo.MetaOffer.CoordinatorId = coord.UserId LEFT OUTER JOIN
  53. Kozu.[User] AS analyst WITH (nolock) ON dbo.MetaOffer.CentralAnalystId = analyst.UserId LEFT OUTER JOIN
  54. Kozu.[User] AS owner WITH (nolock) ON dbo.MetaOffer.OwnerId = owner.UserId LEFT OUTER JOIN
  55. Kozu.[User] AS creator WITH (nolock) ON dbo.MetaOffer.CreatedById = creator.UserId LEFT OUTER JOIN
  56. Kozu.[User] AS checkout WITH (nolock) ON dbo.MetaOffer.CheckOutById = checkout.UserId

wiiir
Pokaz lepiej plan zapytania i indeksy na tabelach uzytych w zapytaniu.

Zapytanie jest ogromne, nie da sie czegoś wydzielić i przygotować danych wkładając do tebeli tymczasowej?


  1. SELECT ' ,' + CAST(Nip AS nvarchar(50))
  2. FROM CustomerNip cn
  3. WHERE cn.CustomerId = dbo.Customer.......................

Każde zapytanie 'inner query' wykonuje sie dla kazdego rekordu z 'outer query'


Pozwoliłem sobie zrobic refactore zapytania, jest bardziej czytelne...
  1. SELECT dbo.metaoffer.metaofferid,
  2. dbo.metaoffer.offername,
  3. dbo.metaoffer.checkoutdate,
  4. dbo.metaoffer.createdate,
  5. dbo.metaoffer.coordinatordate,
  6. dbo.metaoffer.deploymentdate,
  7. ohii.userid,
  8. dbo.customer.customernip,
  9. dbo.customer.displayname AS customerfullname,
  10. dbo.objecttype.objecttypename,
  11. creator.firstname + ' ' + creator.lastname AS creatorfullname,
  12. kozu.processstatus.STATUS,
  13. owner.firstname + ' ' + owner.lastname AS ownerfullname,
  14. owner.sfid AS ownersfid,
  15. creator.sfid AS creatorsfid,
  16. analyst.firstname + ' ' + analyst.lastname AS analystfullname,
  17. coord.firstname + ' ' + coord.lastname AS coordfullname,
  18. coord.sfid AS coordsfid,
  19. analyst.sfid AS analystsfid,
  20. ownergroup.name AS nazwagrupy,
  21. deployer.firstname + ' ' + deployer.lastname AS deployerfullname,
  22. deployer.sfid AS deployersfid,
  23. dbo.customer.s2knumber,
  24. dbo.metaoffer.objecttypeid,
  25. dbo.metaoffer.laststatuschangedate,
  26. dbo.metaoffer.lastprocessstatusid,
  27. dbo.metaoffer.sourcemetaofferid,
  28. CAST(substring((SELECT ' ,' + CAST(nip AS nvarchar(50))
  29. FROM customernip cn
  30. WHERE cn.customerid = dbo.customer.customerid
  31. FOR xml path('')),
  32. 3,
  33. 100) AS nvarchar(200)) AS nips,
  34. dbo.metaoffer.isarchive,
  35. dbo.metaoffer.templatename,
  36. CAST(lasthistory.actioncomment AS nvarchar(400)) AS actioncomment,
  37. dbo.customer.city,
  38. dbo.trade.tradename,
  39. checkout.firstname + ' ' + checkout.lastname AS checkoutfullname
  40. FROM dbo.metaoffer WITH(nolock)
  41. INNER JOIN dbo.offerhistoryitem AS lasthistory WITH(nolock) ON lasthistory.offerhistoryitemid = dbo.metaoffer.lastofferhistoryitem
  42. INNER JOIN (SELECT dbo.metaoffer.metaofferid,
  43. ohi.userid
  44. FROM dbo.metaoffer WITH(nolock)
  45. INNER JOIN dbo.offerhistoryitem AS lasthistory WITH(nolock) ON lasthistory.offerhistoryitemid = dbo.metaoffer.lastofferhistoryitem
  46. INNER JOIN (SELECT userid,
  47. metaofferid
  48. FROM dbo.offerhistoryitem WITH(nolock)
  49. WHERE (userid IS NOT NULL)
  50. UNION
  51. SELECT destinationuserid,
  52. metaofferid
  53. FROM dbo.offerhistoryitem AS offerhistoryitem_2 WITH(nolock)
  54. WHERE (destinationuserid IS NOT NULL)
  55. UNION
  56. SELECT substitute4userid,
  57. metaofferid
  58. FROM dbo.offerhistoryitem AS offerhistoryitem_1 WITH(nolock)
  59. WHERE (substitute4userid IS NOT NULL)) AS ohi ON dbo.metaoffer.metaofferid = ohi.metaofferid
  60. WHERE (dbo.metaoffer.objecttypeid != 3)
  61. UNION
  62. SELECT dbo.metaoffer.metaofferid,
  63. kozu.userusergroup.userid
  64. FROM dbo.metaoffer WITH(nolock)
  65. INNER JOIN dbo.offerhistoryitem AS lasthistory WITH(nolock) ON lasthistory.offerhistoryitemid = dbo.metaoffer.lastofferhistoryitem
  66. INNER JOIN (SELECT usergroupid,
  67. metaofferid
  68. FROM dbo.offerhistoryitem WITH(nolock)
  69. WHERE (usergroupid IS NOT NULL)
  70. UNION
  71. SELECT destinationusergroupid,
  72. metaofferid
  73. FROM dbo.offerhistoryitem AS offerhistoryitem_2 WITH(nolock)
  74. WHERE (destinationusergroupid IS NOT NULL)) AS ohi2 ON dbo.metaoffer.metaofferid = ohi2.metaofferid
  75. INNER JOIN kozu.userusergroup WITH(nolock) ON kozu.userusergroup.usergroupid = ohi2.usergroupid
  76. WHERE (dbo.metaoffer.objecttypeid != 3)) AS ohii ON dbo.metaoffer.metaofferid = ohii.metaofferid
  77. INNER JOIN dbo.customer WITH(nolock) ON dbo.metaoffer.customerid = dbo.customer.customerid
  78. INNER JOIN dbo.trade WITH(nolock) ON dbo.trade.tradeid = dbo.customer.tradeid
  79. INNER JOIN dbo.objecttype WITH(nolock) ON dbo.metaoffer.objecttypeid = dbo.objecttype.objecttypeid
  80. INNER JOIN kozu.processstatus WITH(nolock) ON dbo.metaoffer.lastprocessstatusid = kozu.processstatus.processstatusid
  81. LEFT OUTER JOIN kozu. [ USER ] AS deployer WITH(nolock) ON dbo.metaoffer.deployuserid = deployer.userid
  82. LEFT OUTER JOIN kozu.usergroup AS ownergroup WITH(nolock) ON dbo.metaoffer.ownergroupid = ownergroup.usergroupid
  83. LEFT OUTER JOIN kozu. [ USER ] AS coord WITH(nolock) ON dbo.metaoffer.coordinatorid = coord.userid
  84. LEFT OUTER JOIN kozu. [ USER ] AS analyst WITH(nolock) ON dbo.metaoffer.centralanalystid = analyst.userid
  85. LEFT OUTER JOIN kozu. [ USER ] AS owner WITH(nolock) ON dbo.metaoffer.ownerid = owner.userid
  86. LEFT OUTER JOIN kozu. [ USER ] AS creator WITH(nolock) ON dbo.metaoffer.createdbyid = creator.userid
  87. LEFT OUTER JOIN kozu. [ USER ] AS checkout WITH(nolock) ON dbo.metaoffer.checkoutbyid = checkout.userid
  88.  
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.