以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.com/bbs/index.asp)
--  专家坐堂  (http://foxtable.com/bbs/list.asp?boardid=2)
----  外部数据源SQL查询的速度问题  (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=41995)

--  作者:sh16
--  发布时间:2013/11/1 10:10:00
--  外部数据源SQL查询的速度问题

 代码如下,有问题吗?数据源里有6张表,现在有8500行,每一行不知道在具体哪张表上,要分别去每张表查。查询8500行用了半个小时。。。。。。。。这个速度太慢了吧。         

            Dim cmd As New SQLCommand
            Dim dt As DataTable
            cmd.C
            For Each dtn As String In Connections("泉州").GetTableNames
                cmd.CommandText = "SELECT * From {" & dtn & "} where [PVLAN] = " & e.DataRow("板/PVLAN") & " And [CVLAN] = " & e.DataRow("端口/CVLAN")
                dt = cmd.ExecuteReader
                If dt.DataRows.Count > 0 Then
                    e.DataRow("LOID") = dt.DataRows(0)("LOID")
                    e.DataRow("PON口") = dt.DataRows(0)("PON口")
                    e.DataRow("ONUID") = dt.DataRows(0)("ONUID")
                    exit for
                Else
                    e.DataRow("LOID") = Nothing
                    e.DataRow("PON口") = Nothing
                    e.DataRow("ONUID") = Nothing
                End If
            Next

 

[此贴子已经被作者于2013-11-1 10:10:25编辑过]

--  作者:Bin
--  发布时间:2013/11/1 10:17:00
--  
检查你网络速度以及你服务器响应速度.

另外如果你查询的数据有大量数据,速度肯定也不会快.



--  作者:sh16
--  发布时间:2013/11/1 10:20:00
--  

同一个局域网,很快啊。我想问下,一条记录在数据源多张表查,象我这么写代码有问题吗。谢谢


--  作者:狐狸爸爸
--  发布时间:2013/11/1 10:23:00
--  

思路决定一切,你这种思路,就是在本机,也要很长的时间,你要知道,你执行了8500次select语句,生成了8500次临时表。

 

1、性质类似的数据合并在一起,不要分开6个表,用后用组合查询生成一个查询表,完成这样的任务是就是几秒钟而已。

2、如果已经是事实,你可以将这个6个表全部载入到一个表中,成为一个DataTable,在这个DataTable检索,合并多个表的select语句参考:

 

五、UNION 运算符

UNION运算符用于组合两个查询的结果。
例如有一个客户表,一个供应商表,我需要得到所有在中国的客户和供应商的名称和地址。
因为数据位于不同的表中,显然,我们需要用两个查询才能完成任务:

SELECT 公司名称, 地址 FROM {客户} WHERE 国家 = \'中国\' UNION SELECT 公司名称, 地址 FROM {供应商} WHERE 国家 = \'中国\'

两个查询的字段名称、个数、类型必须完全一致才行。

默认情况下,UNION会自动排除重复的行,然后你可以用ALL关键词来确保返回所有的行,例如:

SELECT 公司名称, 地址 FROM {客户} WHERE 国家 = \'中国\' UNION ALL SELECT 公司名称, 地址 FROM {供应商} WHERE 国家 = \'中国\'

[此贴子已经被作者于2013-11-1 10:24:18编辑过]

--  作者:Bin
--  发布时间:2013/11/1 10:25:00
--  
For Each dtn As String In Connections("泉州").GetTableNames    楼主这里似乎只循环了6个表6次而已.并没有8500次吧.
--  作者:狐狸爸爸
--  发布时间:2013/11/1 10:28:00
--  
呵呵,他一行数据要执行6次,合计8500行,其实我前面报少了,重置列的话,执行了8500 * 6 = 51000,执行51000次select语句,生成51000个临时表,半小时其实算很快了。
--  作者:狐狸爸爸
--  发布时间:2013/11/1 10:31:00
--  

嘿嘿,如果再加上获取表名的8500次,应该是执行了59500次查询了,生成59500个临时表了


--  作者:Bin
--  发布时间:2013/11/1 10:31:00
--  
图片点击可在新窗口打开查看不会是循环8500行来这样查吧,不半小时才怪呢.晕死! 

楼主这个思路严重的有问题啊,你把你需求说出来看看,换个思路做吧!

--  作者:sh16
--  发布时间:2013/11/1 10:35:00
--  

我是有8500行记录,要在外部数据源的6张表里查,而且表的数量随着需要可能还会增加,我是想编好代码后不用每次增加表都去改代码。分开多张表的目的是为了好管理。请问下有没有好的办法?谢谢。

[此贴子已经被作者于2013-11-1 10:35:31编辑过]

--  作者:Bin
--  发布时间:2013/11/1 10:37:00
--  
你好,请把你的需求说出来,这样才可以为你提供更好的办法哦.