Оптимизация SQL Select для счетчиков - PullRequest
0 голосов
/ 29 октября 2010

Как можно оптимизировать этот запрос для перечислителей:

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);
   }
}

PS Мне также нужно оптимизировать это в MySQL.

1 Ответ

1 голос
/ 30 октября 2010

1) Вам нужен '*', вы не можете указать столбцы.

2) Использовать составные имена dbo.tablename.fieldname - это ускоряет его

3) tryподсказка блокировки с (nolock) или (readpast)

4) Что такое профиль ввода-вывода?Нужно ли SQL извлекать данные с диска каждый раз, когда он запускается?

5) Находите ли вы одно из ядер на вашем сервере максимально, пока другое не работает?

6) Кэшируйте это!Пока вы не узнаете, что произошли изменения, перезагрузите их.

У меня закончились идеи ..

...