亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

SQL中where子句的順序重要嗎?

SQL中where子句的順序重要嗎?

慕工程0101907 2019-11-30 14:17:30
假設我有一個叫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"我認為第二個更快,因為LastName在where子句中,更獨特的標準()首先出現,并且記錄將更有效地消除。我認為優化器不夠聰明,無法優化第一個sql。我的理解正確嗎?
查看完整描述

3 回答

?
繁花如伊

TA貢獻2012條經驗 獲得超12個贊

不,順序無關緊要(或至少:不重要)。

任何體面的查詢優化器都會查看該子句的所有部分,WHERE并找出滿足該查詢的最有效方法。

我知道SQL Server查詢優化器將選擇合適的索引-無論您有兩個條件都處于哪個順序。我假設其他RDBMS也會有類似的策略。

重要的是您是否有合適的索引!

對于SQL Server,如果您具有以下條件,它將可能使用索引:

  • 索引 (LastName, FirstName)

  • 索引 (FirstName, LastName)

  • (LastName)或或(FirstName)(或兩者)的索引

另一方面-對于SQL Server而言-如果您習慣于從表中SELECT *獲取所有列,并且表很小,則查詢優化器很有可能只會進行表(或聚集索引)掃描而不是使用一個索引(因為查找整個數據頁面以獲取所有其他列的代價非??欤?。


查看完整回答
反對 回復 2019-11-30
?
慕村9548890

TA貢獻1884條經驗 獲得超4個贊

WHERE子句的順序不應在符合SQL標準的數據庫中有所作為。在大多數數據庫中,不能保證評估順序。


不要以為SQL關心順序。以下在SQL Server中生成錯誤:


select *

from INFORMATION_SCHEMA.TABLES

where ISNUMERIC(table_name) = 1 and CAST(table_name as int) <> 0

如果首先執行此子句的第一部分,則僅將數字表名強制轉換為整數。但是,它失敗了,提供了一個清楚的示例,表明SQL Server(與其他數據庫一樣)不關心WHERE語句中子句的順序。


查看完整回答
反對 回復 2019-11-30
?
慕神8447489

TA貢獻1780條經驗 獲得超1個贊

ANSI SQL草稿2003 5WD-01-Framework-2003-09.pdf


6.3.3.3規則評估順序


...


如果優先級不是由格式或括號確定的,則通常從左到右執行表達式的有效評估。但是,取決于表達式是否實際上是從左到右求值,這取決于實現,特別是在操作數或運算符可能導致條件升高或是否可以在不完全評估表達式所有部分的情況下確定表達式的結果時。


查看完整回答
反對 回復 2019-11-30
  • 3 回答
  • 0 關注
  • 1205 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號