• 线上用的sqlserver2005数据库,里面有一个表有400多万条数据,然后程序调用数据时显示超时(只有这一个表超时),aspx.cs中sql语句,sql语句是根据姓名随机查询前三五条,问问大家改怎么解决,求大神帮忙。...
  • SQLServer 事务超时测试

    2017-12-13 17:38:32
    2016-9-26 16:13:45 @hurySQLServer 事务超时测试1.当前查询超时设置exec sp_configure 'query wait (s)' 2.超时测试打开第1个窗口-- 建立临时表 CREATE TABLE t(id int); -- 开启事务 BEGIN TRANSACTION -- 写入...

    2016-9-26 16:13:45 @hury

    SQLServer 事务超时测试

    1.当前查询超时设置

    exec sp_configure 'query wait (s)' 

    这里写图片描述

    2.超时测试

    打开第1个窗口

    -- 建立临时表
    CREATE TABLE t(id int);
    -- 开启事务
    BEGIN TRANSACTION
    -- 写入测试数据
    INSERT INTO t values(1);

    打开第2个窗口

    -- 设定死锁超时(3秒)
    SET lock_timeout  3000;
    SELECT @@lock_timeout;
    -- 执行查询
    SELECT * FROM t;

    这里写图片描述

    打开第3个窗口:

    -- 查看锁等待情况
    SELECT * FROM sys.dm_os_waiting_tasks;
    -- 手工杀死会话 session_id
    -- 如果手工杀死会话,则第1个窗口将失去连接
    KILL 258
    
    -- 如果将第1个窗口事务提交,则第2窗口事务可以执行完成
    -- 或者等待锁超时时间
    
    -- 返回第1个窗口,提交事务
    COMMIT;

    小结:

    1、通过 sp_configure 设置的查询超时 query wait (s)’,是指当没有足够的内存运行查询时,大量占用内存的查询将排队等待。
    与 db2 中的 死锁超时概念不同。

    2、使用 set lock_timeout 指定语句等待锁释放的毫秒数。
    此设置仅对当前会话有效,非全局设置

    后续有时间,将oracle和db2的锁超时测试补充进来。

    参考:

    http://blog.csdn.net/u013419838/article/details/46634449

    展开全文
  • 经常会处理大批量千万级的数据,一直以来都没问题。最近在处理时确出来了经常超时,程序跑一段时间就得停下来重启服务器,根据几次的调整发现了问题的所在,产生这类问题主要是以下几点所导致: 1、数据库连接未...

    经常会处理大批量千万级的数据,一直以来都没问题。最近在处理时确出来了经常超时,程序跑一段时间就得停下来重启服务器,根据几次的调整发现了问题的所在,产生这类问题主要是以下几点所导致:

         1、数据库连接未关闭,大量操作数据库时,连接未关闭的话,会导致连接过多数据库卡死。
         2、检查数据库的超时时间设置过短。
         3、索引:数据库操作期间太多的索引导致产生很多碎片,清理和重新组织了下索引 。
         4、日志文件过大数据的操作时处理日志超时导致,删除或是压缩日志,把日志文件的增长降低。
     现在这种问题基本上是第3、4两种可能性比较大,但也不排除新手写程序时会出现第1种情况。
     这两天程序经常卡死一步步查找过来发现了最终问题所在,出的是第4种错误,其中也重新组织过索引,确实起到不小的作用,程序运行起来会快很多,但是时间长了还是会卡死,因此后来经查看日志以及压缩后该问题彻底解决。

    转载于:https://www.cnblogs.com/SZ2015/p/4642255.html

    展开全文
  • 转载:...  http://www.myexception.cn/sql-server/353508.html 用的ADO.Net entity frameWork,也是实体数据的访问方式,等到保存数据(database.SaveChanges())时候,居然一...

    转载:http://www.cnblogs.com/flyinghigher/archive/2010/08/12/1798008.html

       http://www.myexception.cn/sql-server/353508.html

    用的ADO.Net entity frameWork,也是实体数据的访问方式,等到保存数据(database.SaveChanges())时候,居然一小时没有写完,遂不解,仔细分析,按这样速度需要7个小时。于是换方式,用ADO.net 数据集方式进行,于是用数据集的update,也得三个小时的时间吧。

    接下来换sql语句的方式,每几万条数据的时候就执行一次sql的连接字符串,这里用到了stringBuilder,但是速度也是不敢恭维。

    第二天,发现了SqlBulkCopy,批量复制,还真是好用,具体用法请查MSDN,请注意设置它的超时时间BulkCopyTimeout属性,否则可是会超时的哦,不过千万级的数据还是会内存溢出的,这里我采用了分批进行复制的方法,即分两次或者三次把这些数据复制到不同的数据表中,最后用T -sql语句进行数据表的对拷。

    补充一下:最后用时不超过10分钟。

     

    利用.NET2005表中的一个类 SqlBulkCopy

    利用bcp的方式:


    private bool SqlBulkCopy(DataTable dt)
            {
                SqlConnection cnnSql = new SqlConnection("USER ID=sa;PASSWORD=;INITIAL CATALOG=test;DATA SOURCE=.;");
            
                cnnSql.Open();
                try
                {
                    startTime = DateTime.Now;
                    //数据批量导入sqlserver,创建实例    SqlBulkCopyOptions.UseInternalTransaction采用事务  复制失败自动回滚
                    System.Data.SqlClient.SqlBulkCopy sqlbulk = new System.Data.SqlClient.SqlBulkCopy(cnnSql);//, SqlBulkCopyOptions.UseInternalTransaction);
                    
                   // System.Data.SqlClient.SqlBulkCopy sqlbulk = new System.Data.SqlClient.SqlBulkCopy(System.Configuration.ConfigurationSettings.AppSettings["ConStr"], SqlBulkCopyOptions.UseInternalTransaction);
                    sqlbulk.SqlRowsCopied +=
                    new SqlRowsCopiedEventHandler(OnRowsCopied); //订阅复制完成后的方法,参数是 sqlbulk.NotifyAfter的值
                    sqlbulk.NotifyAfter = dt.Rows.Count;
    
                    //目标数据库表名
                    sqlbulk.DestinationTableName = "INVTDA";
                    //数据集字段索引与数据库字段索引映射
                    sqlbulk.ColumnMappings.Add(0, 0);
                    sqlbulk.ColumnMappings.Add(1, 1);
                    sqlbulk.ColumnMappings.Add(3, 3);
                    sqlbulk.ColumnMappings.Add(4, 4);
                    sqlbulk.ColumnMappings.Add(5, 5);
                    sqlbulk.ColumnMappings.Add(6, 6);
                    sqlbulk.ColumnMappings.Add(7, 7);
                    sqlbulk.ColumnMappings.Add(8, 8);
                    sqlbulk.ColumnMappings.Add(9, 9);
                    sqlbulk.ColumnMappings.Add(10, 10);
                    sqlbulk.ColumnMappings.Add(11, 11);
                    sqlbulk.ColumnMappings.Add(12, 12);
                    sqlbulk.ColumnMappings.Add(13, 13);
                    sqlbulk.ColumnMappings.Add(14, 14);
    
                    //导入
                    sqlbulk.WriteToServer(dt);
                    sqlbulk.Close();
                    return true;
                }
                catch (Exception ex)
                {
                    throw new Exception(ex.Message);
                }
                finally
                {
                    dt.Dispose();
                    cnnSql.Close();
                }
            }
    

     

     sqlbulk.SqlRowsCopied +=
                    new SqlRowsCopiedEventHandler(OnRowsCopied); //订阅复制完成后的方法,参数是 sqlbulk.NotifyAfter的值
                    sqlbulk.NotifyAfter = dt.Rows.Count;
    
    ------解决方案--------------------------------------------------------
    将oledb读取的excel数据快速插入的sqlserver中,很多人通过循环来拼接sql,这样做不但容易出错而且效率低下,最好的办法是使用bcp,也就是System.Data.SqlClient.SqlBulkCopy 类来实现。不但速度快,而且代码简单,下面测试代码导入一个6万多条数据的sheet,包括读取(全部读取比较慢)在我的开发环境中只需要10秒左右,而真正的导入过程只需要4.5秒。
    
     
    
    using System;
    using System.Data;
    using System.Windows.Forms;
    using System.Data.OleDb;
    namespace WindowsApplication2
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                //测试,将excel中的sheet1导入到sqlserver中
                string connString = "server=localhost;uid=sa;pwd=sqlgis;database=master";
                System.Windows.Forms.OpenFileDialog fd = new OpenFileDialog();
                if (fd.ShowDialog() == DialogResult.OK)
                {
                    TransferData(fd.FileName, "sheet1", connString);
                }
            }
    
            public void TransferData(string excelFile, string sheetName, string connectionString)
            {
                DataSet ds = new DataSet();
                try
                {
                    //获取全部数据
                    string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + excelFile + ";" + "Extended Properties=Excel 8.0;";
                    OleDbConnection conn = new OleDbConnection(strConn);
                    conn.Open();
                    string strExcel = "";
                    OleDbDataAdapter myCommand = null;
                    strExcel = string.Format("select * from [{0}$]", sheetName);
                    myCommand = new OleDbDataAdapter(strExcel, strConn);
                    myCommand.Fill(ds, sheetName);
    
                    //如果目标表不存在则创建
                    string strSql = string.Format("if object_id('{0}') is null create table {0}(", sheetName);
                    foreach (System.Data.DataColumn c in ds.Tables[0].Columns)
                    {
                        strSql += string.Format("[{0}] varchar(255),", c.ColumnName);
                    }
                    strSql = strSql.Trim(',') + ")";
    
                    using (System.Data.SqlClient.SqlConnection sqlconn = new System.Data.SqlClient.SqlConnection(connectionString))
                    {
                        sqlconn.Open();
                        System.Data.SqlClient.SqlCommand command = sqlconn.CreateCommand();
                        command.CommandText = strSql;
                        command.ExecuteNonQuery();
                        sqlconn.Close();
                    }
                    //用bcp导入数据
                    using (System.Data.SqlClient.SqlBulkCopy bcp = new System.Data.SqlClient.SqlBulkCopy(connectionString))
                    {
                        bcp.SqlRowsCopied += new System.Data.SqlClient.SqlRowsCopiedEventHandler(bcp_SqlRowsCopied);
                        bcp.BatchSize = 100;//每次传输的行数
                        bcp.NotifyAfter = 100;//进度提示的行数
                        bcp.DestinationTableName = sheetName;//目标表
                        bcp.WriteToServer(ds.Tables[0]);
                    }
                }
                catch (Exception ex)
                {
                    System.Windows.Forms.MessageBox.Show(ex.Message);
                }
    
            }
    
            //进度显示
            void bcp_SqlRowsCopied(object sender, System.Data.SqlClient.SqlRowsCopiedEventArgs e)
            {
                this.Text = e.RowsCopied.ToString();
                this.Update();
            }
    
    
        }
    } 
    上面的TransferData基本可以直接使用,如果要考虑周全的话,可以用oledb来获取excel的表结构,并且加入ColumnMappings来设置对照字段,这样效果就完全可以做到和sqlserver的dts相同的效果了。
    
    获取excel结构的方法可以参考我先前的文章
    
    http://blog.csdn.net/jinjazz/archive/2008/05/13/2441635.aspx
    

     

    转载于:https://www.cnblogs.com/bfy-19/archive/2013/04/02/2994956.html

    展开全文
  • 今天遇到了一个问题,一个查询语句,在测试环境执行没问题,但是正式环境就一直超时。研究了好久,发现是因为时间checktime如果设置为 CheckTime >= '2020-05-01' AND CheckTime < '2020-05-31' 就一直超时...

    今天遇到了一个问题,一个查询语句,在测试环境执行没问题,但是正式环境就一直超时。研究了好久,发现是因为时间checktime如果设置为

    CheckTime >= '2020-05-01'
    	AND CheckTime < '2020-05-31'
    

    就一直超时(最后发现要执行80多秒才能显示结果)
    checkdata表有1600多条数据,子查询查出来是6条数据。
    但如果时间设为

    CheckTime >= '2020-04-01'
    	AND CheckTime < '2020-05-31'
    

    就能在1秒内查询出语句。就很奇怪,不知道为啥。
    sql如下:

    SELECT
    	CheckUser,
    	UserName,
    	COUNT (
    	DISTINCT ( ApplyID )) AS NUM 
    FROM
    	CheckData
    	LEFT JOIN UserData ON CheckData.CheckUser = UserData.UserID 
    WHERE
    	CheckTime >= '2020-05-01'
    	AND CheckTime < '2020-05-10'
    	AND CheckUser IN (
    SELECT DISTINCT 
    VALUE
    	= SUBSTRING (
    	a.ProManagerJobNum,
    	b.number,
    CASE
    	
    	WHEN charindex( ',', a.ProManagerJobNum + ',', b.number ) - b.number > 0 THEN
    	charindex( ',', a.ProManagerJobNum + ',', b.number ) - b.number 
    	WHEN charindex( ',', a.ProManagerJobNum + ',', b.number ) - b.number <= 0 THEN
    	0 
    END 
    	) 
    FROM
    	ProjectMainInfo a
    	JOIN master..spt_values b ON b.type = 'p' 
    	AND b.number BETWEEN 1 
    	AND len( a.ProManagerJobNum ) 
    WHERE
    	SUBSTRING ( ',' + a.ProManagerJobNum, b.number, 1 ) = ',' 
    	) 
    GROUP BY
    	CheckUser,
    	UserID,
    	UserName 
    ORDER BY
    CheckUser DESC offset ( 0 ) ROWS FETCH NEXT 10 ROWS ONLY
    

    解决方案:
    1.把checktime 长时间类型“2020-05-01 00:00:00”
    转为字符类型

    AND CONVERT(VARCHAR(100),CheckTime,23)>= '2020-05-01'
    AND CONVERT(VARCHAR(100),CheckTime,23)< '2020-05-31'
    

    查询就很快了。
    后来同事告诉我说,是因为SQL server的优化器,当时间为2020-05-01至2020-05-31时,checkdata表有300多条数据,sqlserver就不进行优化,子查询也不会进行优化。就导致时间很慢。当把时间转化使用convert函数时,就会默认为当前语句进行优化。(主要还是由于sqlserver优化器的判断,所以同事不建议写子查询。)

    2.改写sql,因为子查询与主表没有关联。所以把子查询的表当作主表去关联checkdata表与userdata表。

    展开全文
  • Sql Server 数据库超时问题的解决方法 1.由于数据库设计问题造成SQL数据库新增数据超时 症状: Microsoft OLE DB Provider for SQL Server 错误 '80040e31' ([ODBC SQL Server Driver]超时已过期); ...

    Sql Server 数据库超时问题的解决方法

    1.由于数据库设计问题造成SQL数据库新增数据时超时

     

    症状:

    Microsoft OLE DB Provider for SQL Server 错误 '80040e31' ([ODBC SQL Server Driver]超时已过期);

    服务器上看CPU、内存占用率很低;

    事件日志中提示: 数据库 '*********' 中文件 '***********' 的自动增长在 453 毫秒后已取消或出现超时。使用 ALTER DATABASE 设置更小的 FILEGROWTH 或设置新的大小。

    原因:

    数据库设置时,[文件增长]按百分比来增长,当数据库文件很大时(1G以上),新增操作都会报超时,而这时候其实CPU、内存占用率都非常非常的低。

    解决方法:

    把上述的文件增长这里设置为一个更低的百分比或者直接指定增加多少兆字节。

     

    2.SQL Server数据库超时设置

     

    修改客户端的连接超时设置。默认情况下,通过企业管理器注册另外一台SQL Server的超时设置是 4 秒,而查询分析器是 15 秒。

     

    企业管理器中的设置:

     

    A、在企业管理器中,选择菜单上的"工具",再选择"选项";

    B、在弹出的"SQL Server企业管理器属性"窗口中,点击"高级"选项卡;

    C、在"连接设置"下的"登录超时(秒)"右边的框中输入一个比较大的数字,如 30。

     

    查询分析器中的设置:

     

    单击“工具”->"选项"->"连接"; 将登录超时设置为一个较大的数字,连接超时改为0。

     

    3.查询语句时超时

     

     

    原因分析:

     

    查询超时一般来说首先要从sql语句和数据表的结构上找原因,优化sql语句和为数据库的查询字段建索引是最常用的办法。

    另外,数据库的查询超时设置一般是sqlserver自己维护的(在你没有修改query wait配置前),只有当你的实际查询时间超过估计查询时间的25倍时,才会超时。

    而造成超出估计值那么多的原因有两种可能:

    一是估计时间不准确;

    二是sql语句涉及到大量占用内存的查询(如排序和哈希操作),内存不够,需要排队等待资源造成的。

     

    解决办法:

    A.优化语句,创建\使用合适的索引;

    B.解决第一个问题的方法,更新要查询表的索引分发统计,保证估计时间的正确性,UPDATE STATISTICS 表名;

     

     

    C.增加内存

     

    如果想手动设置查询超时,可以使用以下语句:

     

    sp_configure  'show  advanced  options',  1  
        GO  
        RECONFIGURE  
        GO  
        sp_configure  'query  wait',  2147483647  
        GO  
        RECONFIGURE  
        GO

     

     

    4.应用程序连接失败

     

    故障:

    在应用程序中我们也会遇到类似的错误信息,例如:

    Microsoft OLE DB Provider for ODBC Drivers 错误 '80004005'. [Microsoft][ODBC SQL Server Driver]超时已过期.

     

    解决方法:

    A.如果遇到连接超时的错误,我们可以在程序中修改 Connection 对象的超时设置,再打开该连接。例如:

     

    <%
    Set Conn = Server.CreateObject("ADODB.Connection")
    DSNtest="DRIVER={SQL Server};SERVER=ServerName;UID=USER;
    PWD=password;DATABASE=mydatabase"
    Conn. Properties("Connect Timeout") = 15 '以秒为单位
    Conn.open DSNtest
    %>

     

     

    B.  如果遇到查询超时的错误,我们可以在程序中修改 Recordset 对象的超时设置,再打开结果集。例如:

     

    Dim cn As New ADODB.Connection
    Dim rs As ADODB.Recordset
    . . . 
    cmd1 = txtQuery.Text
    Set rs = New ADODB.Recordset
    rs.Properties("Command Time Out") = 300
    '同样以秒为单位,如果设置为 0 表示无限制
    rs.Open cmd1, cn
    rs.MoveFirst
    . . .
    另外,一些硬件及网络方面的原因也可能造成SQL数据库连接超时.

    转载于:https://www.cnblogs.com/jxnclyk/archive/2010/07/05/1771165.html

    展开全文
  • 每次向表中插入的数据量有点大,最少是15
  • D:\Visual-NMP-x64\Bin\MySQL\bin这个是你mysql的路径 mysqldump.exe -h服务器信息 -umysql的用户名-pmysql的密码数据库名 > 要保存的路径和文件名。 比如我执行的是mysqldump-h localhost -uroot -proot demo ...
  • [Sql Server]超时时间已到。在操作完成之前超时时间已过或服务器未响应。 针对这个问题可以从以下几个房方面考虑:(若您有高见,请留言,谢谢) 一:执行命令超时;  SqlCommand命令执行超时,这时需要修改...
  • (Microsoft SQL Server,错误: 1222) 这个错误,刷新以后,右击某张表或者库,发现里面的表全部消失了 或者查询不到。 这是因为 sql进程死锁,资源被抢占,要解决这个问题,得杀死关闭 死锁的进程,下面介绍解决...
  • 解决方案:不要采用手动添加主键或者索引,而采用sql语句修改主键或者索引,当然很多人这个sql不会,也不要紧,sql自带了,两步走,第一:点开表设计,添加一个索引或者主键,如图 第二:关闭后,右键
  • $rights_sql="  SELECT   rights.id,lender_id,hold_money,get_score_dt,is_get_score  FROM  rights,loan  WHERE
  • SQL Server百万级大数据量删除 原文:SQL Server百万级大数据量删除 删除一个表中的部分数据数据量百万级。 一般delete from 表 delete from ysh where date<’2016-06-21’ ; 此...
  • 有时候我们的数据库中可能会有那么些存放动态数据的表,比如一些每天定时发出的消息通知信息...现在可以使用 SQL Server Management Studio创建 Transact-SQL 作业步骤定时清除不需要的数据。主要步骤如下(来自MSDN...
  • 最近,数据库有写数据需要运维一下,批量更新,数据量大约在60W左右 一开始偷懒了,想着图省事,批量更新,看看效果,一次更新3W条数据 drop table #temp select top 30000 ID into #temp from SAP_...
  • 对于轻量级的更新,单一的update或delete可以很快处理,但如果where查出的结果达到百万甚至千万级别,这一条更新语句执行下去,估计程序连接超时是必不可免的了。 其实我们可以换个思路,将where查询的结果进行分页...
  • 超时时间已到。在操作完成之前超时时间已过或服务器未响应 有时候修改表信息,保存的时候,由于数据量大响应需要一些时间,把超时时间设置大一点即可。
  • 实际工作中有时候需要把大量数据导入数据库,然后用于各种程序计算,本文将向大家推荐一个挑战4秒极限让百万级数据瞬间导入SQL Server实验案例。 本实验将使用5中方法完成这个过程,并详细记录各种方法所耗费的时间...
  • private const string con = "server=192.168.30.36;database=test;user=sa;pwd=123456"; static void Main(string[] args) { DataTable dt = new DataTable(); dt....
  • 实际工作中有时候需要把大量数据导入数据库,然后用于各种程序计算,本文将向大家推荐一个挑战4秒极限让百万级数据瞬间导入SQL Server实验案例。 本实验将使用5中方法完成这个过程,并详细记录各种方法所耗费的...
1 2 3 4 5 ... 20
收藏数 43,619
精华内容 17,447