如果我在SQL Server Management Studio中执行MDX查询,我会在2秒内得到该查询的结果。它返回大约400行,共6列。
当我通过ADOMD&执行相同的查询时在电池组上循环,大约需要5分钟。
使用ADOMD&amp ;;检索数据的最快方法是什么?为什么这种方法需要这么长时间?
我正在使用以下代码。
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 :(得分:2)
ADOMD ExecuteCellSet是一种非常昂贵的方法。就我而言,我正在访问item.Members[0].Parent
这花了很长时间作为系统使用再次命中DB,它用于从多维数据集中检索父信息。如果您需要多维数据集中的一些其他信息,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();
}