栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

SQLite是否在WHERe子句中使用多个AND条件优化查询?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

SQLite是否在WHERe子句中使用多个AND条件优化查询?

(根据评论和后续测试更新了答案。)

您问题的实际答案

如何确保如果我们有100万行,则对查询…进行优化,以便仅在易于测试的第二个条件已经为True时才测试第一个条件(CPU昂贵)?

取决于

  • WHERe子句中的实际条件,以及
  • SQLite查询优化器在估算这些条件的成本方面有多聪明。

一个简单的测试应该告诉您查询是否可以充分“优化”以满足您的需求。好消息是,至少在某些情况下,SQLite 将首先 执行轻松(廉价)条件。

对于测试表“ mytable”

CREATE TABLE mytable (    description TEXT(50) NOT NULL,    column2 INTEGER NOT NULL,    ConSTRAINT mytable_PK PRIMARY KEY (column2));

包含一百万行

description  column2-----------  -------row000000          0row000001          1row000002          2...row999999     999999

Python测试代码

import sqlite3import timelog_file_spec = r'C:UsersGordDesktoplog_file.txt'def myfunc(thing):    with open(log_file_spec, 'a') as log:        log.write('HODORn')    return(int(thing[-6:]))with open(log_file_spec, 'w'):    pass  # just empty the filecnxn = sqlite3.connect(r'C:__tmpSQLitetest.sqlite')cnxn.create_function("myfunction", 1, myfunc)crsr = cnxn.cursor()t0 = time.time()sql = """SELECt COUNT(*) AS n FROM mytableWHERe myfunction(description) < 500 AND column2 < 1000"""crsr.execute(sql)num_rows = crsr.fetchone()[0]print(f"{num_rows} rows found in {(time.time() - t0):.1f} seconds")cnxn.close()

退货

500 rows found in 1.2 seconds

并计数log_file.txt中的行,我们看到

C:UsersGord>find /C "HODOR" Desktoplog_file.txt---------- DESKTOPLOG_FILE.TXT: 1000

表明我们的函数仅被调用了1000次,而不是一百万次。SQLite显然已经应用了

column2 <1000
第一个
myfunction(description) < 500
条件,然后将该条件应用于了第一个条件的行子集。


(原始的“袖手旁观”答案。)

您问题的实际答案取决于查询优化器的智能程度。一个简单的测试应该告诉您查询是否可以充分“优化”以满足您的需求。

但是,如果您的测试发现您的原始方法太慢,则有两种选择:

选项1:尝试简单比较“第一个”

更改顺序可能会影响查询计划,例如

... WHERe <easy_condition> AND <expensive_condition>

可能会比

... WHERe <expensive_condition> AND <easy_condition>

选项2:尝试使用子查询强制执行顺序

再次,取决于查询优化器的智能性

SELECt easy.* FROM     (SELECt * FROM mytable WHERe column2 < 1000) easyWHERe myfunction(easy.description) < 500

可以先应用便宜的条件,然后再将昂贵的条件应用于结果的行子集。(但是,有注释表明,SQLite太复杂了,无法接受这种策略。)



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/646167.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号