挑战ASP+SQLServer性能极限,千万级数据量搜索优化,希望高手参与讨论

itboy3000 2005-04-09 08:43:50
一个数据量超过1000万的用户表,
包括姓名,地区,性别,生日,血型,收入情况,人气...等详细个人信息字段(字段数量超过30)

t_User:
--------------------------------
ID (int)
Name (nvarchar)
Gener (tinyint)
Birthday (datetime)
Location (int)
....

常用组合查询 地区+性别+年龄段 每天查询量10000次以上,可能有并发
不常用的组合查询 地区+性别+年龄+血型+收入情况+职业 每天查询量1000次以上,基本没有并发

原来系统设计:
对参与常用搜索的字段分别建立索引,平均搜索时间2分钟以上,CPU占用长期100%

求优化设计建议!




附原组合查询ASP代码:
-----------------------------------------------------------------------
SearchStr = "Select AccountID,NickName,Gender,Birthday,Height,Location,UpdateTime,Hot From t_Character Where 1=1"

If Request.Form("Gender")<>"" Then SearchStr = SearchStr & " And Gender=" & cint(Request.Form("Gender"))
If Request.Form("Age1")<>"" Then SearchStr = SearchStr & " And Birthday<='" & Year(Date)-Request.Form("Age1") & "-12-31'"
If Request.Form("Age2")<>"" Then SearchStr = SearchStr & " And Birthday>='" & Year(Date)-Request.Form("Age2") & "-1-1'"
If Request.Form("Height1")<>"" Then SearchStr = SearchStr & " And Height>=" & cint(Request.Form("Height1"))
If Request.Form("Height2")<>"" Then SearchStr = SearchStr & " And Height<=" & cint(Request.Form("Height2"))
If Request.Form("Weight1")<>"" Then SearchStr = SearchStr & " And Weight>=" & cint(Request.Form("Weight1"))
If Request.Form("Weight2")<>"" Then SearchStr = SearchStr & " And Weight<=" & cint(Request.Form("Weight2"))
If Request.Form("FindType")<>"" Then SearchStr = SearchStr & " And FindType=" & cint(Request.Form("FindType"))
If Request.Form("Marriage")<>"" Then SearchStr = SearchStr & " And Marriage=" & cint(Request.Form("Marriage"))
If Request.Form("Job")<>"" Then SearchStr = SearchStr & " And Job=" & cint(Request.Form("Job"))
If Request.Form("Income")<>"" Then SearchStr = SearchStr & " And Income=" & cint(Request.Form("Income"))
If Request.Form("Education")<>"" Then SearchStr = SearchStr & " And Education=" & cint(Request.Form("Education"))
If Request.Form("Blood")<>"" Then SearchStr = SearchStr & " And Blood=" & cint(Request.Form("Blood"))
If Request.Form("Location")<>"" Then SearchStr = SearchStr & " And Location=" & cint(Request.Form("Location"))

If Request.Form("UpdateTime")<>"" Then SearchStr = SearchStr & " And LastLoginTime <= '" & DateAdd("D",cint(Request.Form("UpdateTime")),Now()) & "'"


'SearchStr为最终的查询语句
...全文
247 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
soft_2008 2005-04-11
  • 打赏
  • 举报
回复
是啊,用存储过程或建聚集索引都可以缓和一些查询的困难,但效果都不会很好。原因,数据库的设计不良。一般用户多的数据库都会实现解构分层,固化高频率的查询集。如果AND与OR的逻辑设计得好,还可以利用数据索引实现快速精确的查询。
一个千万级的数据库居然还这样设计?!有点难以置信。
madpolice 2005-04-11
  • 打赏
  • 举报
回复
"地区+性别+年龄"建聚集索引
poron9 2005-04-11
  • 打赏
  • 举报
回复
呵呵,关注
lonelystar777 2005-04-10
  • 打赏
  • 举报
回复
你的查询代码本来就写得很烂,像birthday可以用datediff()来比较的
scoutlin 2005-04-10
  • 打赏
  • 举报
回复
o
songhp 2005-04-10
  • 打赏
  • 举报
回复
我也碰到这样的问题,已开始我也使适用存储过程,速度提升一些但是不明显,所以我想是不是可以从另外一个方面考虑这个问题,因为查询显示结果肯定是要分页的,那么可以在分页的古过程中来检查搜索数据,以减少记录集的读取数据量。类似 chen8967的说法,但是说实话我没有找到太好的方法,用存储过程没有办法得到总记录数,如果在存储过程中计算的话,感觉速度也不是很好。
网上虽然有很多的例子说明适用存储过程分页,但是示例的数据结构都非常简单,在实际开发过程中几乎没有那么简单或者规整的数据,所以不知道各位有没有更好的解决方法。请赐教!!!
chen8967 2005-04-10
  • 打赏
  • 举报
回复
我是这么想的:查询的结果是否可以分层显示,毕竟检索的结果太多,用户一下也看不了。
例如:第一个页面是查询年龄段的,第二个页面是这个年龄段中每个年龄的汇总数,然后才是具体年龄的信息,这样在最后那个页面的时候已经到具体的年龄。自然会快!
kkkbs 2005-04-10
  • 打赏
  • 举报
回复
简单的说

SQL的精华就是存储过程

假如想从本质上提升性能

WIN平台下.net最好

pzpower 2005-04-10
  • 打赏
  • 举报
回复
首先我觉得这么大的查询用asp这种解释性语言本来就会慢一拍
但如果从数据库上考虑我觉得你最好还在用存储过程
能用存储过程的最好用上
特别是使用频率较高的SQL语句,速度提升非常明显
另外就是注意建立索引,把经常在条件语句里使用的字段加上索引
但索引不能太多,否则会适得其反
复杂的系统要多摸索多尝试,找到最佳平衡点
itboy3000 2005-04-10
  • 打赏
  • 举报
回复
无人关注?

28,406

社区成员

发帖
与我相关
我的任务
社区描述
ASP即Active Server Pages,是Microsoft公司开发的服务器端脚本环境。
社区管理员
  • ASP
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧