用带索引的视图,MCDBA考试有一道题和这个很像。

解决方案 »

  1.   

    个人倾向于直接查,条件越多自动优化越好。测试方法建议:
    1、用查询分析器。
    2、每个语句都连续执行多次,求平均时间。
    3、取时间可以用select convert(char(30),getdate(),113)。
    4、用tempdb的话测试要包含DROP TABLE #语句。
      

  2.   

    我没有做测试,个人观点如下:这要分成两种情况:1.如果公共条件不变:我倾向于类似ccat(阿猫) 的做法,也就是建一个查询公共条件的视图(索引视图SQL SERVER要到2000才有),然后在此视图基础上的再查询各自条件。另外公共条件建索引。
    视图:
    Create View v_view( ... ) As Select ... from a where 公共条件...
    查询时:
    Select ... from v_view where 各自条件....理由如下:(1)建索引这就不用说了。
    (2)用视图在这里可能会比较巧妙,因为视图建好后即可预编译完成等待调用,这样带视图的查询会分成两次查询还完成,第一次是视图的查询,我们称为A查询,第二次是用视图的结果集与其他的表连接(或就只有视图本身)来查询,我们称为B查询。这样将有:
      (a)由于连续有很多次查询,那么只是B查询不同,A查询将不断重复。大部分的数据库对于近期重复的查询或相近的查询都有优化功能,后面的查询将会明显比第一次快。所以从不断重复查询的角度分析应该会快点。
      (b)对于单次查询来说,由于B查询“是用视图的结果集与其他的表连接(或就只有视图本身)来查询”,所以很明显,这相当于用了一个临时表(临时表在大数据量的表中检索数据的作用,我记得我在其他帖子说过。)。所以只从单次查询的角度来分析,也有这个因素可以快一点。
    (3)条件少的查询会比条件多的查询明显快很多,原因很明显。
    这个大家可以试一下两个同样结果集的查询,一个只有一个条件,一个有5个条件试一下就很明显了。通过视图,把一长串的条件拆成两部分,对于后面的查询来说,A查询基本上就不怎么样花运算时间,系统所需要判断的条件就只有B查询的条件,条件少了,所以也对速度有帮助。2.如果公共条件会变化的话
    其他的一样,就是不能建立视图,那么就使用各种方法来达到动态视图的效果,比如:
    建临时表(这是最差的选择,原因不详述)
    或 Select ... into ... from ... where ...
    或 SQl Server 2000 的表变量之类的
    或 db2的表表达式(可参见http://www.csdn.net/expert/topic/510/510561.xml?temp=.1327936)
    等等。提高速度的原理跟上面一样,不过由于步骤多点(DB2的表表达式除外),系统的最低开销会相应大点,所以如果是海量数据的查询会更有优势一点。有点类似于手抄与印刷的比较,如果只要一本,手抄快,印刷还得排版,还得制版,还得印。如果只有少量数据,那就是折腾了。
    以上只是凭借个人经验的理论上推断,没有测试,最后还得事实说了算。
      

  3.   

    尽量不要用 select *, 只选取有需要的字段如 select field1, field2,...
    所有 where中的条件有关的字段, 是否有适当的index
      

  4.   

    明白你的意思了,如果在同一个过程里:
    select * from a where 公用条件1 and 公用条件2 and 公用条件3 
    显然没必要重复run 5次,当然是生成一个中间结果集好,而且从一个小
    的数据集里检索所需的结果也显然更快。
      

  5.   

    至少select * from a where 公用条件1 and 公用条件2 and 公用条件3 可以先放在临时表tmp里,
    然后
    select * from tmp where 条件1
    select * from tmp where 条件2
    select * from tmp where 条件3
    select * from tmp where 条件4
      

  6.   

    刚才做了个测试,发现好像要根据具体情况了。
    公用条件过滤出的数据要适度,如果太多和太少,使用临时表的速度还不如直接查(写到这突然发现自己很傻,明摆着的事情)。
    另外,使用临时表的时候,如果产生两个临时表#t1 and #t2 ,而又需要交叉查询的时候,速度很慢,从一个临时表切换到另一个临时表花的时间比直接从数据库查还要慢,当然切换过来后速度要好一点。我是使用SQL的事件查看器来观察的。视图我没有用过,现在来不及用了,明天要出差,回来一定测试一下。另外,关于SQL的内存管理的事情我很不明白。SQL为什么会占用那么多的内存,而且一直用满为止,才从头重新分配。按道理,内存使用完毕后应该会释放的,不必要等待再次使用的时候,起码学习操作系统的时候理解成是这个道理。也许数据库管理有其不方便的地方?总之,看到内存用量蹭蹭的上窜,脸都白了。
      

  7.   

    我觉得用视图方式是一种选择:create view viewTB as select * from a where 公用条件1 and 公用条件2 and 公用条件3 ;
    select * from viewTb where  条件1 and ....... 
    select * from viewTb where  条件2 and ....... 
    select * from viewTb where  条件3 and .......