考虑到可读性和性能,格式化以下sql语句的更好方法是什么.谢谢.
sql = (char *)" SELECT * ,rowid FROM tblEvent_basic " " WHERE " " service_id = ? AND " " (" " (start_time >= ? AND start_time <= ?) OR " " (end_time > ? AND end_time ) OR " " (start_time < ? AND end_time > ?)" " )" " ORDER by start_time ASC";
编辑:1.sqlite3数据库引擎; 使用C API;在MIPS24K 250M嵌入式CPU上运行.
2.第2,第4,第6参数相同,第3,第5,第7参数相同.
rc = sqlite3_bind_int(sql_stmt,1,service_id); rc = sqlite3_bind_text(sql_stmt,2,ts.start, 5, SQLITE_TRANSIENT); rc = sqlite3_bind_text(sql_stmt,3,ts.end , 5, SQLITE_TRANSIENT); rc = sqlite3_bind_text(sql_stmt,4,ts.start, 5, SQLITE_TRANSIENT); rc = sqlite3_bind_text(sql_stmt,5,ts.end , 5, SQLITE_TRANSIENT); rc = sqlite3_bind_text(sql_stmt,6,ts.start, 5, SQLITE_TRANSIENT); rc = sqlite3_bind_text(sql_stmt,7,ts.end , 5, SQLITE_TRANSIENT);
Jonathan Lef.. 6
你的时间条件目前是:
" (start_time >= ? AND start_time <= ?) OR " " (end_time > ? AND end_time ) OR " " (start_time < ? AND end_time > ?)"
我们可以使用一些空格立即提高可读性(使用恒定宽度字体):
" (start_time >= ? AND start_time <= ?) OR " " (end_time > ? AND end_time < ?) OR " " (start_time < ? AND end_time > ?)"
从评论中,我们知道相同的值将被传递给占位符1,3,5,并且不同的值将被传递给占位符2,4,6(但它们也都获得相同的值).此外,如果我们所说的那个时代t1
和t2
,那么我们可以假设t1 <= t2
.
那么,这个标准是什么?
开始时间落在t1..t2范围内
结束时间落在t1..t2的范围内
开始时间早于t1,结束时间晚于t2
这是一个艰难的重叠标准 - 它应该被替换为:
"(start_time <= ? AND end_time >= ?)"
除了占位符一个在这里对应t2
,占位符二对应t1
.如果您不希望计算符合时间范围的事件(即,您不希望计算在当前结束t1
的事件或在此时开始的事件t2
),则更改' >=
'和' '分别<=
' >
'和' <
'.
这是在包括结束时间时写入重叠谓词的标准方法.条件更简单 - 没有OR术语 - 并且是可靠的.它会更快,因为优化器的工作量较少,可能执行引擎的应用标准较少.(一个非常好的优化器可能会发现2占位符和6占位符版本的等价,但我不想打赌这样做 - 尤其是因为优化器不能告诉占位符1,3,5将是同样,占位符2,4,6也不会相同;只有在执行该声明时,如果它不愿重新优化,则只能确定.)
你的时间条件目前是:
" (start_time >= ? AND start_time <= ?) OR " " (end_time > ? AND end_time ) OR " " (start_time < ? AND end_time > ?)"
我们可以使用一些空格立即提高可读性(使用恒定宽度字体):
" (start_time >= ? AND start_time <= ?) OR " " (end_time > ? AND end_time < ?) OR " " (start_time < ? AND end_time > ?)"
从评论中,我们知道相同的值将被传递给占位符1,3,5,并且不同的值将被传递给占位符2,4,6(但它们也都获得相同的值).此外,如果我们所说的那个时代t1
和t2
,那么我们可以假设t1 <= t2
.
那么,这个标准是什么?
开始时间落在t1..t2范围内
结束时间落在t1..t2的范围内
开始时间早于t1,结束时间晚于t2
这是一个艰难的重叠标准 - 它应该被替换为:
"(start_time <= ? AND end_time >= ?)"
除了占位符一个在这里对应t2
,占位符二对应t1
.如果您不希望计算符合时间范围的事件(即,您不希望计算在当前结束t1
的事件或在此时开始的事件t2
),则更改' >=
'和' '分别<=
' >
'和' <
'.
这是在包括结束时间时写入重叠谓词的标准方法.条件更简单 - 没有OR术语 - 并且是可靠的.它会更快,因为优化器的工作量较少,可能执行引擎的应用标准较少.(一个非常好的优化器可能会发现2占位符和6占位符版本的等价,但我不想打赌这样做 - 尤其是因为优化器不能告诉占位符1,3,5将是同样,占位符2,4,6也不会相同;只有在执行该声明时,如果它不愿重新优化,则只能确定.)
对于初学者,您可以使用BETWEEN而不是> =和<=.这将使查询多更易读,而不会对性能产生任何影响.至于优化性能查询,您应该考虑使用数据库等效的EXPLAIN计划来为您提供有关查询在大部分时间内所占用位置的一些指示.