免责声明:目前我们正在运行较旧的Server 2000,但我们可以在今后6个月左右更新到Server 2008。
在我们的制造环境中,我有一段非常长的C#代码来确定以下内容:
Test_Result是在压力测试站,以及Test_Result是在真空测试站。所有Test_Result值(存储在字符串值中)都包含在从旧的Microsoft电子表格演变而来的平面文件表中。数据库结构可以很容易地修改,而不是,因为公司机器和供应商机器都会向它们写入数据。
每个月左右,管理层都会发布一份报告,显示每个员工拥有多少产品,如果第一次压力测试成功了,以及最终的真空测试是否成功的话。
目前,我的技术都是用来自SQL代码的C#调用实现的:
SELECT DISTINCT Serial_Number WHERE Date_Time BETWEEN @Date1 AND @Date2在一个月的时间里,我们可以记录1500到3500种不同的产品Serial_Number值。
对于每个Serial_Number,我创建一个自定义Product类的实例,其中包含一个PressureEmployee和一个VacuumEmployee,它们都初始化为NULL。
Product实例,我选择Date_Time字段中的所有数据和顺序,以确定哪个雇员首先在产品上执行测试操作。这方面的SQL类似于以下准代码:
string sqlText = "SELECT Date_Time, Employee, System_ID, Test_Result " +
"FROM Production " +
"WHERE Serial_Number=@SN ORDER BY Date_Time";
using (SqlCommand cmd = new SqlCommand(sqlText, new SqlConnection(connStr))) {
cmd.Parameters.Add("@SN", SqlDbType.NVarChar, 20);
cmd.Connection.Open();
foreach (var item in productList) {
cmd.Parameters["@SN"].Value = item;
SqlDataReader r = cmd.ExecuteReader();
while (r.Read()) {
string systemId = r["System_ID"].ToString();
string testResult = r["Test_Result"].ToString();
if (-1 < systemId.IndexOf("pressure")) {
if (String.IsNullOrEmpty(item.PressureEmployee)) {
item.PressureEmployee = r["Employee"].ToString();
}
// check that product ever passes
if (-1 < testResult.IndexOf("pass")) {
item.VacuumPass = true;
}
}
if ((-1 < systemId.IndexOf("vacuum")) &&
String.IsNullOrEmpty(item.VacuumEmployee)) {
item.VacuumEmployee = r["Employee"].ToString();
// product passes 1st time
item.VacuumPass = (-1 < testResult.IndexOf("pass"));
}
}
}
}其实还有很多更多的东西,但是它应该能让大家都明白。
我想要做的是创建一个可以驻留在服务器上的视图,该视图只包含每个Serial_Number、Pressure_Test结果、Pressure_Test日期、Vacuum_Test结果和Vacuum_Test日期的列表。
如果我的想法是正确的,这将减少服务器上的工作,因为它将始终维护此视图。此外,视图应该更快地执行...right吗?
那么,我怎么写这样的观点呢?
如果它不能更快,那么在查询运行时是否有任何方法获取查询的状态?显示Cursor = Cursors.WaitCursor 40分钟并不会给我的应用程序带来很大的信心。
发布于 2011-08-15 20:50:05
并不是真正的-默认情况下,视图不是由Server维护的-视图只是将合并到查询中的SQL语句片段。在这里没有任何表现..。
您可以研究索引视图,这些视图确实是“维护”的,因为它们的数据值存储在磁盘上,就像表一样。
他们有一长串的要求和限制--但如果你与之相匹配,这可能会更快一些--代价是使用更多的磁盘空间。你在这里也没有免费的午餐。
发布于 2011-08-15 20:58:46
如果要传递参数,则存储过程可能比视图提供的服务更好。
CREATE PROCEDURE dbo.myProc
(@SN int)
AS
BEGIN
SELECT
Date_Time,
Employee,
System_ID,
Test_Result,
CASE WHEN CHARINDEX('Pressure', System_ID) > 0 THEN Employee ELSE '' END as PressureEmployee,
CASE WHEN CHARINDEX('pass', Test_Result) > 0 THEN 1 ELSE 0 END as VacuumPass
FROM Production
WHERE Serial_Number = @SN
ORDER BY Date_Time
END您的C#可以很好地处理这个问题(而不是sqltext,您将使用‘ll命令)。
https://stackoverflow.com/questions/7070560
复制相似问题