2009-06-17 3 views
1

Я регидратация моих бизнес-объектов путем сбора данных из нескольких таблиц, например,MARS против NextResult

 
SELECT * FROM CaDataTable; 
SELECT * FROM NyDataTable; 
SELECT * FROM WaDataTable; 

и так далее ... (C# 3.5, SQL Server 2005)

Я использую партии:

void BatchReader() 
    { 
     string sql = "Select * From CaDataTable" + 
        "Select * From NyDataTable" + 
        "Select * From WaDataTable"; 

     string connectionString = GetConnectionString(); 
     using (SqlConnection conn = new SqlConnection(connectionString)) { 
      conn.Open(); 
      SqlCommand cmd = new SqlCommand(sql, conn); 
      using (SqlDataReader reader = cmd.ExecuteReader()) { 
       do { 
        while (reader.Read()) { 
         ReadRecords(reader); 
        } 
       } while (reader.NextResult()); 
      } 
     } 
    } 

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

void MultipleCommandReader() 
    { 
     string connectionString = GetConnectionString(); 
     string sql; 
     SqlCommand cmd; 
     using (SqlConnection conn = new SqlConnection(connectionString)) { 
      conn.Open(); 

      sql = "Select * From CaDataTable"; 
      cmd = new SqlCommand(sql, conn); 
      using (SqlDataReader reader = cmd.ExecuteReader()) { 
       while (reader.Read()) { 
        ReadRecords(reader); 
       } 
      } 

      sql = "Select * From NyDataTable"; 
      cmd = new SqlCommand(sql, conn); 
      using (SqlDataReader reader = cmd.ExecuteReader()) { 
       while (reader.Read()) { 
        ReadRecords(reader); 
       } 
      } 

      sql = "Select * From WaDataTable"; 
      cmd = new SqlCommand(sql, conn); 
      using (SqlDataReader reader = cmd.ExecuteReader()) { 
       while (reader.Read()) { 
        ReadRecords(reader); 
       } 
      } 
     } 
    } 

Является ли один из этих методов значительно лучше, чем другой? Кроме того, будет ли выигрыш, если я использую MARS для второго метода? Другими словами, это так же просто, как установка MultipleActiveResultSets = True в строке подключения и получение большого преимущества?

ответ

2

Если структура данных одинакова в каждой таблице, я хотел бы сделать:

Select *, 'Ca' Source From CaDataTable 
union all 
Select *, 'Ny' Source From NyDataTable 
union all 
Select *, 'Wa' Source From WaDataTable 
+0

Спасибо, это отличная альтернатива. Есть ли способ закодировать это, если я точно не знаю, что каждая из таблиц существует? Другими словами, как можно защитить от ситуации, когда NyDataTable не существует? – Sisiutl

+1

Я бы построил вышеуказанный запрос динамически на основе информации, полученной из: select * from information_schema.tables – RedFilter

0

Без фактически синхронизации двух версий друг против друга, вы можете только догадываться ....

Я надеюсь, сделайте ставку, что версия 1 (BatchReader) будет быстрее, так как вы получите только один раунд в базу данных. Версия 2 требует трех разных раундов: по одному для каждого выполняемого вами запроса.

Но опять же: вы можете только действительно сказать, если вы измеряете.

Марк

О, PS: конечно же, в сценарии реальной жизни это также помогло бы так ограничить столбцы возвращены, например, не используйте SELECT *, но вместо этого используйте SELECT (list of fields) и сохраните этот список полей как можно короче.

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

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