我们有一个使用电子表格的系统,但表格的标准搜索功能非常低,所以我的任务是尝试为用户创建更好的方法。
好的,当前数据库格式的一些背景:
Table1
------
FormID
FormName
Creator
CreateDate
Table2
------
FormID
FormControlName
ControlData
这种关系是一对多的关系,一个表单上有很多控件。
我的任务是创建一个搜索,通过搜索表单名称(基于数据的更改)和属于该表单的每个表单控件来查找相关表单。
我已经设法使用 C# 编码来做到这一点,但是因为数据库中有大量记录,而且在我当前的解决方案中我正在检索所有内容并迭代它以找到相关项目,这是一个相当缓慢的解决方案.
我的代码:
private DataTable GetForms() {
string FormName = ddForm.SelectedValue;
string SearchText = tbSearch.Text;
List<string> FormIDs = GetMatchingForms(FormName, SearchText);
DataTable dtForms = new DataTable("Forms Table");
dtForms.Columns.Add("Form Name");
dtForms.Columns.Add("Initiator");
dtForms.Columns.Add("Start Date").DataType = typeof(DateTime);
dtForms.Columns.Add("FormLink");
foreach (string FormID in FormIDs) {
DataRow nRow = dtForms.NewRow();
nRow[0] = GetData.GetString("SELECT [FormName] FROM [Table1] Where [FormID] = '" + FormID + "'", conString);
string UserID = GetData.GetString("SELECT [Creator] FROM [Table1] Where [FormID] = '" + FormID + "'", conString);
string UserName = GetData.GetString("Select [UserName] From [User] Where [UserID] = '" + UserID + "'", conString);
nRow[1] = UserName;
nRow[2] = GetData.GetString("SELECT [CreateDate] FROM [Table1] Where [FormID] = '" + FormID + "'", conString);
nRow[3] = "~/Form.aspx?formid=" + FormID;
dtForms.Rows.Add(nRow);
}
return dtForms;
}
private List<string> GetMatchingForms(string FormName, string SearchText) {
//FormName can be = % to search all forms
DataTable dtForms = GetData.GetDT("SELECT * FROM [Table1] Where [FormName] LIKE '%" + FormName + "%'", conString);
List<string> FormList = new List<string>();
foreach (DataRow row in dtForms.Rows) {
string FormName = row["FormName"].ToString();
string FormID = row["FormID"].ToString();
bool Relevant = false;
if (FormName.Contains(SearchText)) {
Relevant = true;
} else {
DataTable dtFormControls = GetData.GetDT("SELECT * FROM [Table2] Where [FormID] = '" + FormID + "'", conString);
foreach (DataRow cRow in dtFormControls.Rows) {
string ControlData = cRow["ControlData"].ToString();
if (ControlData.Contains(SearchText)) {
Relevant = true;
break;
}
}
}
if (Relevant) {
FormList.Add(FormID);
}
}
return FormList;
}
我想知道是否可以将上述代码的功能复制到 SQL 查询(或少量查询)中,以希望尝试加速当前的解决方案。我目前对 SQL 查询的了解并不是最好的,我什至想不出从哪里开始考虑这个问题。
澄清一下,我们目前有 300,000 个表格和总共 1040 万条数据记录,该数据库最近已重新索引,这似乎确实对性能产生了积极影响。我们计划相对较快地对此进行维护,但我们仍将保留当前存储的大部分数据。
编辑:有问题的数据库是第 3 方软件的一部分,我们仅限于只读访问,我们无法修改数据库。
从记录的数量可以看出,时间问题是一个很大的问题,因为执行当前代码实际上需要几分钟。
任何帮助将不胜感激,谢谢。