如何通过数千条记录更快地选择指纹?

时间:2018-08-07 03:33:14

标签: c# sql-server tsql biometrics

这是我第一次来这里,只是想问一些我似乎找不到答案的问题。基本上,我创建了一个系统,该系统可以接受人的指纹并将其登录到系统中。但是随着时间的流逝,我有成千上万的记录,并且指纹搜索比以前慢得多。

我所做的基本过程是,从表中选择所有生物识别数据,并在代码中使用 foreach循环逐一进行指纹模板比较教直到找到合适的人。

您能提供一些提示以使我的选择更快吗?任何帮助将不胜感激。

using (conn = new SqlConnection(connString)) {
    conn.Open();
     using (comm = new SqlCommand("EXEC dbn.sp_opd_selectBiometrics", conn)) {
        using (adap = new SqlDataAdapter(comm)) {
           using (dt = new DataTable()) {
                adap.Fill(dt);
                  if (dt.Rows.Count > 0) {
                    foreach (DataRow dr in dt.Rows) {
                     //Deserialize fingerprint template to bytes for verification
                       try {
                          byte[] _img = (byte[])dr["biometrics"];
                          string byteBiometrics = Encoding.UTF8.GetString(_img, 0, _img.Length);
                          getHcode = (string)dr["hpercode"];
                          MemoryStream ms = new MemoryStream(_img);

                           Template = new DPFP.Template();
                           Template.DeSerialize(ms);
                           Verificator = new DPFP.Verification.Verification();
// more code here...
       }
      }
    }
  }
}

1 个答案:

答案 0 :(得分:2)

按文本搜索通常很慢,如果文本很大且数据很大,则搜索速度会变慢。我怀疑在比较纯.net解决方案的情况下,您会在T-SQL的上下文中得到更好的解决方案。

步骤如下:

  1. 更改表并添加bio-metrics-hash
  2. 在此列上创建非聚集索引
  3. 使用所有生物识别数据创建字符串,计算该值的哈希值,并为当前记录填充新列(更新数据)
  4. 创建/更新新记录时,会自动计算相应的哈希值

您可以开始搜索了。

在您的应用程序中,使用输入参数bio-metrics-data调用存储过程。在该过程中,计算了该值的哈希值,并且仅按哈希值执行搜索。

请注意,根据您的生物识别数据大小,您可能需要使用不同的方法,但是想法是相同的。

在SQL Server 2016 +中,HASHBYTES函数允许最大值作为参数。