【问题标题】:Optimization of SQL Select for enumerators枚举器的 SQL Select 优化
【发布时间】: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


【解决方案1】:

1) 你需要'*'吗?不能指定列。

2) 使用多部分名称 dbo.tablename.fieldname - 这会加快速度

3) 使用 (nolock) 或 (readpast) 尝试锁定提示

4) IO 配置文件是什么? SQL每次运行都要从磁盘拉取数据吗?

5) 您是否发现服务器上的一个核心已满负荷而另一个处于空闲状态?

6) 缓存它!直到您知道发生了变化 - 然后重新加载它。

我的想法已经用完了..

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多