一个简单的SQL最优写法讨论(1)

最近在处理SQL的优化工作,拿一些碰到的例子大家一起讨论一下,希望有更多的人参与,请在发表时说明是什么数据库:

第一个语句:

SELECT A,B,C FROM T1 WHERE C>5

有没有更好的写法?

补充一下前提条件:

1.海量数据存在这个表中;

2.表中的C列值有很多,但是有重复;

A  B  C

A1  XE  9

AY  BV  7

QM  UH  5

AS  UU  8

AA  PO  6

JI    A0  4

ER  6     9

U8  G5   6

AM  EW  2

...

WE  XX  67867433134

我想再等一下的,但是,没有人告诉我有什么优化的地方,我就说说我的理解和想法,各位看官请评一下,如有不对的请指教!

第一点:数据量大,多值

  建立索引是必需的;

第二点:找值的理解

  有了索引后,那索引可能已是以下的排序方式,我们看看会不会有可能是这样:

表: A  B  C

  A1  XE  5

  AY  BV  5

  QM  UH  6

  AS  UU  4

索引:

  C  地址

  4  OXD001

  5  OXD002

  5  OXD003

  6  OXD004

OK,SELECT A,B,C FROM T1 WHERE C>5 看看是否会这样

OXD002 的5和这里的条件5比较

OXD003 的5和这里的条件5比较

OXD004 的6和这里的条件5比较

结果是找到有用的6.

以上的条件放大,4有1亿行;5有3亿行;6有500万行,2有1000万行,那扫描的行数是不是会可能是3亿行+500万行?

看出点子来了吧?

我们可以改这条语句了,看看这样写:

  SELECT A,B,C FROM T1 WHERE C>=6

那你又怎么理解在索引中的扫描查找过程?

OXD004 的6和这里的条件6比较

结果是找到有用的6.

我的结论:

因为我们不知道数据库引擎会怎么理解这两个语句,应该是不同的版本不同厂商有可能不同.但是,C>5有可能要扫描5有可能不用,C>=6是绝对不用扫描5(在不同的版本中是有可能的).这样,上边的扫描行数可能从这个条件中看出可能存在的差异,扫描3亿500万行还是500万行,也就可能存在10分钟与5小时或更多的差异.

请发表你的看法!


本文原创,转载请注明出处.

posted @ 2010-09-13 09:56  谢堂文(Darren Xie)  阅读(859)  评论(8编辑  收藏  举报