大家好,banq好,我想问大家一个系统速度,或者说是数据库的问题

07-01-07 yuxb111
项目大概情况如下:我们客户给我们提供了全美所有公司的数据,一共二千万条左右.按照前台的输入,查询相应的结果,结果一般很多,至少几百条记录,还有按各种可能的情况排序.系统的开发是ASP+储存过程+SQL Server 2005,一般数据库的优化方法都用在上面了,可是速度奇慢,后来,我们采用按照州建表,把数据拆开.系统的相应速度还是在20-30s内.我们不知道如何再进一步提高系统速度.现在客户提出要求,让我们用.net来做前台,我想问各位的是,

1.对于这种大数据量的处理,大家一般是如何做的呢?怎样才能让系统的相应时间缩短在10s以内呢?

2.如果还是按照.net+存储过程的设计方法,其他不做太大的改动的话,能明显提供系统相应时间吗?

谢谢各位高手和banq的指教,谢谢!

banq
2007-01-08 18:09
提高系统性能,不能闷在数据库上面,这上面潜力总是有限的,而应该抬头向上,使用分布式计算,Google搜索就是一个分布式计算的例子。

具体来说,就是使用缓存,根据你的业务特点,将那些重复查询的数据缓存在中间服务器内存中。

如果你的数据可重复性很小,可以参考google这样缓存机制,查查资料。

eggplant
2007-01-08 18:10
这种大数据量的查询不可以做实时检索的,效率太低.尤其是企业信息这种极少变动的数据.

可以根据提供给用户的查询条件,在后台用程序预先计算生成中间表.响应用户查询请求时,直接在很小的中间表里搜索就可以了.

另外,个人感觉按照州拆分数据可能是个坏主意.有可能一个查询需要在不同的表里执行50遍才能有结果.能快得了吗?

guotielong
2007-01-08 22:43
就数据库来说.可以做以下几方面的工作.一分析数据的构成.现在我没太搞清楚,是什么样的数据.我们是保险行业的.我们把一些特殊数据按年分.每年建成一个表.不用储存过程同样是操作数据库不能提高性能.查询时建立临时表.同时使用多层结构的应用程序.最直接的方法弄个好机器就行了.

my3bit
2008-12-10 15:11
你可以考虑采用lucene之类的搜索引擎!

spring7777777
2008-12-10 20:16
缓存是king

lwei71
2008-12-14 11:42
数据库直接安装在文件中的吧,试试把数据库文件直接安装到裸磁盘中。

使用原始分区

Microsoft SQL Server 2000 支持使用原始分区创建数据库文件。原始分区是指没有用 Windows NT 文件系统(如 FAT 和 NTFS)格式化的磁盘分区。在某些情况下,使用在原始分区上创建的数据库,可以获得比在 NTFS 或 FAT 上更高的性能。但是,对于大多数安装,首选方法是使用在 NTFS 或 FAT 分区上创建的文件。

在原始分区上创建数据库文件时,不必指定构成该数据库的文件的物理名称,只需指定要在其上创建数据库文件的磁盘的驱动器号。

如果正在使用 Microsoft Windows 2000 Server,则可以创建指向原始分区的已装入驱动器。在空文件夹中装入一个本地驱动器时,Windows 2000 将给该驱动器分配驱动器路径而不是驱动器号。已装入驱动器不受驱动器号强加的 26 个驱动器的限制,因此可以使用任意多个原始分区。在已装入驱动器上创建数据库文件时,必须在文件名后尾随一个反斜线符号来结束驱动器路径,例如,E:\ Sample name\。有关创建已装入驱动器的信息,请参见 Windows 2000 Server 文档。

在使用原始分区时,需考虑如下限制:

每个原始分区上只能创建一个数据库文件。逻辑分区必须配置为一个单一的数据库文件,因为原始分区上没有文件系统。

常规文件系统操作(如复制、移动和删除等)不能在原始分区上使用。

原始分区上的数据库文件不能用 Windows NT 备份实用工具备份。但是,仍可创建 SQL Server 数据库备份或事务日志备份。

原始分区上的数据库文件不能自动扩充。或者最初就以其实际大小创建数据库,或者手动扩充数据库文件。有关更多信息,请参见扩充数据库。

只能使用字母编号的分区(例如 E:)或已装入的驱动器(例如 E:\Sample name\)。不能使用数字编号的设备。

文件系统服务(例如坏块替换)在原始分区上不可用。

H. 使用原始分区

下面的示例使用原始分区创建名为 Employees 的数据库。执行语句时,原始分区必须存在,并且每个原始分区只能创建一个文件。

USE master

GO

CREATE DATABASE Employees

ON

( NAME = Empl_dat,

FILENAME = 'f:',

SIZE = 10,

MAXSIZE = 50,

FILEGROWTH = 5 )

LOG ON

( NAME = 'Sales_log',

FILENAME = 'g:',

SIZE = 5MB,

MAXSIZE = 25MB,

FILEGROWTH = 5MB )

GO

I. 使用已装入的驱动器

下面的示例使用指向原始分区的已装入驱动器创建名为 Employees 的数据库。此功能只在 Microsoft Windows 2000 Server 中才可用。.执行语句时必须已经存在已装入的驱动器和原始分区,并且每个原始分区上只能有一个文件。当在已装入的驱动器上创建数据库文件时,必须用尾随反斜线结束驱动器路径。

USE master

GO

CREATE DATABASE Employees

ON

( NAME = Empl_dat,

FILENAME = 'd:\sample data dir\',

SIZE = 10,

MAXSIZE = 50,

FILEGROWTH = 5 )

LOG ON

( NAME = 'Sales_log',

FILENAME = 'd:\sample log dir\',

SIZE = 5MB,

MAXSIZE = 25MB,

FILEGROWTH = 5MB )

GO

wlmouse
2009-03-13 15:29
建议你看看《SQL语言艺术》这本书。在纯SQL方面这本书告诉我们如何优雅的编写SQL操作数据库。我认为你们SQL语句编写不当的可能性相当大。两千万对于现在的数据库来说未必算大。

说真的,如何高效写SQL必须得学。有些人写的SQL要反复扫描一个表好几遍,优化一下语句能快好几百倍。连带着他写的HQL都有问题。你写SQL重复扫描,写HQL也一样。HQL被转化成SQL后,照样要反复读取。

beepbug
2009-03-13 19:12

ASP+储存过程+SQL Server

改为

.NET+储存过程+SQL Server

只是换了表现层,对检索速度没有影响。

Google搜索是一个分布式计算,没错。不过Google搜索所处理的数据,本身就是分布的。现在楼主的数据是集中的,需要先把它分布化。不过,把库拆成几个小库,确实能提高检索速度。

你说了“一般数据库的优化方法都用在上面了”,可你没说到表结构设计。这个才是重要因素。

优化方法包括建索引吧?提醒一点,索引过多,会明显降低检索速度。只建必要的索引。

楼上说的对,最后该优化SQL语句。

usejava
2009-04-20 10:47
两千万行不是多大的数据啊,这点数据优化下SQL和数据库应该就没问题了。

我那个两亿多行的数据也就一台服务器。别轻易搞什么分布,效率可能还更差。

猜你喜欢