.net 如何高效地向数据库中插入海量数据?

w8biq8rn  于 2022-12-30  发布在  .NET
关注(0)|答案(1)|浏览(144)

我正在检查用户是否存在于数据库中。我的数据库有5000万条记录。在插入新记录之前,哪种方法可以高效地检查用户是否存在?
我试着同时查数据库和字典,但我不知道哪一个是最好的方法。
我的任务:
编写一个控制台应用程序来生成一个强密码并将其存储在数据库中。我们希望在数据库表中有这样的5000万个密码。密码的长度为20个字符。密码包含大写、小写、数字和特殊字符的组合。数据库不包含重复条目。在单个事务中,批量输入是不允许的。2例如,你可以插入一个单一的记录到数据库中。3最好在最短的时间内完成整个工作。4一旦工作完成。
我的代码:

public partial class Program
{
    static void Main(string[] args)
    {
        string input;
        var watch = new Stopwatch();
       
        while(true)
        {
            Console.WriteLine("Press 'i' for insertion and  'q' for quit:");
            input = Console.ReadLine();
            if(input=="q")
            {
                break;
            }
            if(input=="i")
            {
                watch.Start();
                DataBaseConnection.InsertRecord();
                watch.Stop();
                TimeSpan ts = watch.Elapsed;
                Console.WriteLine("Total time:" + ts.Milliseconds);
            }
        }
    }

    private static Random random = new Random();

    public static string RandomString(int length)
    {
        const string chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" +
            "1234567890~`!@#$%^&*()_-+={[}]|\\:;\"'<,>.?/";
        return new string(Enumerable.Repeat(chars, length)
            .Select(s => s[random.Next(s.Length)]).ToArray());
    }
}

public class DataBaseConnection
{
    const string CONNECTION_STRING = "Data Source=(LocalDB)\\MSSQLLocalDB;" +
        "Initial Catalog=assignment1;Integrated Security=True";
    public static void InsertRecord()
    {
        SqlConnection connection= new SqlConnection(CONNECTION_STRING);
        try
        {
            connection.Open();
            //string password = "tS`*[H,j`~:Yr1Ome@Zk";
            string password =Program.RandomString(20);
            if (IsPasswordExists(connection,password))
            {
                return;
            }
            string query = "insert into PasswordTable values (@val)";
            using(SqlCommand command = new SqlCommand(query, connection))
            {
                command.Parameters.AddWithValue("@val", password);
                command.ExecuteNonQuery();
            }
            //Console.WriteLine("Password inserted successfully.");
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
        finally 
        {
            connection.Close();
        }
    }

    public static bool IsPasswordExists(SqlConnection connection, string value)
    {
        bool result = false;

        string query = "select * from PasswordTable where value=@value";
        using (SqlCommand command = new SqlCommand(query, connection))
        {
            command.Parameters.AddWithValue("@value", value);
            SqlDataAdapter dataAdapter = new SqlDataAdapter();
            dataAdapter.SelectCommand = command;
            DataSet dataSet = new DataSet();
            dataAdapter.Fill(dataSet, "T1");
            if (dataSet.Tables["T1"].Rows.Count > 0)
            {
                Console.WriteLine("Password already exists in Database.");
                result = true;
            }
        }
        return result;
    }
}
jhdbpxl9

jhdbpxl91#

将数据库中的所有数据都存储在字典中,然后在字典中进行搜索,这是效率不高的。这是因为字典是在内存中实现的,5000万条记录是一个很大的数字。
你可以直接查询数据库来检查用户是否存在。2这允许你使用数据库的索引和优化功能来快速定位所需的记录。
为了提高性能,您可以考虑索引(但它也有缺点)。
可以使用高速缓存来将频繁访问的记录存储在存储器中。
但坦率地说,在不了解全部细节的情况下,这个问题没有完美的答案。

相关问题