参数化查询速度慢的原因及分析

测试环境:sql2005 + .NET2.0

同样的SQL语句,参数化查询和SQL语句直接执行的速度对比。数据库中存放的字段类型是varchar

结论:

1.对参数要设置正确的  DbType(varchar = AnsiString, nvarchar=String,char=AnsiStringFixedLength,nchar=StringFixedLength)

2.尽量使用数据库类型对应的DbType的。

3.尽量给参数的size设置大小

Code:

class Program
    {
        private delegate void Action();

        static void Main(string[] args)
        {
            while (true)
            {
                ExecuteDataSetWithParam(false);
                ExecuteDataSetWithParam(true);
                ExecuteDataSetWithParamAnsiString(false);
                ExecuteDataSetWithParamAnsiString(true);
                ExecuteDataSetWithParamSqlDbType(false);
                ExecuteDataSetWithParamSqlDbType(true);

                ExecuteDataSetNoneParam();
                Console.ReadLine();
            }

        }

        private static void ExecuteDataSetWithParam(bool len)
        {
            #region Sql
            string sql = @"";
            #endregion
            List<IDataParameter> paras = new List<IDataParameter>();

            paras.Add(new System.Data.SqlClient.SqlParameter("@Deleted", DbType.String) { Value = "0" });
            if (len)
                foreach (SqlParameter v in paras)
                {
                    v.Size = v.Value.ToString().Length;
                }
            Invoke(delegate { ExecuteDataSet(sql, paras); }, "参数化查询" + (len ? " 指定长度" : string.Empty));
        }

        private static void ExecuteDataSetWithParamAnsiString(bool len)
        {
            #region Sql
            string sql = @"";
            #endregion
            List<IDataParameter> paras = new List<IDataParameter>();

            paras.Add(new System.Data.SqlClient.SqlParameter("@Deleted", DbType.AnsiString) { Value = "0" });
            if (len)
                foreach (SqlParameter v in paras)
                {
                    v.Size = v.Value.ToString().Length;
                }
            Invoke(delegate { ExecuteDataSet(sql, paras); }, "参数化查询AnsiString" + (len ? " 指定长度" : string.Empty));
        }
        private static void ExecuteDataSetWithParamSqlDbType(bool len)
        {
            #region Sql
            string sql = @"";
            #endregion
            List<IDataParameter> paras = new List<IDataParameter>();

            paras.Add(new System.Data.SqlClient.SqlParameter("@Deleted", SqlDbType.VarChar) { Value = "0" });
            if (len)
                foreach (SqlParameter v in paras)
                {
                    v.Size = v.Value.ToString().Length;
                }
            Invoke(delegate { ExecuteDataSet(sql, paras); }, "参数化查询SqlDbType" + (len ? " 指定长度" : string.Empty));
        }

        private const string dbConnStr = "";
        private static void ExecuteDataSetNoneParam()
        {
            #region Sql
            string sql = @"‘
Order By
     RegisterDate desc";
            #endregion
            Invoke(delegate { ExecuteDataSet(sql, null); }, "SQL语句拼接");
        }

        private static void Invoke(Action action, string name)
        {
            try
            {
                var star = DateTime.Now;
                action.Invoke();
                var time = DateTime.Now - star;
                Console.WriteLine(name + " - TimeLost:" + time.ToString());
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }
        }

        private static void ExecuteDataSet(string sql, List<IDataParameter> AParas)
        {
            using (IDbConnection conn = new SqlConnection(dbConnStr))
            {
                using (System.Data.IDbCommand cmd = new SqlCommand(sql))
                {
                    cmd.Connection = conn;
                    AddParam(cmd, AParas);

                    System.Data.IDbDataAdapter adapt = new SqlDataAdapter(cmd as SqlCommand);

                    var ds = new DataSet();
                    adapt.Fill(ds);
                }
            }
        }

        private static void AddParam(IDbCommand cmd, List<IDataParameter> AParas)
        {
            if (AParas == null) return;
            foreach (var v in AParas)
            {
                cmd.Parameters.Add(v);
            }
        }
    }

参数化查询速度慢的原因及分析

时间: 2024-11-05 14:51:42

参数化查询速度慢的原因及分析的相关文章

SQL Server查询优化方法(查询速度慢的原因很多,常见如下几种) .

SQL Server查询优化方法(查询速度慢的原因很多,常见如下几种) 标签: sql server优化数据库服务器 2014-12-31 10:13 11988人阅读 评论(0) 收藏 举报 本文章已收录于: 今天看到一位博友的文章,觉得不错,转载一下,希望对大家有帮助,更多文章,请访问:http://blog.haoitsoft.com 1.没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) 2.I/O吞吐量小,形成了瓶颈效应. 3.没有创建计算列导致查询不优化. 4.内存

查询速度慢的原因很多,常见如下几种

1.没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) 2.I/O吞吐量小,形成了瓶颈效应. 3.没有 创建计算列导致查询不优化. 4.内存不足 5.网络速度慢 6.查询出的数据量过大(可以采用多次查询,其他的方法降低数据量) 7. 锁或者死锁(这也是查询慢最常见的问题,是程序设计的缺陷)sp_lock,sp_who,活动的用户查看,原因是读写竞争资源. 9.返回了不必 要的行和列 10.查询语句不好,没有优化 ●可以通过如下方法来优化查询 : 1. 把数据.日志.索引放到不同

SQL查询速度慢的原因

1.没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) 2.I/O吞吐量小,形成了瓶颈效应. 3.没有创建计算列导致查询不优化. 4.内存不足 5.网络速度慢 6.查询出的数据量过大(可以采用多次查询,其他的方法降低数据量) 7.锁或者死锁(这也是查询慢最常见的问题,是程序设计的缺陷) 8.sp_lock,sp_who,活动的用户查看,原因是读写竞争资源. 9.返回了不必要的行和列 10.查询语句不好,没有优化 ●可以通过如下方法来优化查询 : 1)把数据.日志.索引放到不同的

Oracle查询速度慢的原因总结

Oracle查询速度慢的原因总结 查询速度慢的原因很多,常见如下几种:1,没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷)2,I/O吞吐量小,形成了瓶颈效应.3,没有创建计算列导致查询不优化.4,内存不足5,网络速度慢6,查询出的数据量过大(可以采用多次查询,其他的方法降低数据量)7,锁或者死锁(这也是查询慢最常见的问题,是程序设计的缺陷)8,sp_lock,sp_who,活动的用户查看,原因是读写竞争资源.9,返回了不必要的行和列10,查询语句不好,没有优化可以通过如下方法

SQL Server数据库查询速度慢的原因和解决方法

问 SQL Server数据库查询速度慢的原因有很多,常见的有以下几种: 1.没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) 2.I/O吞吐量小,形成了瓶颈效应. 3.没有创建计算列导致查询不优化. 4.内存不足 5.网络速度慢 6.查询出的数据量过大(可以采用多次查询,其他的方法降低数据量) 7.锁或者死锁(这也是查询慢最常见的问题,是程序设计的缺陷) 8.sp_lock,sp_who,活动的用户查看,原因是读写竞争资源. 9.返回了不必要的行和列 10.查询语句不好,没

mysql查询速度慢的原因[整理版]

在以前的博客中陆续记录了有关查询效率方面的文章.今天在整理一下,写上自己的一些心得记录如下:常见查询慢的原因常见的话会有如下几种:1.没有索引或没有用到索引.PS:索引用来快速地寻找那些具有特定值的记录,所有MySQL索引都以B-树的形式保存.如果没有索引,执行查询时MySQL必须从第一个记录开始扫描整个表 的所有记录,直至找到符合要求的记录.表里面的记录数量越多,这个操作的代价就越高.如果作为搜索条件的列上已经创建了索引,MySQL无需扫描任何记录 即可迅速得到目标记录所在的位置.如果表有10

参数化查询速度慢

好累,加班到现在,但是其实你的负责的工作都已经做完了.可是还需要配合别人,只能等!!!  现在已经凌晨了... 工作分配不够好?个人不负责?时间规划不好? 不知道!!! 说入正题,这是问题原型: SQL 慢的: select * from MyTable where InputTime>'2015-05-09' SQL 快的: Declare @t datetime set @t='2015-05-09' select * from MyTable where InputTime>@t 第二条

数据提高查询速度的方法(摘抄)

处理百万级以上的数据提高查询速度的方法: 1.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描. 2.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 3.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:     select id from t where num is null     可以在num上设置默认值0,确保表中num列没有

处理百万级以上的数据提高查询速度的方法

处理百万级以上的数据提高查询速度的方法: 1.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描. 2.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 3.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:     select id from t where num is null     可以在num上设置默认值0,确保表中num列没有