假设我有一个名为PEOPLE3列的表ID, LastName, FirstName,这些列都没有被索引.
LastName更独特,FirstName更不独特.
如果我做2次搜索:
select * from PEOPLE where FirstName="F" and LastName="L"
select * from PEOPLE where LastName="L" and FirstName="F"
Run Code Online (Sandbox Code Playgroud)
我的信念是第二个更快,因为更独特的标准(LastName)在where条款中排在第一位,记录将更有效地消除.我不认为优化器足够聪明,可以优化第一个sql.
我的理解是否正确?
是否在文档中所描述的短路评价CASE和COALESCE()在SQL中使用时适用于序列?这似乎没有发生.
Oracle数据库使用短路评估.对于一个简单的
CASE表达式...如果先前的comparison_expr等于expr,Oracle从不评估comparison_expr.对于搜索的CASE表达式,数据库...如果先前条件为真,则永远不会评估条件.
同样,COALESCE() 文档说明:
Oracle数据库使用短路评估.数据库计算每个expr值并确定它是否为NULL,而不是在确定它们中的任何值是否为NULL之前评估所有expr值.
从SQL调用序列时,似乎不是这种情况; 正如您所看到的,不会发生短路并且序列会增加.
SQL> create sequence tmp_test_seq start with 1 increment by 1;
SQL> select tmp_test_seq.nextval from dual;
NEXTVAL
----------
1
SQL> select tmp_test_seq.currval from dual;
CURRVAL
----------
1
SQL> select coalesce(1, tmp_test_seq.nextval) from dual;
COALESCE(1,TMP_TEST_SEQ.NEXTVAL)
--------------------------------
1
SQL> select tmp_test_seq.currval from dual;
CURRVAL
----------
2
SQL> select case when 1 = 1 then 1 else tmp_test_seq.nextval end as s from dual;
S …Run Code Online (Sandbox Code Playgroud) 如果我在这些select查询之间有一个子句SELECT的IF EXISTS条件下编写两个语句,AND即使第一个SELECT返回false ,两个查询都会被执行吗?
IF EXISTS (SELECT....) AND EXISTS(SELECT ....)
BEGIN
END
Run Code Online (Sandbox Code Playgroud)
在这种情况下,SQL Server引擎是否同时执行SQL语句?
谢谢Krish
我正在使用linq过滤选择的MessageItems.我编写的方法接受一堆可能为null的参数.如果它们为null,则应忽略该文件的条件.如果它不为null,则使用它来过滤结果.
这是我的理解,当做一个|| operation是C#,如果第一个表达式为true,则不应计算第二个表达式.
例如
if(ExpressionOne() || ExpressionTwo())
{
// only ExpressionOne was evaluated because it was true
}
Run Code Online (Sandbox Code Playgroud)
现在,在linq,我正在尝试这个:
var messages = (from msg in dc.MessageItems
where String.IsNullOrEmpty(fromname) || (!String.IsNullOrEmpty(fromname) && msg.FromName.ToLower().Contains(fromname.ToLower()))
select msg);
Run Code Online (Sandbox Code Playgroud)
我原本以为这会是合理的,因为它String.IsNullOrEmpty(fromname)等于是真的和||的第二部分 不会跑.
然而它确实运行了,第二部分
msg.FromName.ToLower().Contains(fromname.ToLower()))
Run Code Online (Sandbox Code Playgroud)
抛出一个空引用异常(因为fromname为null)!! - 我得到一个经典的"对象引用没有设置为对象的实例"异常.
有帮助吗?
采用以下表达式: FALSE AND (expression)
MySQL会评估表达式,还是只要看到它就继续前进FALSE?
一些背景上下文 - 我想通过以下方式加快查询:
JOIN... ON (indexed_column1=indexed_column2 AND non_indexed_column_a=non_indexed_column_b)
有关我为什么要执行此查询的背景,请参阅此答案
如果它总是要评估non_indexed_column_a=non_indexed_column_b那么就没有时间了.
假设我有这样的查询:
SELECT bla WHERE foo LIKE '%bar%' AND boo = 'bar' AND whatvr IN ('foo', 'bar')...
Run Code Online (Sandbox Code Playgroud)
我想知道MySQL在检索结果时是否继续检查所有条件.例如.如果foo不是LIKE %bar%,它会继续检查是否boo = 'bar',等等?
如果我把最不可能的条件放在最后,那会更快吗?
我很抱歉,如果这似乎是一个愚蠢的问题,我谈到SQL时我是一个完整的菜鸟:)
我试图了解以下语句将如何在多个记录上执行.
SELECT * FROM test
WHERE product='$product'
AND (summary LIKE '%$keywords%' OR exp LIKE '%$keywords%')
ORDER BY `$order_by` DESC;
Run Code Online (Sandbox Code Playgroud)
我对SQL很新,所以这就是我想知道的:
1.当您执行SQL查询时,我相信它会查看表中的每一行.找到匹配项后,它会暂时存储结果,直到返回所有结果为止?
2.在上面的例子中,假设我们正在查看表中的单行并且匹配summary.当查询OR exp LIKE '%$keywords%'已找到匹配时,查询是否会继续执行?
一旦条件满足,是否可以让SQL停止检查WHERE子句?例如,如果我有如下声明:
SELECT * FROM Table1
WHERE Table1.SubID = (SELECT TOP 1 SubID FROM Table2 ORDER BY Date DESC)
OR Table1.OrderID = (SELECT TOP 1 OrderID FROM Table2 ORDER BY Date DESC)
Run Code Online (Sandbox Code Playgroud)
第一次检查后是否可以停止执行?实质上,只应使用where子句中的两个检查中的一个,优先于第一个.以下示例案例.
示例案例:
情况1
Table1 SubID=600 OrderID=5
Table2 TOP 1 SubID=NULL
Table2 TOP 1 OrderID=5
Matches the OrderID to 5
Run Code Online (Sandbox Code Playgroud)
案例2
Table1 SubId=600 OrderId=5
Table2 Top 1 SubID=600
Table2 Top 1 OrderID=3
Matches to SubID=600, not OrderID=3
Run Code Online (Sandbox Code Playgroud)
鉴于建议的答案,with似乎是解决SQL本身无法做到的最佳解决方案.对于我的具体情况,问题出在试图将其放入时outer apply,如下所示.
SELECT * FROM tbl_MainFields
OUTER APPLY
( …Run Code Online (Sandbox Code Playgroud) 假设我必须运行 SQL 查询:
SELECT data FROM table WHERE condition1 AND condition2 AND condition3 AND condition4
Run Code Online (Sandbox Code Playgroud)
这有什么不同吗
SELECT data FROM table WHERE condition3 AND condition1 AND condition4 AND condition2
Run Code Online (Sandbox Code Playgroud)
?
如果没有不同:
根据我自己的经验,我知道condition1比condition2便宜 比condition3便宜 比 便宜condition4。
如果不满足任何先决条件,则不应检查其余条件。由于涉及存储函数,因此优化器不会立即明显。我应该如何编写执行此操作的查询?
有没有办法明确说明发生WHERE条件的顺序?我意识到查询优化器将查看WHERE子句的所有部分,以确定满足查询的最有效方法,如以下答案中所述:
但是,有没有办法检查其他条件会依赖的条件?这些线程的答案之一涉及到我所追求的,但没有提供解决方案:
select *
from INFORMATION_SCHEMA.TABLES
where ISNUMERIC(table_name) = 1 and CAST(table_name as int) <> 0
Run Code Online (Sandbox Code Playgroud)
这可能会失败,因为可以在确定table_name字段是否为数字之前评估CAST(因此会为无效转换引发错误).
当然必须有办法实现这一目标吗?
sql ×7
mysql ×4
sql-server ×2
t-sql ×2
.net ×1
c# ×1
if-statement ×1
linq ×1
linq-to-sql ×1
logic ×1
null ×1
oracle ×1
oracle11g ×1
performance ×1
plsql ×1
select ×1
sequence ×1
where ×1
where-clause ×1