[免责声明]:目前我们正在运行较旧的SQL Server 2000,但我们可能会在未来6个月内更新到SQL Server 2008.
在我们的制造环境中,我有一段很长的C#代码来确定以下内容:
哪个员工“拥有”该产品(定义为第一个使用该产品的员工),
该产品的最终Test_Result
位于压力测试工作站,
该产品的第一个Test_Result
位于真空测试站。
所有Test_Result
值(存储在字符串值中)都包含在从旧的Microsoft Excel电子表格演变而来的平面文件表中。数据库结构可以不轻松修改,因为公司机器和供应商机器都会向它们写入数据。
每隔一个月左右,管理层会运行一份报告,显示每个员工拥有的产品数量,第一次压力测试是否成功,以及最终 < strong>真空测试取得了成功。
我目前使用SQL
来自C#
代码的SELECT DISTINCT Serial_Number WHERE Date_Time BETWEEN @Date1 AND @Date2
来电的所有技巧都是:
Serial_Number
在一个月的时间内,我们可以记录1500到3500种不同的产品Serial_Number
值。
对于每个Product
,我创建了一个自定义PressureEmployee
类的实例,其中包含VacuumEmployee
和NULL
,两者都初始化为Product
。< / p>
Date_Time
个实例,我选择所有数据并按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"));
}
}
}
}
字段排序,以确定哪个员工首先对产品执行了测试操作。SQL的类似于以下准代码:
Serial_Number
实际上还有更多内容,但它应该得到一般性的想法。
我想要做的是创建一个可以驻留在服务器上的视图,该视图只包含每个Pressure_Test
,Pressure_Test
结果,Vacuum_Test
日期,结果Vacuum_Test
和Cursor = Cursors.WaitCursor
日期。
如果我的想法是正确的,那么在服务器上的工作就会减少,因为它会始终保持这个视图。此外,视图应该执行得更快......对吗?
那么,我该怎么写这样的观点?
如果速度不快,有没有办法在查询运行时获取状态?显示{{1}} 40分钟并不会对我的申请充满信心。
答案 0 :(得分:2)
不是 - 默认情况下,SQL Server不会对维护视图 - 视图只是将包含在查询中的SQL语句片段。这里没有性能提升.....
您可以调查确实“维护”的索引视图,因为它们的数据值存储在磁盘上 - 就像表一样。
他们有很长的要求和限制清单 - 但是如果你匹配那些,这可能会快得多 - 以使用更多磁盘空间为代价。你在这里得不到任何免费午餐......
答案 1 :(得分:1)
如果要传递参数,存储过程可能比视图更好。
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,你将使用sqlcommand)。