SQL选择/从/从何处运行速度

SQL选择/从/从何处运行速度,sql,vb.net,select,where,Sql,Vb.net,Select,Where,我有一个程序,它从VisualFoxpro表中提取数据,并使用VB.net将数据转储到数据集中。我的连接字符串工作得很好,我使用的查询通常运行速度相当快。然而,当我运行了更多的时候,我发现我的表中有大量的“坏”数据。所以现在,我正试图改进我的查询,以缓冲“坏”数据,但我认为这是一个非常小的调整,导致了巨大的性能损失,我不太清楚为什么 我最初的问题是: 'Pull desired columns for orders that have not "shipped" and were receive

我有一个程序,它从VisualFoxpro表中提取数据,并使用VB.net将数据转储到数据集中。我的连接字符串工作得很好,我使用的查询通常运行速度相当快。然而,当我运行了更多的时候,我发现我的表中有大量的“坏”数据。所以现在,我正试图改进我的查询,以缓冲“坏”数据,但我认为这是一个非常小的调整,导致了巨大的性能损失,我不太清楚为什么

我最初的问题是:

'Pull desired columns for orders that have not "shipped" and were received in past 60 days.
'To "ship", an order must qualify with both an updated ship date and Sales Order #.
sqlSelect = "SELECT job_id,cust_id,total_sale,received,due,end_qty,job_descr,shipped,so "
sqlFrom = "FROM job "
sqlWhere = "WHERE fac = 'North Side' AND shipped < {12/30/1899} AND so = '' AND received >= DATE()-60;"
sql = sqlSelect & sqlFrom & sqlWhere
我的表演跳到了3分40秒。此时间几乎与运行
sqlWhere=“WHERE received>=DATE();”
的时间完全相同

我不是这些表格的主持人;我只是从他们那里为我们的用户创建一系列报告。我最好的猜测是接收字段没有索引,这是我性能下降的原因。但是,虽然我的第一次搜索返回了大约100条记录,但仅从今天开始提取这些工作返回了大约5条记录,仍然需要大约11倍的时间

因此,我的问题分为三个部分: 1) 有人能解释我现在所经历的现象吗?我觉得我在某种程度上走上了正确的道路,但我对SQL的了解仅限于在其他语言中的环境使用。。。 2) 是否有我遗漏的东西,或者有更好的方法来获得我需要的结果?有大量记录没有“发货”,只是因为用户只输入发货日期或s/o,而没有输入其他日期或s/o。我需要一种方法来查看最近的订单(无论“已发货”状态如何),然后还可以查看包含“坏”数据的较新订单,这样我就可以让用户养成清理数据的习惯。 3) 过度约束WHERE子句是一种不好的SQL实践吗?如果我运行15个字段比较,再加上嵌套的AND/OR,当我可以做更干净的事情时,我是在浪费时间吗

非常感谢,,
B

如果要在WHERE字符串中查找未编制索引的记录,SQL引擎必须执行表扫描,即查看表中的每条记录

这两个查询之间的区别在于使用OR而不是AND。当AND中有一个非索引列时,SQL引擎可以使用索引来缩小它必须查看的非索引列的记录数。当您有一个OR时,它现在必须查看表中的每条记录并在该列上进行比较

在接收列上添加索引可能会解决性能问题

通常,在WHERE子句中有两件事是您不希望发生的。 1.非索引列上的主要条件 2.在柱上使用计算。例如,执行WHERE Shipped-2 通过多个WHERE子句优化查询通常是一件好事。您需要返回到应用程序的记录越少,性能就越好,但您需要有适当的索引

'Find jobs that haven't "shipped" OR were received within last 21 days.
'Recently shipped items are desired in results.
sqlWhere = "WHERE fac = 'North Side' AND ((shipped < {12/30/1899} AND so = '') OR received >= DATE()-21);"