我正在向Caché查询两个模式中的表列表,并循环遍历这些表以获取表的计数。然而,这非常缓慢。例如,1300万条记录需要8小时才能返回结果。当我查询具有1300万条记录的Oracle数据库(在同一网络上)时,返回结果需要1.1秒。
我正在使用BackgroundWorker来执行除UI之外的工作(Windows窗体)。
这是我在CachéODBC驱动程序中使用的代码:
using (OdbcConnection odbcCon = new OdbcConnection(strConnection))
{
try
{
odbcCon.Open();
OdbcCommand odbcCmd = new OdbcCommand();
foreach (var item in lstSchema)
{
var item = i;
odbcCmd.CommandText = "SELECT Count(*) FROM " + item;
odbcCmd.Connection = odbcCon;
AppendTextBox(item + " Count = " + Convert.ToInt32(odbcCmd.ExecuteScalar()) + "\r\n");
int intPercentComplete = (int)((float)(lstSchema.IndexOf(item) + 1) / (float)intTotalTables * 100);
worker.ReportProgress(intPercentComplete);
ModifyLabel(" (" + (lstSchema.IndexOf(item) + 1) + " out of " + intTotalTables + " processed)");
}
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
return;
}
}
驱动程序是问题吗?
感谢。
答案 0 :(得分:1)
我在细节中嘲笑魔鬼。你的代码
SELECT COUNT(*)FROM Table
如果表没有索引,那么我不会感到惊讶它比你预期的要慢。如果表有索引,特别是位图索引,我希望这与Oracle相同。
要考虑的另一件事是了解如何配置Cache,即什么是全局缓冲区,磁盘的性能如何。
答案 1 :(得分:1)
Intersystems缓存的查询速度比我使用的任何SQL数据库慢,特别是在处理大型数据库时。现在为图片添加ODBC开销,您将获得更差的性能。
通过使用位图索引可以实现某种程度的性能,但通常获得良好性能的唯一方法是创建更多数据。
您甚至可能会发现可以为数据库分配更多内存(但这对我来说似乎没什么用)。
例如,每次添加新数据时,都会强制数据库为您的计数增加某个数字(或者甚至是用于分组的多个条目)。然后你可以在合理的水平上表现。
我在博客上写了一篇Intersystems性能测试帖...
http://tesmond.blogspot.co.uk/2013/09/intersystems-cache-performance-woe-is-me.html
答案 2 :(得分:0)
Cache具有内置(智能)功能,可确定如何最佳地执行查询。当然,拥有索引(尤其是位图)将极大地帮助查询时间。但是,仅仅有1300万行应占据秒数。每行有多少数据?我们在许多表中有2.6亿行,在其他表中有7.9亿行。我们可以在几分钟内完成整个过程。非索引的复杂查询可能需要一天,但这是可以理解的。看一下锁定全局变量的内容。我们还发现即使客户端断开连接,显然也会运行查询。您可以使用管理门户终止任务,但系统似乎不喜欢使用较大的查询同时执行多个ODBC查询,因为它需要一些临时数据来执行此类查询。我们使用DBVisualizer进行JDBC连接。
有人提到了TuneTable,如果你的桌子在桌子的生命中经常变化很多或至少几次,那就太棒了。这不是你想要过度使用的东西。 http://docs.intersystems.com/ens20151/csp/docbook/DocBook.UI.Page.cls?KEY=GSQL_optimizing是您可以在其中找到有关此内容和提高性能的一些文档和其他有用信息的地方。如果它不快,那么有人打破它。
有人还提到select count()将使用计算属性计算索引而不是表本身。这与编译sql查询的决策引擎有关,并决定了获取数据最有效的方法。门户网站中有一个工具可以显示它需要多长时间,并向您展示可用的其他方法(智能解释器[我忘记了它的名称])。您可以在同一页面上看到查询计划,您可以在下面提到的浏览器中执行SQL。 /csp/sys/exp/UtilSqlQueryShowPlan.csp
RE:我无法在管理门户中运行此查询,因为这些表只能在应用程序和/或ODBC中使用。
事实并非如此。在管理门户中,转到“系统资源管理器”,“SQL”,然后“执行SQL语句”。请注意,您必须具有足够的权限才能看到此%ALL将允许访问所有内容。此外,您可以通过执行.... do $ system.SQL.Shell()在TERMINAL中本机运行SQL查询然后键入您的查询。这个接口应该比ODBC更快,因为我认为它使用对象访问。另外,请记住,嵌入式SQL和数据对象访问是访问数据的最快方式。
如果您有任何其他问题,请与我们联系!