苏飞论坛

标题: 请教怎么优化我的数据库查询模块? [打印本页]

作者: Yxrwendao    时间: 2013-3-31 17:28
标题: 请教怎么优化我的数据库查询模块?
       请教一下,我遍历access数据库中点表共9W多个坐标数据,然后用它们计算是否在给定的范围中,再用在范围中的点在线表中获取到包含它们的线的名称,用了1分30秒,我感觉用了好长时间。因为我还要用我查询到的数据生成一个数据库,如果范围再大点,就更费时间了,请指点一下怎么提高效率?

/// <summary>
        /// 获取所有含指定管线点名的管线标识码
        /// </summary>
        /// <param name="connection">一个打开连接的数据库</param>
        /// <param name="pesName">管线点名</param>
        /// <param name="pesStyleName">管类名</param>
        /// <param name="pointTableHz">管线点表后缀名称</param>
        /// <param name="lineTableHz">管线线表后缀名称</param>
        /// <param name="indexName">标识码字段名称</param>
        /// <param name="startCodeName">管线起点名字段名称</param>
        /// <param name="endCodeName">管线终点名字段名称</param>
        /// <param name="pesPointCodeName">管线点字段名称</param>
        /// <returns>返回所有包含指定管线点名的管线标识码</returns>
        public static int[] GetPesLineIndexFromPesPointNames(OleDbConnection connection, string pesName, string pesStyleName, string pointTableHz, string lineTableHz,
                                                              string indexName, string startCodeName, string endCodeName, string pesPointCodeName)
        {
            //创建所有起点或终点包含指定管线点的线选择集语句
            string lineSqlStr = "select " + indexName + " from " + pesStyleName + lineTableHz + " where " + startCodeName + "='" + pesName + "' union all " +
                                "select " + indexName + " from " + pesStyleName + lineTableHz + " where " + endCodeName + "='" + pesName + "'" ;

            OleDbCommand command = new OleDbCommand(lineSqlStr, connection);
             OleDbDataReader oledDbDrLine = command.ExecuteReader();
             List<int> indexLst = new List<int>();
            while (oledDbDrLine.Read())
            {
                indexLst.Add(Convert.ToInt32(oledDbDrLine[indexName].ToString()));
            }
            oledDbDrLine.Close();
            return indexLst.ToArray();
        }





作者: 站长苏飞    时间: 2013-4-1 10:34
[code=csharp]    string lineSqlStr = "select " + indexName + " from " + pesStyleName + lineTableHz + " where " + startCodeName + "='" + pesName + "' union all " +
                                "select " + indexName + " from " + pesStyleName + lineTableHz + " where " + endCodeName + "='" + pesName + "'" ;[/code]

楼主这种写法看上去基本没有什么问题,查询时主要是使用了条件endCodeName ,startCodeName字段,是不是可以直接写成一条
where endCodeName =pesNa and  startCodeName=pesNa 另外,在处理一下这两个字段的索引,相信速度应该能提到5秒以内的。



作者: Yxrwendao    时间: 2013-4-2 15:37
站长苏飞 发表于 2013-4-1 10:34
楼主这种写法看上去基本没有什么问题,查询时主要是使用了条件endCodeName ,startCodeName字段,是不是 ...

不能用and 因为endCodeName ,startCodeName的值不可能同时出现在一条数据中。我一直不知道怎么运用索引,请教怎么运用!
作者: 站长苏飞    时间: 2013-4-2 15:41
Yxrwendao 发表于 2013-4-2 15:37
不能用and 因为endCodeName ,startCodeName的值不可能同时出现在一条数据中。我一直不知道怎么运用索引, ...

http://www.sufeinet.com/thread-419-1-1.html
这是一个说明,具体的用法,你查查资料就行了,或者是直接看我的Sql教程里面也有相关代码。




欢迎光临 苏飞论坛 (http://www.sufeinet.com/) Powered by Discuz! X3.4