私は非常に大きなデータベースを扱っており、オンラインデータビジュアライゼーションソフトウェアを使用してそのデータを表示したいと考えています。私の問題は、DBが非常に大きいため、30秒以内に実行する特定のクエリを取得できないということです。これにより、データの視覚化の経験が非常に悪くなり、クエリをより速く実行する方法を見つける必要があります。テーブルのクエリ結果を保存してパフォーマンスを向上させる方法
私はこのクエリをテーブルに30分ごとに選択する手順を実行する保守計画の実行を評価しています。私はこれが良いアプローチであるかどうか、または私のクエリをさらに最適化できるかどうか疑問に思っています。
SELECT
CY.CycleGroupName AS CycleName,
FF.WBSCode,
CC.CostCenterCode,
CC.Name AS CostCenterName,
IIF(FF.ClientSpecific = 'Overhead', CC.GlobalLocal, 'Local') AS GlobalLocal,
PC.ProfitCenterCode,
PC.Name AS ProfitCenterName,
FN.ForecastNodeCode AS ForecastNodeCode,
FN.Name AS ForecastNodeName,
FN.GSGeographicUnit,
FN.GSCountry,
FN.Domain,
FN.Location,
CO.Name AS CountryName,
CO.Classification AS CountryClassification,
GU.Name AS GeographicUnitName,
GU.GeographicAreaCode,
ReportLine2,
ReportLine3,
ReportLine4,
IIF(RL.IsGrossCost = 'Yes', 'Gross Cost', '') AS GrossCostClassification,
ProductivityCategory,
FF.ClientSpecific,
FF.ResourceID,
FF.CurrencyType,
CO.CurrencyCode AS LocalCurrencyCode,
FF.InputCurrencyCode AS InputCurrencyCode,
FF.Comments,
FF.FiscalMonthNumber,
FF.Amount * Multiplier AS Amount
FROM
(
SELECT
CQ.CycleName,
FF.TemplateID,
FF.HeadcountID,
FF.BorrowedID,
CT.CurrencyType,
FF.WBSCode,
FF.CostCenterCode,
FF.ProfitCenterCode,
FF.ForecastNodeCode,
FF.CountryCode,
FF.ReportLine,
FF.CostElementCode,
'T' + CAST(FF.TemplateID AS NVARCHAR) + 'H' + IIF(FF.HeadcountID IS NOT NULL, 'H' + CAST(FF.HeadcountID AS NVARCHAR), 'B' + CAST(FF.BorrowedID AS NVARCHAR)) AS ResourceID,
FF.InputCurrencyCode,
FF.ProductivityCategory,
FF.ClientSpecific,
FF.Comments,
FF.FiscalMonthNumber,
IIF(CT.Number = 30, FF.Amount * FX.Sep, FF.Amount) AS Amount
FROM dbo.FinancialsForecast FF
LEFT JOIN dbo.CyclesQuarters CQ ON FF.QuarterCode = CQ.QuarterCode
LEFT JOIN dbo.CurrencyTypes CT ON 1 = 1
LEFT JOIN dbo.CostCenters CC ON FF.CostCenterCode = CC.CostCenterCode
LEFT JOIN dbo.Countries CO ON ISNULL(CC.CountryCode, FF.CountryCode) = CO.CountryCode
LEFT JOIN dbo.FXRates FX ON CO.CurrencyCode = FX.CurrencyCode AND FF.Year = FX.Year AND FF.QuarterCode = FX.QuarterCode
WHERE
CQ.CycleName IS NOT NULL
AND FiscalMonthNumber > CQ.LastActualsMonth
UNION ALL
SELECT
ISNULL(CQ.CycleName, 'Previous Actuals') AS CycleName,
NULL AS TemplateID,
NULL AS HeadcountID,
NULL AS BorrowedID,
FA.CurrencyType,
FA.WBSCode,
FA.CostCenterCode,
FA.ProfitCenterCode,
NULL AS ForecastNodeCode,
FA.CountryCode,
NULL AS ReportLine,
FA.CostElementCode,
NULL AS ResourceID,
NULL AS InputCurrencyCode,
ProductivityCategory,
FA.ClientSpecific,
NULL AS Comments,
FA.FiscalMonthNumber,
FA.Amount
FROM dbo.FinancialsActuals FA
LEFT JOIN dbo.CyclesQuarters CQ ON FA.Year = (SELECT Value FROM dbo.Settings WHERE Name = 'CurrentYear')
LEFT JOIN dbo.WBS W ON FA.WBSCode = W.WBSCode
LEFT JOIN dbo.BusinessActivitiesLevel1 B1 ON W.BusinessActivityLevel1Code = B1.BusinessActivityLevelCode
WHERE
FA.Year >= (SELECT CAST(Value AS INT) FROM dbo.Settings WHERE Name = 'CurrentYear') - 1
AND FiscalMonthNumber <= ISNULL(CQ.LastActualsMonth, 12)
) FF
LEFT JOIN dbo.CostCenters CC ON FF.CostCenterCode = CC.CostCenterCode
LEFT JOIN dbo.Countries CO ON ISNULL(CC.CountryCode, FF.CountryCode) = CO.CountryCode
LEFT JOIN dbo.ProfitCenters PC ON CC.ProfitCenterCode = PC.ProfitCenterCode
LEFT JOIN dbo.ForecastNodes FN ON ISNULL(ISNULL(CC.ForecastNodeCode, FF.ForecastNodeCode), PC.ForecastNodeCode) = FN.ForecastNodeCode
LEFT JOIN dbo.GeographicUnits AS GU ON CO.GeographicUnitCode = GU.GeographicUnitCode
LEFT JOIN dbo.CostElements CE ON FF.CostElementCode = CE.CostElementCode
LEFT JOIN dbo.ReportLines RL ON ISNULL(CE.ReportLine, FF.ReportLine) = RL.ReportLine AND RL.Number = 4
LEFT JOIN dbo.ReportLinesLevels RLL ON RL.ReportLine = RLL.ReportLine4
LEFT JOIN dbo.CyclesGroups CY ON FF.CycleName = CY.CycleName
おそらく、元のクエリとテーブル定義などを投稿して、クエリを最適化できるかどうかを確認できます。現時点では、実際の詳細はないので誰もが推測できる最高のものです。 –
本当にすべての方法でクエリを最適化しましたか? –
可能であれば、ページングを実装することを検討する必要があります – JamieD77