一个简单的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小时或更多的差异.
请发表你的看法!
本文原创,转载请注明出处.