SqlBulkCopy後のEntity Frameworkのパフォーマンス

entity-framework performance sqlbulkcopy sql-server

質問

私はいくつかのことをするためにいくつかのパフォーマンスが必要です。私はSQL ServerデータベースにExcelデータをインポートしようとしていますが、その作業を行うためのコードはありますが、実際にはそれには時間がかかります。あなたは私にそれのためにいくつかのアドバイスをくれますか?

   [WebMethod]
    public static string VerileriAktar(string alanlar, string gruplar, string shit)
    {
        ArtiDBEntities entity = new ArtiDBEntities();
        string[] eslesmeler = alanlar.Split(',');
        string[] grplar = gruplar.Split(',');

        DataSet ds = (DataSet)HttpContext.Current.Session["ExcelVerileri"];
        DataTable dt = ds.Tables["" + shit + ""];
        MembershipUser gelen = (MembershipUser)HttpContext.Current.Session["kimo"];
        Guid aa = (Guid)gelen.ProviderUserKey;


        List<tbl_AltMusteriler> bulkliste = new List<tbl_AltMusteriler>();
        List<tbl_AltMusteriler> ilkkontrol = entity.tbl_AltMusteriler.Where(o => o.UserId == aa).ToList();
        List<tbl_AltMusteriler> grupicin = new List<tbl_AltMusteriler>();
        List<tbl_OzelAlanlar> ensonatilacakalan = new List<tbl_OzelAlanlar>();
        List<tbl_OzelTarihler> ensonalicaktarih = new List<tbl_OzelTarihler>();

        // Datatable mın Kolon isimlerini değiştirdim.
        foreach (string item_col_name in eslesmeler)
        {
            string alan = item_col_name.Split('=')[0].Split('_')[1];
            string degisecek = item_col_name.Split('=')[1];
            if (degisecek == "")
                continue;
            dt.Columns[degisecek].ColumnName = alan;
        }



        #region verilerde

        foreach (DataRow dr in dt.Rows)
        {

            tbl_AltMusteriler yeni = new tbl_AltMusteriler();


            foreach (DataColumn dtclm in dt.Columns)
            {
                string gsm1 = "";
                if (dtclm.ColumnName == "gsm1")
                    gsm1 = dr["gsm1"].ToString();

                string gsm2 = "";
                if (dtclm.ColumnName == "gsm2")
                    gsm2 = dr["gsm2"].ToString();
                string ad = "";
                if (dtclm.ColumnName == "ad")
                    ad = dr["ad"].ToString();
                string soyad = "";
                if (dtclm.ColumnName == "soyad")
                    soyad = dr["soyad"].ToString();

                if (gsm1 != "")
                {
                    if (Tools.isNumber(gsm1) == false)
                        continue;
                    else
                    {
                        if (gsm1.Length > 10)
                            gsm1 = gsm1.Substring(1, 10);
                        yeni.Gsm1 = gsm1;

                    }
                }

                if (gsm2 != "")
                {
                    if (Tools.isNumber(gsm2) == false)
                        continue;
                    else
                    {
                        if (gsm2.Length > 10)
                            gsm2 = gsm2.Substring(1, 10);
                        yeni.Gsm2 = gsm2;
                    }
                }

                if (ad != "")
                    yeni.Ad = ad;
                if (soyad != "")
                    yeni.Soyad = soyad;
            }

            yeni.UserId = new Guid(aa.ToString());

            if (yeni.Gsm1 != "")
                grupicin.Add(yeni);               

        }
        #endregion



        bulkliste = grupicin.GroupBy(cust => cust.Gsm1).Select(grp => grp.First()).ToList();          

        List<tbl_AltMusteriler> yokartikin = bulkliste.Where(o => !ilkkontrol.Any(p => o.Gsm1 == p.Gsm1)).ToList();

        int saybakim = yokartikin.Count();

        DataTable bulkdt = new DataTable();
        if (yokartikin.Count > 0)
        {
            Type listType = yokartikin.ElementAt(0).GetType();             
            PropertyInfo[] properties = listType.GetProperties();
            foreach (PropertyInfo property in properties)
                if (property.Name == "UserId")
                    bulkdt.Columns.Add(new DataColumn() { ColumnName = property.Name, DataType = typeof(Guid) });
                else
                    bulkdt.Columns.Add(new DataColumn() { ColumnName = property.Name });
            foreach (object itembulk in yokartikin)
            {
                DataRow drbk = bulkdt.NewRow();
                foreach (DataColumn col in bulkdt.Columns)
                    drbk[col] = listType.GetProperty(col.ColumnName).GetValue(itembulk, null);
                bulkdt.Rows.Add(drbk);
            }
        }


        //var rowsOnlyInDt1 = bulkdt.AsEnumerable().Where(r => !bulkdt44.AsEnumerable()
        //        .Any(r2 => r["gsm1"].ToString() == r2["gsm1"].ToString()));

        //DataTable result = rowsOnlyInDt1.CopyToDataTable();//The third table

        if (bulkdt.Rows.Count > 0)
        {
            using (var connection = new SqlConnection(ConfigurationManager.ConnectionStrings["ArtiDBMemberShip"].ConnectionString))
            {
                SqlTransaction transaction = null;
                connection.Open();
                try
                {
                    transaction = connection.BeginTransaction();
                    using (var sqlBulkCopy = new SqlBulkCopy(connection, SqlBulkCopyOptions.TableLock, transaction))
                    {
                        sqlBulkCopy.BulkCopyTimeout = 240;
                        sqlBulkCopy.DestinationTableName = "tbl_AltMusteriler";
                        sqlBulkCopy.ColumnMappings.Add("UserId", "UserId");
                        sqlBulkCopy.ColumnMappings.Add("Ad", "Ad");
                        sqlBulkCopy.ColumnMappings.Add("Soyad", "Soyad");
                        sqlBulkCopy.ColumnMappings.Add("Adres", "Adres");
                        sqlBulkCopy.ColumnMappings.Add("Gsm1", "Gsm1");
                        sqlBulkCopy.ColumnMappings.Add("Gsm2", "Gsm2");
                        sqlBulkCopy.ColumnMappings.Add("Faks", "Faks");
                        sqlBulkCopy.ColumnMappings.Add("Telefonis", "Telefonis");
                        sqlBulkCopy.ColumnMappings.Add("Telefonev", "Telefonev");
                        sqlBulkCopy.ColumnMappings.Add("Eposta", "Eposta");
                        sqlBulkCopy.ColumnMappings.Add("DogumTarihi", "DogumTarihi");
                        sqlBulkCopy.ColumnMappings.Add("EvlilikTar", "EvlilikTar");
                        sqlBulkCopy.ColumnMappings.Add("TcNo", "TcNo");
                        //sqlBulkCopy.ColumnMappings.Add("Deleted", "Deleted");
                        sqlBulkCopy.WriteToServer(bulkdt);

                    }
                    transaction.Commit();
                }
                catch (Exception)
                {
                    transaction.Rollback();
                }

            }

            entity.SaveChanges();
        }

        if (grplar.Length > 0)
        {
            List<tbl_AltMusteriler> guncelliste = entity.tbl_AltMusteriler.Where(o => o.UserId == aa).ToList();
            List<tbl_KisiGrup> kisigruplari = new List<tbl_KisiGrup>();
            foreach (tbl_AltMusteriler itemblkliste in bulkliste)
            {
                long AltMusteriIDsi = guncelliste.Where(o => o.Gsm1 == itemblkliste.Gsm1).FirstOrDefault().AltMusteriID;

                // Seçili Gruplara kişileri ekleme
                #region Gruplara ekleme


                if (grplar.Length > 0)
                {
                    foreach (string item_gruplar in grplar)
                    {
                        if (item_gruplar == "chkall")
                            continue;
                        if (item_gruplar == "")
                            continue;
                        if (item_gruplar == null)
                            continue;

                        tbl_KisiGrup yeni_kisi_grup = new tbl_KisiGrup()
                        {
                            AltMusteriID = AltMusteriIDsi,
                            GrupID = int.Parse(item_gruplar)
                        };
                        kisigruplari.Add(yeni_kisi_grup);
                    }
                }
                #endregion
            }

            List<tbl_KisiGrup> guncel_grup = entity.tbl_KisiGrup.Where(o => o.tbl_AltMusteriler.UserId == aa).ToList();

            List<tbl_KisiGrup> kisi_grup_kaydet = kisigruplari.Where(o => !guncel_grup.Any(p => o.AltMusteriID == p.AltMusteriID && o.GrupID == p.GrupID)).ToList();

            // Grupları Datatable çevirme
            #region Grupları Datatable le çevirme
            DataTable bulkdt2 = new DataTable();



            if (kisi_grup_kaydet.Count > 0)
            {
                Type listType = kisi_grup_kaydet.ElementAt(0).GetType();
                //Get element properties and add datatable columns  
                PropertyInfo[] properties = listType.GetProperties();
                foreach (PropertyInfo property in properties)
                    bulkdt2.Columns.Add(new DataColumn() { ColumnName = property.Name });
                foreach (object itembulk in kisi_grup_kaydet)
                {
                    DataRow drbk = bulkdt2.NewRow();
                    foreach (DataColumn col in bulkdt2.Columns)
                        drbk[col] = listType.GetProperty(col.ColumnName).GetValue(itembulk, null);
                    bulkdt2.Rows.Add(drbk);
                }
            }
            #endregion


            //Burada bulk insert işlemini gerçekleştiriyoruz...
            #region Grup Verileri BulkCopy ile birkerede yazdık

            using (var connection = new SqlConnection(ConfigurationManager.ConnectionStrings["ArtiDBMemberShip"].ConnectionString))
            {
                SqlTransaction transaction = null;
                connection.Open();
                try
                {
                    transaction = connection.BeginTransaction();
                    using (var sqlBulkCopy = new SqlBulkCopy(connection, SqlBulkCopyOptions.TableLock, transaction))
                    {
                        sqlBulkCopy.BulkCopyTimeout = 240;
                        sqlBulkCopy.DestinationTableName = "tbl_KisiGrup";
                        sqlBulkCopy.ColumnMappings.Add("AltMusteriID", "AltMusteriID");
                        sqlBulkCopy.ColumnMappings.Add("GrupID", "GrupID");
                        sqlBulkCopy.WriteToServer(bulkdt2);
                    }
                    transaction.Commit();
                }
                catch (Exception)
                {
                    transaction.Rollback();
                }

            }

            entity.SaveChanges();
            #endregion


        }

        return "ok";

    }

EDIT

実際にそのコードブロックには70.000以上の行データがある場合に時間がかかります

List<tbl_AltMusteriler> yokartikin = bulkliste.Where(o => !ilkkontrol.Any(p => o.Gsm1 == p.Gsm1)).ToList();

私の主な問題は、私がsqlbulkcopysqlbulkcopyデータを挿入している最中だとsqlbulkcopyます。その後、IDのIDを取得できませんでした。そのため、データを汎用リストに取得し、新しいIDを見つけてグループの新しいリストを作成しようとします。 sqlbulkcopy再度sqlbulkcopyします。これらは65.000行をインポートするのに約10分の時間がかかります

人気のある回答

あなたの質問は非常に広いです。私はEFのための読書のパフォーマンスを考慮する 。また、データベースからクライアントにすべてのデータを取り込むため、EFは実際には一括操作用ではないことに注意してください。これは、クライアント上で処理する必要がない/したくない場合に、多くのエンティティに対してこれを実行したい場合、オーバーヘッドが大きくなります。 (私は実際にあなたのコードを調べていないことに注意してください - それはあまりにも多いです)



ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ