MARS против NextResult - PullRequest
       4

MARS против NextResult

1 голос
/ 17 июня 2009

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

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 ]

2 голосов
/ 17 июня 2009

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

Select *, 'Ca' Source From CaDataTable
union all
Select *, 'Ny' Source From NyDataTable
union all
Select *, 'Wa' Source From WaDataTable
0 голосов
/ 18 июня 2009

Фактически не сопоставляя две версии друг с другом, вы можете только строить догадки ....

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

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

Марк

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...