我正在做一些研究,以更好地理解 SQL 和使用 DataTables。
所以我试图从 MS SQL 数据库读取数据并将其加载到 datagridview 中。

我创建了一个 SQL 函数,我从我的工具中调用它并将结果加载到数据表中。
如果我在 SSMS 中执行这个函数,加载结果需要 11-12 秒(将近 150 万个条目),但是如果我使用该工具执行这个函数,我编码,它将需要超过 30 秒(只是用于做 DataTable.Load(SqlDataReader))

到目前为止我所做的是:

    private DataTable GetDataFromDB(string userId, string docId, DateTimeOffset date)
    {
        string cmd = String.Format("select * from dbo.GetData(@userId, @docId, @dueDate);");

        using (SqlConnection conn = new SqlConnection(connectionString))
        {
            if (conn.State != ConnectionState.Open)
                conn.Open();

            SqlCommand command = new SqlCommand(cmd, conn);

            if (String.IsNullOrEmpty(userId))
                command.Parameters.AddWithValue("@userId", DBNull.Value);
            else
                command.Parameters.AddWithValue("@userId", userId);

            if (String.IsNullOrEmpty(docId))
                command.Parameters.AddWithValue("@docId", DBNull.Value);
            else
                command.Parameters.AddWithValue("@docId", docId);
            command.Parameters.AddWithValue("@dueDate", dueDate);

            SqlDataReader reader = command.ExecuteReader();

            stopWatch.Reset();
            stopWatch.Start();

            table.BeginLoadData();
            table.Load(reader, LoadOption.Upsert);
            table.EndLoadData();
            stopWatch.Stop();
            reader.Close();
            reader.Dispose();
            conn.Close();
        }

        return table;
    }

我已经做了一些谷歌研究,这是我能想到的最好的。到目前为止,它运行良好,但我很想知道是否可以更快地获得结果。有任何想法吗?
另外我的内存有问题。一旦我开始调用,该工具将分配多达 900MB 的 RAM,直到它拥有所有条目。我已经管理了它,每次调用上面的函数时都可以释放内存,但我认为 900MB 相当多,另一个问题是,它不会释放所有需要的 RAM。例如:当我启动该工具时,它需要大约 7MB 的 RAM,如果我第一次调用上面的方法,它将需要 900MB。如果我下次调用它,它将释放大部分内存,但仍需要 930MB。第三次960MB,以此类推。因此,每次调用都会分配更多内存,如果经常调用此方法,则会导致“系统内存不足”异常。

非常感谢!

最佳答案

性能将根据您加载的数据和数量而有所不同。
下面的链接将为您提供带有性能报告的解决方案。用你的方法尝试这样的事情并比较性能。

希望这会帮助你。

Fastest way to populate datatable

关于c# - 是否有比 DataTable.Load(DataReader) 更快/更智能的方法来填充数据表? C#,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37658628/

10-09 08:10
查看更多