sql - 检索订单

时间:2015-03-12 09:22:11

标签: sql rdbms

我昨天向同事解释了我的SQL查询,他向我问了一个我从未考虑过的问题。

我们假设我有一张名为the_table的表格

col1            col2
www.toto.com    stuff_wedding
www.toto.com    stuff_boxing
www.toto.com    stuff_love
www.toto.com    stuff_wedding

我的查询是:

SELECT * FROM the_table WHERE col1 LIKE '%toto.com%' AND col LIKE '%wedding%';

我应该

col1            col2
www.toto.com    stuff_wedding
www.toto.com    stuff_wedding

问题如下:

在我的情况下执行AND时,SQL解析是否针对每一行,在col1上查找toto,一旦查询找到它们,将所有结果重新组合为col1中的toto并查找col2中的婚礼特定子集?

或者看看任何一行,为col1寻找toto然后如果col1中有一个toto那么去col2,并寻找婚礼?

我对这一点感到有点困惑,因为我从来没有真正考虑过它。另外,数据库引擎是否与解析完成有关?

谢谢

1 个答案:

答案 0 :(得分:0)

对于SQL Server,请检查此Understanding-how-SQL-Server-executes-a-query

我认为你的答案就在这里:

  

寻求运营商
      搜索运算符可以直接根据键定位行。 Seek只能在B-Tree组织的数据源上运行,所以它只能是   应用于Clustered和Nonclustered索引。如果索引有   复杂的键(多列)然后Seek操作符只能操作   if是否提供了索引定义中最左侧键的值。   举个例子,如果一个索引有关键列(A,B,C),那么   Seek可以找到A =' a'或第一行所在的第一行   A ='一个' AND B =' b'或者第一行,其中A =' a' AND B =' b' AND C =' c'。   但是,在这样的索引上,Seek无法找到B =' b'或者a   行C =' c'。 Seek操作员也能够实现范围。   给定(A,B,C)相同的索引定义,Seek运算符可以   迭代所有行,其中A> '一个'和A< ' Z'或所有A =' a'   &B> ' B'和B< ' z',但它无法迭代B> 1的行。 ' B'和   B< ' Z&#39 ;.如果您检查执行计划,您可能会看到任何执行计划   运营商Clustered Index Seek或Remote Index Seek。他们是   不同的运算符,因为它们适用于不同的数据源,但是   它们都具有有效定位定位的能力   row base dona key value或在一系列键上有效迭代   值。显然,没有堆搜索操作符,就像堆栈一样   无序的,没有能力有效地定位行   基于一把钥匙。寻求应该是首选的数据访问方法   几乎所有情况。