faint ~~ 这个版人气真高~~

解决方案 »

  1.   

    如果只是想提高查询的效率,不想从数据库设计来着手,那一般就是给经常查询的字段建索引,对查询的sql语句进行优化,希望你能提供几个查询效率低的语句,大家给你分析分析,来解决你的问题。
      

  2.   

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

  3.   

    优化的题目太大了, 你不妨给出实例来分析
    你没说你是什么数据库, 是olap还是oltp, 检索的复杂程度和能否拆分等等笼统的原则楼上说了一些了, 优化的次序是: 设计结构->sql语句->物理存储
      

  4.   

    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 也有类似功能。