注册 登录
编程论坛 SQL Server论坛

關於查詢速度的問題?

gelinqu 发布于 2006-12-30 17:41, 841 次点击
正在用VB做一個系統,在某個地方查詢時,要連接六個數據表,每個表都有超過一千條數據,而且條件很多,
而且要不斷的循環找,查詢時速度很慢,請問如果用存儲存過程是不是會快很多?
17 回复
#2
棉花糖ONE2006-12-30 17:43
你自己试一下看看会不会快啊
#3
WithFh2006-12-31 09:36
我不太會存儲過程啊?能不能給點多個表互相查詢的存儲過程例子
#4
bygg2006-12-31 14:49

置顶的帖子里面就有的,去看看吧.

或者是帮助文档里.
#5
ninggang2006-12-31 14:54

<1>速度是肯定会快很多的,呵呵,因为用存储过程,编译了后,以后在调用的时候直接就可以用编译后的代码,不用在编译,另外其基本语法如下:
Create Proc name
Declare @变量 数据类型(长度) intput
Declare @变量 数据类型(长度) output
AS
Begin
...
...
...
End
<2>建议:多找找这方面的书看一下,注意与触发器联系起来学习,呵呵,多动手实践

#6
angeloc2006-12-31 16:37

存储过程在复杂查询时候效率会提升!

#7
棉花糖ONE2006-12-31 17:44
以下是引用ninggang在2006-12-31 14:54:42的发言:

<1>速度是肯定会快很多的,呵呵,因为用存储过程,编译了后,以后在调用的时候直接就可以用编译后的代码,不用在编译,另外其基本语法如下:
Create Proc name
Declare @变量 数据类型(长度) intput
Declare @变量 数据类型(长度) output
AS
Begin
...
...
...
End
<2>建议:多找找这方面的书看一下,注意与触发器联系起来学习,呵呵,多动手实践

前一段时间,有人告诉我不好的触发器会导致整个系统瘫痪,还说触发器能实现的业务层都能实现(没写过什么程序,不知道什么是业务层),他建议我最好别用触发器,不过我觉得如果用来维护完整性的话触发器还是蛮好的,对触发器很了解的,可以出来做一下解释吗,为什么很多人都不建议使用触发器
#8
xu20002006-12-31 22:55
楼主最好能写出表结构和要求来,这样我们可以帮你优化一下。
#9
live412006-12-31 23:40
见到xu2000回帖,我也到此一游,我只试过如果多线程中同时执行一个大的存储过程的话,会死锁导致断开连接

不见得资源浪费在编译SQL语句上,时间是浪费在查询的数据量上,就算用存储过程,也只是省下一点解析时间而已。

我没用过视图,不过好象视图比存储过程更适合楼主的需求。。。


7楼的业务层是几层架构中的无聊概念,以前多是mvc三层,不过现在架构越出越复杂,已经N种架构了(petshop nbear)
#10
棉花糖ONE2007-01-01 00:50
多线程中同时执行一个大的存储过程的话
这样不是相当于并发,要考虑同步吧
#11
xu20002007-01-01 01:21
但我觉得用存储过程做查询的话,速度快到哪到。
#12
棉花糖ONE2007-01-01 10:32
优化的东西基本没搞过,寒假学学
#13
live412007-01-01 18:56
以下是引用jinyuzhang在2007-1-1 0:50:47的发言:
多线程中同时执行一个大的存储过程的话
这样不是相当于并发,要考虑同步吧

是这样的,procedure已经嵌在SQL2000里面,同步如果是单线程就是同步了

多线程就算同步也是死锁,而且如果用互斥的话就失去多线程的意义,所以多线程下一般直接用SQL语句


就算一条线程使用独立的一条连接,但是到数据库调用procedure的时候仍然是共用同一个

所以是并发的问题。

#14
ninggang2007-01-01 22:55
看来这里衍生的知识倒是挺宽的嘛,在这里我建议live41能够将这方面的知识拓展一下吗?让大家都能够认识到存储过程在单线程,多线程方面的利弊,以及其他个方面的知识,哈哈,谢谢
#15
live412007-01-02 11:15
我要发表的都发表完了,反正多线程就算用多条连接connection,也仍然是共用同一个procedure,就这么多了

线程建议用SQL语句来直接查询就罢,而且判断大可以在程序代码而不必一定要在procedure,除非特殊情况(我遇到特殊情况是关于VPN的)

至于说procedure比用SQL语法快得多的说法,我认为是垃圾说法。

要的话可以写个例子测试一下,别人云亦云

#16
WithFh2007-01-02 22:09
這就是我的查詢內容,比較多,確實不知道怎麼寫存儲過程
Dim conn As New ADODB.Connection
Dim rs As New ADODB.Recordset
Dim rs1 As New ADODB.Recordset
Dim SQL As String
Dim SQL1 As String
Dim count2 As Double '未交貨數量
conn.Open ConnectionString
SQL = "select OrderNo,CaseNo,TrustCaseNo,PlanDate,BookAmount from T01_ORDER_DTLS where OrderNo in (Select OrderNo from T01_ORDERS where Status ='2' or Status='1') and Status<>'E' order by PlanDate,CaseNo"
rs.Open SQL, conn, adOpenForwardOnly
LV.ListItems.Clear
While Not rs.EOF

LV.ListItems.Add , , IIf(IsNull(rs("CaseNo")), "", rs("CaseNo"))
LV.ListItems(LV.ListItems.Count).ListSubItems.Add , , IIf(IsNull(rs("PlanDate")), "", rs("PlanDate"))
LV.ListItems(LV.ListItems.Count).ListSubItems.Add , , IIf(IsNull(rs("BookAmount")), 0, rs("BookAmount"))
count2 = 0#
SQL1 = "select SUM(Pieces)as count1 from T13_OUTGOODS_DTLS where OutgoodNo in(Select OutgoodNo from T13_OUTGOODS where Status='E' and OrderKey='" & rs("OrderNo") & "') and CaseNo='" & rs("CaseNo") & "'"
rs1.Open SQL1, conn, adOpenForwardOnly
' SQL1 = "OutgoodNo in(Select OutgoodNo from T13_OUTGOODS where Status='E' and OrderKey='" & rs("OrderNo") & "') and CaseNo='" & rs("CaseNo") & "'"
' rs1.Find SQL1
If Not rs1.EOF Then
count2 = rs("BookAmount") - IIf(IsNull(rs1("count1")), 0, rs1("count1"))
End If

Set rs1 = Nothing
SQL1 = "Select BackAmt from T13_BACKGOOD_DTLS where OrderKey='" & rs("OrderNo") & "' and CaseNo='" & rs("CaseNo") & "'"
rs1.Open SQL1, conn, adOpenForwardOnly
If Not rs1.EOF Then
count2 = count2 + IIf(IsNull(rs1("BackAmt")), 0, rs1("BackAmt"))
End If
Set rs1 = Nothing

LV.ListItems(LV.ListItems.Count).ListSubItems.Add , , count2
' If count2 = 0 Then MsgBox rs("OrderNo"), vbExclamation, count2
SQL1 = "select Stocks from T12_STOCKS where CaseNo='" & rs("CaseNo") & "'"
rs1.Open SQL1, conn, adOpenForwardOnly
If rs1.EOF Then
LV.ListItems(LV.ListItems.Count).ListSubItems.Add , , 0
Else
LV.ListItems(LV.ListItems.Count).ListSubItems.Add , , IIf(IsNull(rs1("Stocks")), 0, rs1("Stocks"))
End If
Set rs1 = Nothing
SQL1 = "select SUM(Pieces)as count from T13_OUTGOODS_DTLS where OutgoodNo in(Select OutgoodNo from T13_OUTGOODS where Status<>'E' and OrderKey='" & rs("OrderNo") & "') and CaseNo='" & rs("CaseNo") & "'"
rs1.Open SQL1, conn, adOpenForwardOnly
If Not rs1.EOF Then
LV.ListItems(LV.ListItems.Count).ListSubItems.Add , , IIf(IsNull(rs1("count")), 0, rs1("count"))
Else
LV.ListItems(LV.ListItems.Count).ListSubItems.Add , , 0
End If
Set rs1 = Nothing
SQL1 = "select OrderNum from T01_ORDERS where OrderNo='" & rs("OrderNo") & "'"
rs1.Open SQL1, conn, adOpenForwardOnly
LV.ListItems(LV.ListItems.Count).ListSubItems.Add , , IIf(IsNull(rs1("OrderNum")), "", rs1("OrderNum"))
Set rs1 = Nothing
LV.ListItems(LV.ListItems.Count).ListSubItems.Add , , IIf(IsNull(rs("TrustCaseNo")), "", rs("TrustCaseNo"))
SQL1 = "select CustomNo,CustomName from T01_ORDERS where OrderNo='" & rs("OrderNo") & "'"
rs1.Open SQL1, conn, adOpenForwardOnly

LV.ListItems(LV.ListItems.Count).ListSubItems.Add , , IIf(IsNull(rs1("CustomNo")), "", rs1("CustomNo"))
LV.ListItems(LV.ListItems.Count).ListSubItems.Add , , IIf(IsNull(rs1("CustomName")), "", rs1("CustomName"))

Set rs1 = Nothing

SQL1 = "select MoldName from T01_CUSTOM_MOLDS where CaseNo='" & rs("CaseNo") & "'"
rs1.Open SQL1, conn, adOpenForwardOnly
If Not rs1.EOF Then
LV.ListItems(LV.ListItems.Count).ListSubItems.Add , , IIf(IsNull(rs1("MoldName")), "", rs1("MoldName"))
Else
LV.ListItems(LV.ListItems.Count).ListSubItems.Add , , ""
End If
Set rs1 = Nothing

SQL1 = "select SUM(Pieces)as count1 from T13_OUTGOODS_DTLS where OutgoodNo in(Select OutgoodNo from T13_OUTGOODS where Status='E' and OrderKey='" & rs("OrderNo") & "') and CaseNo='" & rs("CaseNo") & "'"
rs1.Open SQL1, conn, adOpenForwardOnly
If Not rs1.EOF Then
LV.ListItems(LV.ListItems.Count).ListSubItems.Add , , IIf(IsNull(rs1("count1")), 0, rs1("count1"))
Else
LV.ListItems(LV.ListItems.Count).ListSubItems.Add , , 0
End If
Set rs1 = Nothing

SQL1 = "select Address,Liaisons from T01_ORDERS where OrderNo='" & rs("OrderNo") & "'"
rs1.Open SQL1, conn, adOpenForwardOnly

LV.ListItems(LV.ListItems.Count).ListSubItems.Add , , IIf(IsNull(rs1("Address")), "", Trim(rs1("Address")))
LV.ListItems(LV.ListItems.Count).ListSubItems.Add , , IIf(IsNull(rs1("Liaisons")), "", Trim(rs1("Liaisons")))

Set rs1 = Nothing
LV.ListItems(LV.ListItems.Count).ListSubItems.Add , , "訂單"
LV.ListItems(LV.ListItems.Count).ListSubItems.Add , , rs("OrderNo")
rs.MoveNext
Wend
Set rs = Nothing
labCT.Caption = LV.ListItems.Count
Set conn = Nothing
#17
bygg2007-01-02 23:58
你这也太吓人了吧?
你只需要把数据表中的字段(还有结构)+你要实现什么样的功能写出来就行了.
#18
棉花糖ONE2007-01-03 00:25
create procedure查一下帮助就会写了,里面自带例子
1