2017-01-11 9 views
0

私は非常に大きなデータベースを扱っており、オンラインデータビジュアライゼーションソフトウェアを使用してそのデータを表示したいと考えています。私の問題は、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 
+0

おそらく、元のクエリとテーブル定義などを投稿して、クエリを最適化できるかどうかを確認できます。現時点では、実際の詳細はないので誰もが推測できる最高のものです。 –

+2

本当にすべての方法でクエリを最適化しましたか? –

+0

可能であれば、ページングを実装することを検討する必要があります – JamieD77

答えて

0

これはコメントのために少し長いです:

私は、以下のクエリを追加しています。

30秒ごとに30分ごとにクエリを実行することは合理的です。しかし、それはあらゆる種類の問題を引き起こします。特に、ユーザーがデータを再読み込みして物事が変化するのを見ることがあります。不連続なユーザーエクスペリエンスは、通常、悪いことです。そして、およそ2%のバックグラウンド・ロードは、他の照会の他のパフォーマンスに影響を与える可能性があります。

私の反応は次のとおりです。これは最後の手段としてのみ行います。データベースには、インデックス、パーティション、改良されたSQL、SSDディスクなどのパフォーマンスを向上させるための複数のオプションがあります。アプリケーション自体が一時テーブルを作成する可能性があります。これは最初30秒を食べるが、その後のテーブルの使用は速くなければならない。

+0

ゴードン、ありがとう、私は質問のクエリの詳細を追加していただきありがとうございます。 – lisovaccaro

関連する問題