У меня есть база данных с большим количеством данных (миллионы строк), а также обновление в течение дня с большим количеством данных, у меня есть резервная копия этой базы данных для отчетности, поэтому получение отчета данных не влияет на производительность основной базы данных.
Для синхронизации резервной базы данных с основной базой данных я написал службу Windows, которая запрашивает основную базу данных и вставляет новые данные в резервную базу данных... каждый раз, когда запрос получает 5000 строк из основной базы данных...
РЕДАКТИРОВАТЬ:
запрос выглядит следующим образом:
const string cmdStr = "SELECT * FROM [RLCConvertor].[dbo].[RLCDiffHeader] WHERE ID >= @Start and ID <= @End";
Вот код:
using (var conn = new SqlConnection(_connectionString))
{
conn.Open();
var cmd = new SqlCommand(cmdStr, conn);
cmd.Parameters.AddWithValue("@Start", start);
cmd.Parameters.AddWithValue("@End", end);
SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.SequentialAccess);
while (reader.Read())
{
var rldDiffId = Convert.ToInt32(reader["ID"].ToString());
var rlcDifHeader = new RLCDiffHeader
{
Tech_head_Type = long.Parse(reader["Tech_head_Type"].ToString()),
ItemCode = long.Parse(reader["ItemCode"].ToString()),
SessionNumber = long.Parse(reader["SessionNumber"].ToString()),
MarketFeedCode = reader["MarketFeedCode"].ToString(),
MarketPlaceCode = reader["MarketPlaceCode"].ToString(),
FinancialMarketCode = reader["FinancialMarketCode"].ToString(),
CIDGrc = reader["CIDGrc"].ToString(),
InstrumentID = reader["InstrumentID"].ToString(),
CValMNE = reader["CValMNE"].ToString(),
DEven = reader["DEven"].ToString(),
HEven = reader["HEven"].ToString(),
MessageCodeType = reader["MessageCodeType"].ToString(),
SEQbyINSTandType = reader["SEQbyINSTandType"].ToString()
};
newRLCDiffHeaders.Add(rldDiffId, rlcDifHeader);
}
conn.Close();
}
но когда я запустил службу... производительность основной базы данных ухудшилась... код неэффективен? Есть ли лучший способ? Потому что я искал и обнаружил, что dataReader
лучше всего подходит для этого случая... или мне следует использовать DataTable
и SqlDataAdapter
?
SqlDataAdapter
определенно не является более эффективным способом работы. Единственное, что я бы порекомендовал, — попробовать меньший размер... 5000 строк могут привести к тому, что SQL Server выполнит эскалацию блокировок и заблокирует всю таблицу — вместо того, чтобы блокировать строки. уровневые замки. Используйте 2000 строк или что-то в этом роде. - person marc_s   schedule 22.10.2013cmdStr
- без этого все, что у нас есть, это код, который считывается из устройства чтения данных - это само по себе нормально и не является неэффективным. Но: какую команду вы используете и как часто вы ее запускаете? Мое предположение заключается в том, что любая потеря производительности здесь связана со временем, проведенным на сервере БД — но вы должны профилировать это, чтобы выяснить это — там нет ничего, что указывало бы на производительность .NET. проблема - person Marc Gravell   schedule 22.10.2013ID
? Что касаетсяnolock
- это будет:SELECT * FROM [RLCConvertor].[dbo].[RLCDiffHeader] with (nolock) WHERE ID >= @Start and ID <= @End
- это позволит избежать проблем, если на вас негативно влияет блокировка, но это будет означать, что вы можете выполнять грязное чтение - person Marc Gravell   schedule 22.10.2013