如果一个数据表里边有几十条记录,而且你又没有做分区表的话,那么每次执行Insert操作之前如果都要Select Count(*) 后边加上条件的话,我想会是一场灾难。
之前我就是这么处理的。今天跟我们班的一个品学兼优的同学请教这个问题,他跟我说了一个办法,就是这样。
if exists (select * from tableName where conditions) select '1' else select '0'
打算晚上的时候写个Demo检测一下时间 试试看这个性能有没有什么提升,我会后续再更新博客!
昨晚的时候写了一个Demo试了一下这两个方案的效率方案A是传统的使用方法 方案B是别人给出的建议。
方案A:
if (Txt_WJLJ.Text.Trim() == "")
{
MessageBox.Show("文件路径不能为空!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
else
{
DateTime dt_Start = DateTime.Now;//开始时间
SqlConnection conn = new SqlConnection("");
try
{
conn.Open();
DataSet ds_Data = ReturnDataset_CXDR(this.Txt_WJLJ.Text.Trim());
DataTable dt = ds_Data.Tables[0];
string str_QYDM = string.Empty;
string str_CBRQ = string.Empty;//抄表日期
string str_ZZBM = string.Empty;//住宅编码
string str_S1YQS = string.Empty;//上1月起数
string str_S1YZS = string.Empty;//上1月止数
string str_S1YCSDL = string.Empty;//上1月差数电量
string str_S2YQS = string.Empty;//上2月起数
string str_S2YZS = string.Empty;//上2月止数
string str_S2YCSDL = string.Empty;//上2月差数电量
string str_SYDL = string.Empty;//上月电量
string str_LJYDL = string.Empty;//累计用电量
string str_YHMC = string.Empty;
string str_YHDZ = string.Empty;//用户地址
this.Rtb_Log.Text += "[开始时间:]"+ DateTime.Now.ToString()+"\r\n";
//DateTime dt_Start = DateTime.Now;//开始时间
SqlCommand cmd_Query = new SqlCommand();
cmd_Query.Connection = conn;
string str_dt = string.Empty;
for (int i = 0; i < 250; i++)
{
str_YHDZ = dt.Rows[i][1].ToString().Trim();
str_QYDM = dt.Rows[i][0].ToString().Trim();
str_CBRQ = dt.Rows[i][3].ToString().Trim();
str_ZZBM = dt.Rows[i][4].ToString().Trim();
str_S1YQS = dt.Rows[i][5].ToString().Trim();
str_S1YZS = dt.Rows[i][6].ToString().Trim();
str_S1YCSDL = dt.Rows[i][7].ToString().Trim();
str_S2YQS = dt.Rows[i][8].ToString().Trim();
str_S2YZS = dt.Rows[i][9].ToString().Trim();
str_S2YCSDL = dt.Rows[i][10].ToString().Trim();
str_SYDL = dt.Rows[i][11].ToString().Trim();
str_LJYDL = dt.Rows[i][12].ToString().Trim();
str_YHMC = dt.Rows[i][13].ToString().Trim();
if (str_CBRQ != "00/00/00 00:00" && IsDateTime(str_CBRQ)==true)
{
str_dt = Convert.ToDateTime(str_CBRQ).AddMonths(-1).ToString("yyyyMM");
cmd_Query.CommandText = "SELECT COUNT(*) FROM DLXXB WHERE MPH ='"+ str_YHDZ+"' AND QYDM = '"+ str_QYDM+"' AND convert(nvarchar(6),RQ,112)='"+str_dt +"'";
cmd_Query.ExecuteScalar();
}
}
DateTime dt_End = DateTime.Now;
System.TimeSpan ts = dt_End.Subtract(dt_Start);
this.Rtb_Log.Text += "[结束时间:]"+ DateTime.Now.ToString()+"\r\n累计耗时:"+ts.Minutes+"分钟" +ts.Seconds.ToString()+"秒";
MessageBox.Show("查询完成!","提示",MessageBoxButtons.OK,MessageBoxIcon.Information);
return;
}
catch (Exception ex)
{
throw ex;
}
finally
{
conn.Close();
}
}
方案B:
if (Txt_WJLJ.Text.Trim() == "")
{
MessageBox.Show("文件路径不能为空!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
else
{
SqlConnection conn = new SqlConnection("");
try
{
conn.Open();
DataSet ds_Data = ReturnDataset_CXDR(this.Txt_WJLJ.Text.Trim());
DataTable dt = ds_Data.Tables[0];
string str_QYDM = string.Empty;
string str_CBRQ = string.Empty;//抄表日期
string str_ZZBM = string.Empty;//住宅编码
string str_S1YQS = string.Empty;//上1月起数
string str_S1YZS = string.Empty;//上1月止数
string str_S1YCSDL = string.Empty;//上1月差数电量
string str_S2YQS = string.Empty;//上2月起数
string str_S2YZS = string.Empty;//上2月止数
string str_S2YCSDL = string.Empty;//上2月差数电量
string str_SYDL = string.Empty;//上月电量
string str_LJYDL = string.Empty;//累计用电量
string str_YHMC = string.Empty;
string str_YHDZ = string.Empty;//用户地址
this.Rtb_Log.Text += "[开始时间:]" + DateTime.Now.ToString() + "\r\n";
DateTime dt_Start = DateTime.Now;//开始时间
SqlCommand cmd_Query = new SqlCommand();
cmd_Query.Connection = conn;
string str_dt = string.Empty;
for (int i = 0; i < 250; i++)
{
str_YHDZ = dt.Rows[i][1].ToString().Trim();
str_QYDM = dt.Rows[i][0].ToString().Trim();
str_CBRQ = dt.Rows[i][3].ToString().Trim();
str_ZZBM = dt.Rows[i][4].ToString().Trim();
str_S1YQS = dt.Rows[i][5].ToString().Trim();
str_S1YZS = dt.Rows[i][6].ToString().Trim();
str_S1YCSDL = dt.Rows[i][7].ToString().Trim();
str_S2YQS = dt.Rows[i][8].ToString().Trim();
str_S2YZS = dt.Rows[i][9].ToString().Trim();
str_S2YCSDL = dt.Rows[i][10].ToString().Trim();
str_SYDL = dt.Rows[i][11].ToString().Trim();
str_LJYDL = dt.Rows[i][12].ToString().Trim();
str_YHMC = dt.Rows[i][13].ToString().Trim();
if (str_CBRQ != "00/00/00 00:00" && IsDateTime(str_CBRQ)==true)
{
str_dt = Convert.ToDateTime(str_CBRQ).AddMonths(-1).ToString("yyyyMM");
//cmd_Query.CommandText = "SELECT COUNT(*) FROM DLXXB WHERE MPH ='"+ str_YHDZ+"' AND QYDM = '"+ str_QYDM+"' AND convert(nvarchar(6),RQ,112)='"+str_dt +"'";
cmd_Query.CommandText = "if exists (select * from DLXXB WHERE MPH ='" + str_YHDZ + "' AND QYDM = '" + str_QYDM + "' AND convert(nvarchar(6),RQ,112)='" + str_dt + "') select '1' else select '0'";
cmd_Query.ExecuteScalar();
}
}
DateTime dt_End = DateTime.Now;
System.TimeSpan ts = dt_End.Subtract(dt_Start);
this.Rtb_Log.Text += "[结束时间:]" + DateTime.Now.ToString() + "\r\n累计耗时:"+ts.Minutes+"分钟" + ts.Seconds.ToString()+"秒";
MessageBox.Show("查询完成!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
catch (Exception ex)
{
throw ex;
}
finally
{
conn.Close();
}
}
同样执行前250行:
行数:4339
[开始时间:]2016/6/17 8:11:57
[结束时间:]2016/6/17 8:12:39
累计耗时:0分钟42秒
[开始时间:]2016/6/17 8:12:48
[结束时间:]2016/6/17 8:13:31
累计耗时:0分钟43秒
感觉并没有什么显著的区别 还有更好的方法么?