電子フォームを使用するシステムがありますが、フォームの標準的な検索機能は非常に標準以下であるため、ユーザーにとってより良いアプローチを作成するように努めています。
わかりましたので、現在のデータベース形式の背景を少し説明します:
Table1
------
FormID
FormName
Creator
CreateDate
Table2
------
FormID
FormControlName
ControlData
この関係は 1 対多で、1 つのフォームに多数のコントロールがあります。
私の仕事は、フォーム名 (データに基づく変更) とそのフォームに属する各フォーム コントロールを検索して、関連するフォームを見つける検索を作成することです。
私は 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 のフォームと合計 1,040 万のデータ レコードがあり、データベースは最近再インデックス化されており、パフォーマンスにプラスの影響を与えているようです。これについては比較的近いうちにメンテナンスを行う予定ですが、現在保存されているデータの大部分は引き続き保持されます。
編集: 問題のデータベースはサードパーティ製ソフトウェアの一部であり、読み取り専用アクセスに制限されています。データベースの変更はできません。
レコードの数からわかるように、現在のコードを実行するのに文字通り数分かかるため、タイミングの問題が非常に大きいことがわかります。
どんな助けでも大歓迎ですありがとう。