求提高查询效率方案

zxyufan 2002-01-31 12:40:57
环境:DB2+WebLogic+Java

数据量以纯文本计算的话都可以上G,而且仅仅是某几个大表。而且大表和多个小表有关联关系。比如有商品基本信息表,扩展出来有Book表,Audio表,Video表,这四个都是大家伙,跟他们相关的还有折扣信息表,出版社信息表,关键字表,用户评论表等小型表。

做高级检索的时候用普通的SQL关联查询根本不能达到一个让人勉强可以接受的速度。甚至是慢得吓人。

请熟悉大数据量开发环境或有相关开发经验的朋友指点一二,不胜感激哦~:)

...全文
192 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
overflow2002 2002-02-06
  • 打赏
  • 举报
回复
关注!
overflow2002 2002-02-05
  • 打赏
  • 举报
回复
索引
easyfree 2002-02-04
  • 打赏
  • 举报
回复
优化的题目太大了, 你不妨给出实例来分析
你没说你是什么数据库, 是olap还是oltp, 检索的复杂程度和能否拆分等等

笼统的原则楼上说了一些了, 优化的次序是: 设计结构->sql语句->物理存储
liujianjun 2002-02-04
  • 打赏
  • 举报
回复
我觉得还是拆分表比较好,比如一个表,有经常用的数据,举个例子,有历史数据,有本年数据,历史数据一个表,本年数据一个表。从查询的优化来讲,是有限度的
yxl1108 2002-02-04
  • 打赏
  • 举报
回复
我觉得索引的建立是和用户的需求相关的.应该在用户经常检索的列上建立索引.几个G不能算是一个大的数据库,应该不会出现不能接受的速度.
yanchang 2002-02-04
  • 打赏
  • 举报
回复
索引一定要有
bluepower2008 2002-02-04
  • 打赏
  • 举报
回复
为什么数据离散性太大,索引建了可能也没多大效果呢?
只要某个字段不是局限在几个值之间,数据越是分散,索引的效果越是好,怎么会没有效果呢?


D_M 2002-02-04
  • 打赏
  • 举报
回复
To 楼上各位,
关于建立索引的看法,我与bluepower2008(蓝色力量)的一样。

关于大表化成小表,zxyufan(宇凡) 和 liujianjun(流星尔) 可能理解错我的意思了。我说的意思是用DB2的表表达式来化,同时又可以在一个sql语句里面完成,这样可以直接用在一些控件里面,比如PB的DATAWINDOW。DB2的这个功能也是我比较喜欢的。
DB2的表表达式其实就是动态的视图,其中的公共表达式的语法大概是:
with 表表达式定义,表表达式定义
主查询语句
下面是个例子:
(1)

WITH
PAYLEVEL AS
(SELECT EMPNO, YEAR(HIREDATE) AS HIREYEAR, EDLEVEL,
SALARY+BONUS+COMM AS TOTAL_PAY
FROM EMPLOYEE
WHERE EDLEVEL > 16),

(2)
PAYBYED (EDUC_LEVEL, YEAR_OF_HIRE, AVG_TOTAL_PAY) AS
(SELECT EDLEVEL, HIREYEAR, AVG(TOTAL_PAY)
FROM PAYLEVEL
GROUP BY EDLEVEL, HIREYEAR)

(3)

SELECT EMPNO, EDLEVEL, YEAR_OF_HIRE, TOTAL_PAY, DECIMAL(AVG_TOTAL_PAY,7,2)
FROM PAYLEVEL, PAYBYED
WHERE EDLEVEL=EDUC_LEVEL
AND HIREYEAR = YEAR_OF_HIRE
AND TOTAL_PAY < AVG_TOTAL_PAY

其中(1) 、(2)就是表表达式的定义,其实它就是定义了一个结果集PAYLEVEL、PAYBYED,然后把这个结果集当表,(3)的主查询语句再用此两个结果集进行连接,这样在数据库的内部是先建临时表,用来存放表达式的结果集,然后再用结果集进行笛卡尔乘,显然,当表非常大,而我们只是想取其中一小部分进行运算时,这样的复杂度远远小于直接的连接。这也就是为什么能提高速度,为什么我说“把大表化成小表”的原因。我们所要作的就是在表表达式的定义加入WHERE条件,在大表里面过滤出小表来。这个当然与建立临时表类似,但显然后者麻烦很多,无法在一个sql里完成而且速度可能会慢点。
这个东西的好处还在于它是动态的,一般的视图是写死的。

另外DB2还有另一种表表达式---嵌套表表达式.SQL SERVER 也有类似功能。


zxyufan 2002-02-04
  • 打赏
  • 举报
回复
建索引是个办法~~但是象作者这样的的字段~~数据离散性太大~~索引建了可能也没多大效果~~

大表拆成小表可以吗???
bzszp 2002-02-04
  • 打赏
  • 举报
回复
一般就是通过建立索引来提高速度,再就是你的临时表空间要大一些,再就是机器配置了,内存也很重要.
sunwalkman 2002-02-01
  • 打赏
  • 举报
回复
学习并收藏
laurel 2002-02-01
  • 打赏
  • 举报
回复
关联表的外键都建立索引看看。
D_M 2002-02-01
  • 打赏
  • 举报
回复
蓝色力量说的对,最好有几个实际例子来分析比较好。

另外个人有几点经验可以参考:
1.可以给表做索引,但最好是不常更新的表,因为有几个不利因素要考虑,一个是作索引会减慢对数据的更新速度,另外也会占用更多储存空间。这个当然要与你其他功能模块综合考虑。
2.另外在写SQL时多做复杂度分析,最好不要只想直接,想到什么就什么。要以集合运算的本质来考虑问题。
3.你用的是DB2的数据库那就刚好了,多用表表达式,将大表化成小表再进行关联,可以大大提高速度,特别是对于大表效果特别明显,同时也可以达到一个SQL内完成的效果。
4.如果非常不幸的用了CURSOR,那就要非常坚决地抛弃它。那是速度毒药来的,除非是特别复杂的查询否则不要用。但就算是复杂的查询一般也都可以用CASE WHEN ...摆平。


bluepower2008 2002-01-31
  • 打赏
  • 举报
回复
如果只是想提高查询的效率,不想从数据库设计来着手,那一般就是给经常查询的字段建索引,对查询的sql语句进行优化,希望你能提供几个查询效率低的语句,大家给你分析分析,来解决你的问题。
zcflion 2002-01-31
  • 打赏
  • 举报
回复
在索引上做文章!!

用B+树索引会提高查询效率!

初生 2002-01-31
  • 打赏
  • 举报
回复
可能要真正的高手才可以解决答
zxyufan 2002-01-31
  • 打赏
  • 举报
回复
转眼我的帖子就到第三页去了~~
zxyufan 2002-01-31
  • 打赏
  • 举报
回复
faint ~~ 这个版人气真高~~

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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