我用VC6.0做了一个可以通过股票卡股票接收及时行情的股票接收系统。以前数据是存储
在.DAT磁盘文件中(如同乾隆、分析家)。
  但是为了实现C/S模式,我想把数据存入SQL SERVER 2000数据库中,以便客户机共享
数据。由于每只股票每分钟都能收到好几笔及时行情,加上股票基数较大(1000多),于
是大量数据的存储便成了问题。
  由于本人对SQL SERVER不太熟悉,所以有关及时行情的存储想请各位指教一二。

解决方案 »

  1.   

    javanew(我是java新手),你好。
    我也听说用存储过程,但由于(我是SQL新手),不知具体怎样用。
    可不可以麻烦你多指点一二。
      

  2.   

    自己想了想:可不可以建立一个在内存中的实时数据表,把一天中所有股票的分时数据(240分
    钟)都存到这个表中,在收盘后转储到硬盘上,不知效率如何?另外:用SQL SERVER在内存中建立用于及时响应的实时数据库(如股票,工控等)
          什么方法最好呢?
      

  3.   

    先存在接收计算机的硬盘上,等收盘后再慢慢存到SQL服务器上,就像很多股票软件要做‘收盘作业’一样。
      

  4.   

    回sans(sans) ,你的意思是将行情服务器和数据服务器分别开来,像乾隆网络版
    就是这样的。(但它是dbf库)
    就算是建立行情服务器,但如果开辟内存池(可能比较大)用于存储分时行情也比
    直接写硬盘,效率应该会高些吧?
    问题是;我可不可用SQL SERVER数据库的形式建立内存表呢?
      

  5.   

    如果能够保证机器的稳定(不掉电),那么内存表是最佳选择,否则为了保证数据的完整,最好在使用内存表的同时,将行情数据定时写回硬盘(使用一后台线程),这对现在的计算机不算什么负担,而且还可以使用scsi硬盘raid等等硬件技术来保证效率。
      

  6.   

    如果写回SQL SERVER,你会死的!你只不知道,一天有多少条记录?
    现在有1500多只股票(沪深A,沪深B,基金,转配,增发),按着每天有1400只开盘,每分钟3笔成交,每天240分钟是1008000条记录,如果算上每只股票的买卖手明细,记录起码是这个基数的3倍以上,也就是说一天就有400万条记录插入这张表,你打算存几天的数据?一年是250个交易日,就是10亿条记录,你的数据库能行吗?即使能行,查询,删除会慢死你!我已经试过了,这个方案早就否决了!
      

  7.   

    新思路:   建立三张表:日线表,行情表和明细表。(除权,财务另存)。
       日线表存储以日期为索引的日k线数据,大约1500张表。每天收盘时从行情表中
    转储过来。
       行情表以股票代码为索引,只需一张(或n张 -- 用于将深、沪、基金等分开
    存),存储当天的行情列表(Field: 开、收、高、低、量....)。
       明细表一张,就用来存收到的分笔成交,用于分时线显示。(Field: 交易时
    间、成交价、现手....)。这张表就非常大,每天大约有1M条吧。可考虑只存10
    天左右,应该可满足用户需要。
       SQL SERVER数据库不知能否胜任?
       望各位高手给点指引。
      

  8.   

    我认为最好的方法是自己创建复合文档来实现,思路是按交易日为单位,建立股票链,每天每只股票的成交明细是一个子链,然后创建横向索引和纵向索引,这样文件的大小可以不限,查询速度也很快,其实微软的ACCESS就是用复合文档实现的,我已经实现了半年的分时数据,由于是商业产品,无法公布源码,只能给你提供思路。
      

  9.   

    多谢 Tasehouny(阿甘) 提供的思路。我现在做的接收系统的历史数据就是用磁盘文件来存储的。
    具体格式如下:起止地址 | 数据含义 | 数据类型
    -------------------------------
     00 - 03 | 日线类型 | Integer
     04 - 07 | 证券总数 | Integer
     08 - 0B | 空块始址 | Integer
     0C - 0F | 空块末址 | Integer
     10 - 13 | -保留- | Integer
     14 - 17 | -保留- | Integer 18 - 21 | 证券代码 | CHAR[10]
     22 - 23 | 日线天数 | Integer
     24 - 25 | -保留- | Integer
     26 - 57 | 记录块号 | Word[n]
     .
     .
     空闲块
     .
     .
    41000 - 41003 | -日期- | Integer  
    41004 - 41007 | 开盘价 | Single  
    41008 - 4100B | 最高价 | Single  
    4100C - 4100F | 最低价 | Single  
    41010 - 41013 | 收盘价 | Single  
    41014 - 41017 | 成交量 | Single  
    41018 - 4101B | 成交金额 | Single  
    4101C - 4101D | 上涨家数 | Word  
    4101E - 4101F | 下跌家数 | Word  注:
    1)历史数据以年为单位建立。(如 sh/2000.dat sz/2002.dat)
    2)从18h开始每64Byte为一条股票数据分配记录。(如 上表18h - 57h)
    3)从41000h开始每8KB为一股票数据存储块,每个股票数据存储块可存储256条日
       线记录,每一条记录的长度为32Byte(如上表41000h - 4101Fh)
    4)明细表大同小异。
    5)该数据格式参照了分析家,因为我用过的所有证券软件中感觉它的数据存储性能
       最好。   但是我想把此系统做成C/S模式或B/S模式,为了数据共享需要用数据库存储,
    磁盘文件就难以达到此要求。
        但本人对SQL SERVER数据库技术不太熟悉。所以在此抛砖引玉,望各位高手都
    能谈谈证券类软件基于数据库的存储方法。
      

  10.   

    我写了下面这个存储过程用于更新数据库:
    -------------------------------------------------
    CREATE PROCEDURE [update_行情表]
    (@代码_1  [char](8),
     @最高_5  [real],
     @最低_6  [real],
     @最新_7  [real],
     @总手_8  [real],
     @总额_9  [real])AS
    UPDATE [实时数据库].[dbo].[行情表]
    SET  [最高] = @最高_5,
         [最低] = @最低_6,
         [最新] = @最新_7,
         [总手] = @总手_8,
         [总额] = @总额_9
    WHERE   [代码] = @代码_1
    GO
    --------------------------------------------------
    注:行情表以[代码]为主键。大约有1500多条记录。虽然看起来很简单,但此过程每秒被调用50次之多。于是CPU时间占有高居不下。严重影响了系统的运行。请问各位高手,有没有好的办法解决此问题。
    (想法:能不能把该数据表做到内存中,只在内存中更新。但也要能像普遍表一样能被ODBC正常访问?)
      

  11.   

    综合起来不外是两个问题:一是效率二是存储。
    效率问题比较好解决,在内存或硬盘开辟临时空间来存储数据,并在系统不忙时将临时数据导入数据库即可。(在处理过程中可能要使用多线程技术)
    存储问题比较麻烦了。比较实际的办法是先分析一下确定一下数据规模,如果数据量太大的话,就要重新选择数据库平台。毕竟MS SQL处理这种数据不是强项。
    在重新选择数据库平台后,你可将主要精力放在数据进入系统上,将查询、维护尽量交给数据库引擎去作,比如使用触发器或存储进程等。
      

  12.   

    SQL SERVER是数据库,内存表和SQL SERVER两回事。
        事实上,内存表是ACCESS格式和操作方法(MSDN里有)
        内存表可以做得很大,树立速度也比较快,还可以定时保存。
        股票信息实在是小意思啦,比起网络游戏来说。不是每秒钟上千笔吧?
      

  13.   

    请问 tanyx(不知道) :
        内存表是ACCESS格式和操作方法(MSDN里有),我具体用什么方法来构建和操作内存表呢?我在msdn里没找到,给个书签也好。
    网络游戏是用的内存表吗?