sql语句查询需要一段时间,程序经常成了无响应状态,怎么解决?

时间:2020-12-12 15:25:24
我用的是vb.net语言,以下是主要几句: 

Dim Cmd As New System.Data.OracleClient.OracleCommand 
Dim ds1 As DataSet = New DataSet 
Cmd.Connection = con 
Cmd.CommandText = sql 
adapter.Fill(ds1, "stat") 
DataGridView1.DataSource = ds1.Tables("stat") 

查询的内容比较复杂,速度慢,就像死机了一样。 
怎样才能避免程序成为无响应状态呢? 
要是循环语句经常会用到do events。但这种情况就不会解决了。

25 个解决方案

#1


多大的数据量,数据库做优化没有?索引什么的都建了没有

#2


数据量非常大啊,索引建了
oracle数据库,表结构大概如下:
站号,日期,气温,降水,日照。。。。

表里面存了2000多个站点在50年左右的逐日数据,也就是说每天每个站点都占一条记录。所以数据量很大啊。
索引是:站号和日期

请问还有什么方法可以优化的吗?

#3


数据量 很大 ,还是用DataSet ,使用只读向前 数据要快多了 

#4


而且没有必要 全部取出来数据吧,使用存储过程分页 效果要好多了
比如使用 SQL SERVER 的ROW_NUMBER(),
还有 历史记录 很明显 应该导出到 其他备份表~让表里面的 历史数据 导出吧

#5


我用的是oracle数据库,怎么使用dataset?
能给个简单的例子吗?

#6


可以创建一个线程 

#7


怎么创建线程?能根据我的代码帮我写一下吗?

#8


帮顶

#9


该回复于2009-02-25 10:19:57被版主删除

#10


友情up

#11


帮顶!

#12


找个orancle的分页存储过程.....

#13


这么大数据量怎么可能不慢,

#14


帮顶

#15


先来个表分区,建索引,调用分页存储过程,详细也懒得写,百度吧兄弟

#16


用多线程吧:

   Private Sub mnuSys_Menu_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles mnuSys_Menu.Click
      Dim td As New System.Threading.Thread(AddressOf Query)
      td.Start()
   End Sub

   Private Sub Query()
      Dim Cmd As New System.Data.OracleClient.OracleCommand 
      Dim ds1 As DataSet = New DataSet 
      Cmd.Connection = con 
      Cmd.CommandText = sql 
      adapter.Fill(ds1, "stat") 
      DataGridView1.DataSource = ds1.Tables("stat") 
      ……
   End Sub

#17


如果要代入参数,则使用线程池:
但是注意线程池只能代入一个参数

   Private Sub mnuSys_Menu_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles mnuSys_Menu.Click
      System.Threading.ThreadPool.QueueUserWorkItem(New Threading.WaitCallback(AddressOf Query), I)
   End Sub

   Private Sub Query(ByVal objIndex As Object)
      Dim Cmd As New System.Data.OracleClient.OracleCommand 
      Dim ds1 As DataSet = New DataSet 
      Cmd.Connection = con 
      Cmd.CommandText = sql 
      adapter.Fill(ds1, "stat") 
      DataGridView1.DataSource = ds1.Tables("stat") 
      ……
   End Sub

#18


不懂VB.NET,但是如果是Windows程序的话可以使用多线程,在线程中执行长时间的操作,可以解决这个问题的。一般windows程序中如果有长时间等待的操作都会放入线程中

#19


不用线程可以查出结果,用了线程什么结果都没有了?怎么回事?

#20


出了错误“线程间操作无效: 从不是创建控件“DataGridView1”的线程访问它。”
在线程里面还不能使用控件了吗?

#21


想办法在数据库优化,代码对这么大的数据量没什么效果的(除非多线程用的好),分页+视图(每5年建一个)

#22


分页+视图(每5年建一个)

#23


引用 20 楼 sundae81 的回复:
出了错误“线程间操作无效: 从不是创建控件“DataGridView1”的线程访问它。”
在线程里面还不能使用控件了吗?


你需要Control.CheckForIllegalCrossThreadCalls = False 

#24


委托

#25


谢谢大家,最后我用分区的方法优化了一下,速度快了2倍。

#1


多大的数据量,数据库做优化没有?索引什么的都建了没有

#2


数据量非常大啊,索引建了
oracle数据库,表结构大概如下:
站号,日期,气温,降水,日照。。。。

表里面存了2000多个站点在50年左右的逐日数据,也就是说每天每个站点都占一条记录。所以数据量很大啊。
索引是:站号和日期

请问还有什么方法可以优化的吗?

#3


数据量 很大 ,还是用DataSet ,使用只读向前 数据要快多了 

#4


而且没有必要 全部取出来数据吧,使用存储过程分页 效果要好多了
比如使用 SQL SERVER 的ROW_NUMBER(),
还有 历史记录 很明显 应该导出到 其他备份表~让表里面的 历史数据 导出吧

#5


我用的是oracle数据库,怎么使用dataset?
能给个简单的例子吗?

#6


可以创建一个线程 

#7


怎么创建线程?能根据我的代码帮我写一下吗?

#8


帮顶

#9


该回复于2009-02-25 10:19:57被版主删除

#10


友情up

#11


帮顶!

#12


找个orancle的分页存储过程.....

#13


这么大数据量怎么可能不慢,

#14


帮顶

#15


先来个表分区,建索引,调用分页存储过程,详细也懒得写,百度吧兄弟

#16


用多线程吧:

   Private Sub mnuSys_Menu_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles mnuSys_Menu.Click
      Dim td As New System.Threading.Thread(AddressOf Query)
      td.Start()
   End Sub

   Private Sub Query()
      Dim Cmd As New System.Data.OracleClient.OracleCommand 
      Dim ds1 As DataSet = New DataSet 
      Cmd.Connection = con 
      Cmd.CommandText = sql 
      adapter.Fill(ds1, "stat") 
      DataGridView1.DataSource = ds1.Tables("stat") 
      ……
   End Sub

#17


如果要代入参数,则使用线程池:
但是注意线程池只能代入一个参数

   Private Sub mnuSys_Menu_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles mnuSys_Menu.Click
      System.Threading.ThreadPool.QueueUserWorkItem(New Threading.WaitCallback(AddressOf Query), I)
   End Sub

   Private Sub Query(ByVal objIndex As Object)
      Dim Cmd As New System.Data.OracleClient.OracleCommand 
      Dim ds1 As DataSet = New DataSet 
      Cmd.Connection = con 
      Cmd.CommandText = sql 
      adapter.Fill(ds1, "stat") 
      DataGridView1.DataSource = ds1.Tables("stat") 
      ……
   End Sub

#18


不懂VB.NET,但是如果是Windows程序的话可以使用多线程,在线程中执行长时间的操作,可以解决这个问题的。一般windows程序中如果有长时间等待的操作都会放入线程中

#19


不用线程可以查出结果,用了线程什么结果都没有了?怎么回事?

#20


出了错误“线程间操作无效: 从不是创建控件“DataGridView1”的线程访问它。”
在线程里面还不能使用控件了吗?

#21


想办法在数据库优化,代码对这么大的数据量没什么效果的(除非多线程用的好),分页+视图(每5年建一个)

#22


分页+视图(每5年建一个)

#23


引用 20 楼 sundae81 的回复:
出了错误“线程间操作无效: 从不是创建控件“DataGridView1”的线程访问它。”
在线程里面还不能使用控件了吗?


你需要Control.CheckForIllegalCrossThreadCalls = False 

#24


委托

#25


谢谢大家,最后我用分区的方法优化了一下,速度快了2倍。