2013-07-10 2 views
1

Я работаю над приложением C#, которое загружает данные из базы данных MS SQL 2008 или 2008 R2. Таблица выглядит примерно так:SQL - Лучше два запроса вместо одного большого

ID | binary_data | Timestamp 

Мне нужно получить только последнюю запись и только двоичные данные. Записи в этой таблице добавляются нерегулярно из другой программы, поэтому я не знаю, есть ли новая запись. Какая версия лучше (производительность и т. Д.) И почему?

//Always a query, which might not be needed 
public void ProcessData() 
{ 
    byte[] data = "query code get latest binary data from db" 
} 

против

//Always a smaller check-query, and sometimes two queries 
public void ProcessData() 
{ 
    DateTime timestapm = "query code get latest timestamp from db" 
    if(timestamp > old_timestamp) 
     data = "query code get latest binary data from db" 
} 

Размер binary_data поле будет около 30Kb. Функция «ProcessData» будет вызываться несколько раз в минуту, но иногда ее можно вызывать каждые 1-2 секунды. Это лишь небольшая часть более крупной программы с большим количеством потоков/доступа к базе данных, поэтому я хочу «самое легкое» решение. Благодарю.

+1

Попробуйте проверить его своими данными и использовать случай ...? –

+0

зависит от того, насколько часто это нерегулярное обновление и насколько большие двоичные данные, но я бы сказал, если он не близок так часто, как вы проверяете, что вам лучше идти с 2-мя запросами. – BlackICE

+0

IMO, это будет зависеть от количества новых записей двоичных данных. но почему вы не можете всегда отвечать timestamp, Data = NULL, если нет ничего нового? –

ответ

2

К счастью, вы можете иметь оба:

SELECT TOP 1 binary_data 
    FROM myTable 
WHERE Timestamp > @last_timestamp 
ORDER BY Timestamp DESC 

Если есть никаких записей новее, чем @last_timestamp, запись не будет возвращен и, таким образом, передача данных не происходит (= быстро). Если появляются новые записи, двоичные данные новейших возвращаются немедленно (= нет необходимости в втором запросе).

+0

Вам нужен заказ? –

+0

@SamLeach: если с момента '@ last_timestamp' добавлено несколько записей, то TOP 1/ORDER BY-комбинация гарантирует, что будет возвращена только последняя. – Heinzi

+0

Не можем ли мы предположить, что верхняя запись будет записываться с самой последней меткой времени? Наверное, мы не должны предполагать. ;) –

1

Я предлагаю вам выполнить тесты, используя оба метода, поскольку ответ будет зависеть от ваших обычаев. Имитировать некоторое ожидаемое поведение.

Я бы сказал, что вы, вероятно, хорошо, просто выполните первый запрос. Делайте то, что работает. Не следует преждевременно оптимизировать, если один запрос выполняется слишком медленно, попробуйте второй метод с двумя запросами.

0

Я думаю, что лучший путь является StoredProcedure, который хранит логику внутри базы данных, то с выходным параметром с данными, необходимыми и возвращаемого значения, как ИСТИНА/ЛОЖЬ, чтобы сигнализировать о наличии новых данных

1

Двухступенчатый подход является более эффективным с общей загруженности системы точки зрения:

  1. Получить информацию, что вам нужно запросить новые данные
  2. Запрос новых данных

Есть несколько способы реализации этого подхода. Вот пара из них.

  1. Using Query Notifications который является встроенной функциональностью SQL Server, поддерживаемой в .NET.
  2. Использование подразумеваемого способа получения информации о обновлении таблицы базы данных, например. один из которых описан в this article at SQL Authority blog
Смежные вопросы