2013-08-29 31 views
2

如果我在SQL Server Management Studio中執行MDX查詢,我會在2秒內得到該查詢的結果。它返回大約400行,6列。在SQL服務器中執行MDX查詢需要2秒鐘,但通過ADOMD執行並且需要5分鐘的時間才能執行數據。

當我通過網絡ADOMD &循環執行相同的查詢時,大約需要5分鐘。

什麼是使用ADOMD檢索數據的最快方法&爲什麼這種方法需要這麼長時間?

我正在使用以下代碼。

namespace Delete 
{ 
    public class TreeNode 
    { 
     public string MemberName { get; set; } 
     public string ID { get; set; } 
     public string ParentKey { get; set; } 
     public int Level { get; set; } 
     public string HierarchyLevel { get; set; } 
     public bool root { get; set; } 
     public bool leaf { get; set; } 

     public bool expanded 
     { 
      get { return true; } 
     } 
     public bool @checked 
     { 
      get { return false; } 
     } 
     public List<TreeNode> children { get; set; } 
    } 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      var v = ExecuteQueryForHierarchy("", ""); 
     } 


     private static List<TreeNode> ExecuteQueryForHierarchy(string connString, string query) 
     { 
      Stopwatch sw = new Stopwatch(); 
      sw.Start(); 


      CellSet cellset; 
      connString = ""; 
      query = @""; 
      List<TreeNode> treeNodeList = new List<TreeNode>(); 
      var connection = new AdomdConnection(connString); 
      var command = new AdomdCommand(query, connection); 
      try 
      { 
       connection.Open(); 
       cellset = command.ExecuteCellSet(); 

       TreeNode node = null; 
       var positionCollection = cellset.Axes[1].Positions; 


       foreach (var item in positionCollection) 
       { 
        node = new TreeNode(); 
        node.MemberName = item.Members[0].Caption; 
        node.Level = item.Members[0].LevelDepth; 
        node.HierarchyLevel = item.Members[0].LevelName; 
        node.ParentKey = item.Members[0].Parent != null ? item.Members[0].Parent.UniqueName : null; 
        node.root = item.Members[0].Parent == null ? true : false; 
        node.leaf = item.Members[0].ChildCount <= 0; 
        node.ID = item.Members[0].UniqueName; 
        treeNodeList.Add(node); 
        Console.WriteLine(treeNodeList.Count); 
       } 
      } 
      finally 
      { 
       connection.Close(); 
       connection.Dispose(); 
      } 

      sw.Stop(); 
      TimeSpan elapsedTime = sw.Elapsed; 
      Console.WriteLine(sw.Elapsed.ToString()); 
      Console.ReadKey(); 
      return treeNodeList; 
     } 

     private List<TreeNode> BuildTree(IEnumerable<TreeNode> items) 
     { 
      List<TreeNode> itemL = items.ToList(); 
      itemL.ForEach(i => i.children = items.Where(ch => ch.ParentKey == i.ID).ToList()); 
      return itemL.Where(i => i.ParentKey == null).ToList(); 
     } 

    } 
} 
+0

是花費在查詢或迭代結果集上的時間?我注意到你正在做一個ChildCount,看着父母和孩子,所有這些可能會帶來很小的成本。 – Meff

回答

2

ADOMD ExecuteCellSet是一種非常昂貴的方法。在我的情況下,我正在訪問item.Members[0].Parent 這是需要很長時間作爲系統使用再次擊中數據庫並用它從多維數據集檢索父信息。如果您需要來自多維數據集的其他信息,ExecuteCellSet非常棒。

我使用ExecuteReader()解決了問題。下面是代碼

List<TreeNode> treeNodeList = new List<TreeNode>(); 
      var connection = new AdomdConnection(connString); 
      var command = new AdomdCommand(query, connection); 
      try 
      { 
       connection.Open(); 
       var result = command.ExecuteReader(); 

       TreeNode node = null; 
       int count = 0; 
       while (result.Read()) 
       { 
        count++; 
        node = new TreeNode(); 
        node.MemberName = Convert.ToString(result[6]); 
        node.ID = Convert.ToString(result[7]); 
        var parentKey = Convert.ToString(result[8]); 
        node.ParentKey = string.IsNullOrEmpty(parentKey) ? null : parentKey; 
        node.Level = Convert.ToInt32(result[9]); 
        node.HierarchyLevel = Convert.ToString(result[10]); 
        if (parentKey == null) 
        { 
         continue; 
        } 

        treeNodeList.Add(node); 
       } 
      } 
      finally 
      { 
       connection.Close(); 
       connection.Dispose(); 
      } 
相關問題