2010-10-29 2 views
0

Как этот запрос может быть оптимизированы для счетчиков:Оптимизация SQL Select для счетчиков

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


P.S. Мне также нужно будет оптимизировать это в MySQL.

+0

Есть ли способ фильтровать результаты, используя ГДЕ? Если вы выбираете всю таблицу, не имеет значения, что у customerId есть индекс. Возможно, вам следует реализовать какой-то пейджинг/выборку? – dotariel

+0

согласен, это не имеет значения. я не могу фильтровать что-либо с предложением WHERE, вся таблица должна быть сброшена – kateroh

+0

Можете ли вы уточнить, что вы намерены делать с этим большим набором данных? – dotariel

ответ

1

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

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

3) попробовать запирающий подсказку с (NOLOCK) или (READPAST)

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

5) Вы находите один из ядер на своем сервере максимальным, а другой - бездействующим?

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

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

+0

спасибо за идеи, профайлер решил это – kateroh

 Смежные вопросы

  • Нет связанных вопросов^_^