终端访问sql库,速度慢的问题

Turbo808 2017-10-20 01:16:06
有个sql服务器上面放了10个sql数据库。终端通过程序来访问这些库,但是速度感觉很慢,甚至比通过网页访问的还慢。请问问题的症结在哪里,要如何解决这个问题呢?
...全文
246 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
rs.movenext 是个游标移动,这个很消耗时间 我就一次性丢入rsRows 数组中了 一般这样可以提升不少性能
  • 打赏
  • 举报
回复
select a1,a2 from a 怀疑你这行查询结果行数过多~
  • 打赏
  • 举报
回复
引用 9 楼 Turbo808 的回复:
比如 数据表a 里面有a1 a2 两个字段 ,并且同时存在1000条记录 我就 set rs=new adodb.recordset rs.open "select a1,a2 from a",conn,1,1 while not rs.eof list1.additem rs!a1 & vbtab rs!a2 ‘循环这里特别慢,有没有什么办法呢? rs.movenext wend rs.close
试试改成这样有没有快一点
    Dim rsRows(), i As Long
    Set rs = New ADODB.Recordset
    rs.CursorLocation = adUseClient '加这行
    rs.Open "select a1,a2 from a", conn, 1, 1
    rsRows = rs.GetRows
    For i = 0 To UBound(rsRows, 2)
        List1.AddItem rsRows(0, i) & rsRows(1, i)   '循环这里特别慢,有没有什么办法呢?
    Next
    rs.Close
xiaoxiangqing 2017-10-24
  • 打赏
  • 举报
回复
这个最好监控一下
Turbo808 2017-10-24
  • 打赏
  • 举报
回复
对,是处理数据的循环那里慢,有没有什么办法规避?
吉普赛的歌 2017-10-23
  • 打赏
  • 举报
回复
1000条数据库有点多,但不算太多。几秒可以搞定。你确定你的SQL没where(没加任何条件)??? 先新写一个最简单的程序来取1000条数据, 看慢不慢?
Turbo808 2017-10-23
  • 打赏
  • 举报
回复
比如 数据表a 里面有a1 a2 两个字段 ,并且同时存在1000条记录 我就 set rs=new adodb.recordset rs.open "select a1,a2 from a",conn,1,1 while not rs.eof list1.additem rs!a1 & vbtab rs!a2 ‘循环这里特别慢,有没有什么办法呢? rs.movenext wend rs.close
吉普赛的歌 2017-10-23
  • 打赏
  • 举报
回复
引用 7 楼 Turbo808 的回复:
在服务器上查询速度很快,我觉的是查询结果传输到本地的速度慢
贴出SQL再说吧
Turbo808 2017-10-23
  • 打赏
  • 举报
回复
在服务器上查询速度很快,我觉的是查询结果传输到本地的速度慢
OwenZeng_DBA 2017-10-23
  • 打赏
  • 举报
回复
引用 9 楼 Turbo808 的回复:
比如 数据表a 里面有a1 a2 两个字段 ,并且同时存在1000条记录 我就 set rs=new adodb.recordset rs.open "select a1,a2 from a",conn,1,1 while not rs.eof list1.additem rs!a1 & vbtab rs!a2 ‘循环这里特别慢,有没有什么办法呢? rs.movenext wend rs.close
你这个是在程序处理的时候慢吧,,你直接在SSMS里面执行 select a1,a2 from a速度慢吗
Turbo808 2017-10-23
  • 打赏
  • 举报
回复
是的,where里不加条件也是很慢,所以我才会觉得是网络传输造成的拖延。不知这种问题有没有办法规避?
吉普赛的歌 2017-10-22
  • 打赏
  • 举报
回复
引用 5 楼 Turbo808 的回复:
前几天有事回复没上网,不好意思。 是我问题没有说清楚,具体的问题是: 我做一个exe程序,直接用adodb连接网络服务器上的sql server。当执行一个查询后,返回1000条查询结果的时候,我需要把结果填充到表格里面去。这个过程非常慢了。我分析应该是这1000条数据在网络传输过程中比较慢导致的。这种问题有没有比较好的解决思路呢?
1. 贴出查这一千条记录的SQL 2. 贴出SQL相关表的表结构、相关索引 3. SQL在服务器上用 ssms 直接查询需要几秒?
Turbo808 2017-10-22
  • 打赏
  • 举报
回复
前几天有事回复没上网,不好意思。 是我问题没有说清楚,具体的问题是: 我做一个exe程序,直接用adodb连接网络服务器上的sql server。当执行一个查询后,返回1000条查询结果的时候,我需要把结果填充到表格里面去。这个过程非常慢了。我分析应该是这1000条数据在网络传输过程中比较慢导致的。这种问题有没有比较好的解决思路呢?
二月十六 2017-10-20
  • 打赏
  • 举报
回复
1、执行的语句一样吗? 2、网络环境一样吗?
OwenZeng_DBA 2017-10-20
  • 打赏
  • 举报
回复
先定位慢在哪里,是慢在数据库还是慢在你终端的程序。
吉普赛的歌 2017-10-20
  • 打赏
  • 举报
回复
上面的脚本, 你先在服务器上查一下, 把慢的SQL贴出来让大家帮你分析
吉普赛的歌 2017-10-20
  • 打赏
  • 举报
回复
SELECT TOP 10 OBJECT_NAME(qt.objectid, qt.dbId)  AS procName,
       DB_NAME(qt.dbId)                   AS [db_name],
       qt.text                            AS SQL_Full,
       SUBSTRING(
           qt.text,
           (qs.statement_start_offset / 2) + 1,
           (
               (
                   CASE statement_end_offset
                        WHEN -1 THEN DATALENGTH(qt.text)
                        ELSE qs.statement_end_offset
                   END 
                   - qs.statement_start_offset
               ) / 2
           ) + 1
       )                                  AS SQL_Part --统计对应的部分语句
       ,
       qs.creation_time,
       qs.last_execution_time,
       qs.execution_count,
       qs.last_elapsed_time / 1000000     AS lastElapsedSeconds,
       qs.last_worker_time / 1000000      AS lastCpuSeconds,
       CAST(
           qs.total_elapsed_time / 1000000.0 / (
               CASE 
                    WHEN qs.execution_count = 0 THEN -1
                    ELSE qs.execution_count
               END
           ) AS DECIMAL(28, 2)
       )                                  AS avgDurationSeconds,
       CAST(qs.last_logical_reads AS BIGINT) * 1.0 / (1024 * 1024) * 8060 AS 
       lastLogicReadsMB,
       qs.last_logical_reads,
       qs.plan_handle
FROM   sys.dm_exec_query_stats qs
       CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS qt
CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) AS p
WHERE  qs.last_execution_time >= CONVERT(CHAR(10),GETDATE(),120)+' 08:00'	--今天8点之后的慢SQL
       AND qs.last_elapsed_time >= 3 * 1000 * 1000							--只取执行时间大于 3 秒的记录
       AND qt.[text] NOT LIKE '%Proc_DBA%'
ORDER BY
       qs.last_worker_time DESC

22,206

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧