【发布时间】:2010-10-29 17:56:41
【问题描述】:
如何针对枚举数优化此查询:
SELECT * FROM Customers
Table Customers
customerId int - has index on it
customerName, etc
返回一组客户的SqlReader 将以枚举器方式按需读取。虽然它可以返回可以在 foreach 循环中缓慢读取/使用的巨大数据集,但同一张表上的每个其他查询都会遇到很多争用。如何优化/避免这种情况?光标或选择进入临时表?
这是一个会引起很多争论的代码示例(我对其进行了分析,数字看起来确实很糟糕):
public void DumpCustomers()
{
Thread thread = new Thread(AccessCustomers);
thread.Start();
// GetCustomers returns enumerator with yield return; big # of customers
foreach (Customer customer in GetCustomers())
{
Console.WriteLine(customer.CustomerName);
System.Threading.Thread.Sleep(200);
}
thread.Abort();
}
public void AccessCustomers()
{
while (true)
{
Console.WriteLine(GetCustomer("Zoidberg").CustomerName);
Thread.Sleep(100);
}
}
附言我还需要在 MySQL 中对此进行优化。
【问题讨论】:
-
有什么方法可以使用 WHERE 过滤结果吗?如果您选择整个表,那么 customerId 上是否有索引并不重要。也许您应该实现某种分页/获取?
-
同意,没关系。不,我无法使用 WHERE 子句过滤任何内容,需要转储整个表
-
您能否更具体地说明您打算如何处理这个大型数据集?
-
如果你实现了某种“批处理”,你的线程每个都根据一些逻辑分组进行批处理。例如,您的主线程可以向每个线程发出 customerId 的范围,以便每个 AccessCustomers() 线程仅查询索引 customerId 上的一小部分过滤?
-
只是转储它。例如,使用 powershell 转储整个客户列表。或在报告中显示所有客户。需要所有人!
标签: sql mysql cursor sqldatareader mysqldatareader