我昨天向同事解释了我的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,并寻找婚礼?
我对这一点感到有点困惑,因为我从来没有真正考虑过它。另外,数据库引擎是否与解析完成有关?
谢谢
答案 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或在一系列键上有效迭代 值。显然,没有堆搜索操作符,就像堆栈一样 无序的,没有能力有效地定位行 基于一把钥匙。寻求应该是首选的数据访问方法 几乎所有情况。