Я хотел бы увеличить производительность очень простых запросов на выбор и обновление .NET. & MSSQL 2k8. Мои запросы всегда выбирают или обновляют одну строку. Таблицы DB имеют индексы для столбцов, на которые я запрашиваю. Мой тестовый код .NET выглядит следующим образом:Улучшение производительности и производительности .NET/MSSQL
public static MyData GetMyData(int accountID, string symbol)
{
using (var cnn = new SqlConnection(connectionString))
{
cnn.Open();
var cmd = new SqlCommand("MyData_Get", cnn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add(CreateInputParam("@AccountID", SqlDbType.Int, accountID));
cmd.Parameters.Add(CreateInputParam("@Symbol", SqlDbType.VarChar, symbol));
SqlDataReader reader = cmd.ExecuteReader();
while (reader.Read())
{
var MyData = new MyData();
MyData.ID = (int)reader["ID"];
MyData.A = (int)reader["A"];
MyData.B = reader["B"].ToString();
MyData.C = (int)reader["C"];
MyData.D = Convert.ToDouble(reader["D"]);
MyData.E = Convert.ToDouble(reader["E"]);
MyData.F = Convert.ToDouble(reader["F"]);
return MyData;
}
}
}
и по хранимая процедура выглядит следующим образом:
PROCEDURE [dbo].[MyData_Get]
@AccountID int,
@Symbol varchar(25)
AS
BEGIN
SET NOCOUNT ON;
SELECT p.ID, p.A, p.B, p.C, p.D, p.E, p.F FROM [MyData] AS p WHERE p.AccountID = @AccountID AND p.Symbol = @Symbol
END
Что я вижу, если я бегу GetMyData в цикле, запрашивая объекты MyData, Я не превышаю ~ 310 транзакций/сек. Я надеялся достичь более 1000 транзакций в секунду.
На стороне SQL Server не совсем уверен, что я могу улучшить для такого простого запроса. ANTI profiler показывает мне, что на стороне .NET, как и ожидалось, узким местом является cnn.Open и cnn.ExecuteReader, однако я понятия не имею, как я мог бы значительно улучшить свой код .NET?
Я видел тесты, хотя люди, похоже, легко достигают 10 000 000 транзакций в секунду.
Любые советы о том, как я могу значительно улучшить производительность для этого сценария, будут очень признательны!
Спасибо,
Том
EDIT:
рекомендация Per MrLink, добавив "TOP 1" в запросе на выборку улучшена производительность около 585 операций/сек от 310
EDIT 2:
Arash N предложил выбрать запрос «WITH (NOLOCK)», что значительно улучшило производительность! Я сейчас вижу около 2500 операций/сек
EDIT 3:
Другой небольшой оптимизация, которую я только что сделал на стороне .NET помог мне получить еще 150 транзакций/сек. Изменение в то время как (reader.Read()) до if (reader.Read()) на удивление в значительной степени изменило ситуацию. На сред. Я сейчас вижу 2719 транзакций/сек.
Есть много факторов: вы пренебрегаете упоминанием аппаратного или аппаратного обеспечения. – 2010-12-09 23:30:29
Этот код работает на нескольких разных системах. Бенчмарк на моей тестовой машине и в производстве довольно близок. Большинство машин - 8-ядерные xeon-машины с> 16 ГБ оперативной памяти и диски SAS в RAID5 – TJF 2010-12-09 23:46:42
Прошу прощения; вы серьезно говорите, что вы разочарованы установлением соединения, запуском хранимой процедуры и обработкой результатов занимает 3 мс? – Stu 2010-12-09 23:55:55