当前位置:  开发笔记 > 数据库 > 正文

编写这个sql语句的推荐方法是什么?

如何解决《编写这个sql语句的推荐方法是什么?》经验,为你挑选了2个好方法。

考虑到可读性和性能,格式化以下sql语句的更好方法是什么.谢谢.

sql = (char *)" SELECT * ,rowid FROM tblEvent_basic "
                  " WHERE "
                  " service_id = ? AND "
                  " ("
                  " (start_time >= ? AND start_time <= ?) OR "
                  " (end_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  ?)"

我们可以使用一些空格立即提高可读性(使用恒定宽度字体):

            " (start_time >= ? AND start_time <= ?) OR "
            " (end_time    > ? AND end_time    < ?) OR "
            " (start_time  < ? AND end_time    > ?)"

从评论中,我们知道相同的值将被传递给占位符1,3,5,并且不同的值将被传递给占位符2,4,6(但它们也都获得相同的值).此外,如果我们所说的那个时代t1t2,那么我们可以假设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也不会相同;只有在执行该声明时,如果它不愿重新优化,则只能确定.)



1> Jonathan Lef..:

你的时间条件目前是:

            " (start_time >= ? AND start_time <= ?) OR "
            " (end_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(但它们也都获得相同的值).此外,如果我们所说的那个时代t1t2,那么我们可以假设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也不会相同;只有在执行该声明时,如果它不愿重新优化,则只能确定.)



2> Bojan Rajkov..:

对于初学者,您可以使用BETWEEN而不是> =和<=.这将使查询更易读,而不会对性能产生任何影响.至于优化性能查询,您应该考虑使用数据库等效的EXPLAIN计划来为您提供有关查询在大部分时间内所占用位置的一些指示.


在EXPLAIN上+1.但是,只有`start_time`范围是包容性的,所以它不会提高可读性.
推荐阅读
135369一生真爱_890
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有