優化了哪個查詢
我已經為相同的操作編寫了這兩個查詢,基於時間複雜度,我想知道哪一個是有效的。
select Fname, Lname, Address from (select * from department d, employee e where d.Dnumber = e.Dno) as a where a.Dname = 'Research';
**編輯:**根據我的第一個評論,我假設 from 子句中的查詢將作為我命名為“a”的臨時表/視圖工作,並包含兩個表的所有列,我使用它。(我不’不知道這是一種有效的方法。)
要麼
select Fname, Lname, Address from employee where Dno = (select Dnumber from department where Dname = 'Research');
或者可能有更有效的方法來做到這一點。謝謝。
編輯2:
SELECT Pnumber, Dnum, Lname, Address, Bdate FROM employee JOIN department d ON d.Mgr_ssn = employee.Ssn JOIN project p ON p.Dnum = d.Dnumber WHERE p.Plocation = 'Stafford';
我有這個論點,你能告訴我這有什麼缺陷嗎?,
讓我們在每個 PROJECT、DEPARTMENT、EMPLOYEE 表中有 1000 行,
然後在上面的查詢中,編譯器將選擇連接必須應用的順序(ABC,ACB,BCA,BAC,…)選擇有效的順序。但是要為第一個選擇最好的,然後是第二個,……它必須執行所有並相互比較,再加上所涉及的元組的順序將是相同的(不確定,也許如果它適用員工,部門首先它只有 100-150 行,這完全取決於表……對嗎???)。我從來沒有在現場項目的情況下工作過,也許 JOINS 有一些我看不到的優點(有,這就是為什麼它是提前發布的)。但我不相信。
然後在下面的查詢中讓 250 成功,然後是帶有 DEPARTMENT 表的 CARTESIAN PRODUCT 並產生 2,50,000 個元組,假設 5,000 是 RESULT,然後又是帶有 1000 個元組的 CARTESIAN PRODUCT 產生 500,000 個。
SELECT Pnumber, Dnum, Lname, Address, Bdate FROM (SELECT Pnumber, Dnum, Mgr_ssn FROM department d, (SELECT Pnumber, Dnum FROM project where Plocation = 'Stafford') p WHERE d.Dnumber = p.Dnum) q, employee e WHERE q.Mgr_ssn = e.Ssn;
所以,我的問題是 JOIN 是簡單地編寫查詢,讓編譯器決定什麼是有效的順序。而在下面的一個中,我們已經為編譯器完成了幾乎所有的工作。
而且,我還有一個問題,WHERE 子句僅適用於一個關係?或者讓我換個說法,首先執行 FROM(連同所有 JOINS)子句,然後執行 where 子句,因為在這種情況下,使用 JOINS 的查詢將非常昂貴.
謝謝。
你也可以寫
SELECT Fname, Lname, Address FROM department JOIN employee ON employee.dno = department.dnumber WHERE department.Dname = 'Research';
這相當於查詢二並且可以是更清晰的形式(請參閱https://stackoverflow.com/questions/1599050/ansi-vs-non-ansi-sql-join-syntax以獲得描述為什麼首選新語法的答案)。大多數查詢優化器會看到這種等效性並為這樣一個簡單的查詢執行相同的操作,儘管對於更複雜的查詢可能並非如此(如果存在差異,則
JOIN
變體可能是兩者中更好的)。並不是說這幾乎等同於您的第一個查詢的內部部分,您使用的連接語法是較舊但等效的語法。當您在內部查詢中執行此操作時,只需在外部查詢中添加一個額外的過濾器,一個好的查詢規劃器就會將這些查詢視為相同並以完全相同的方式執行它們。一個糟糕的查詢計劃器將讓引擎首先執行內部查詢,然後應用額外的過濾子句,使其效率大大降低,具體取決於它要使用的索引。
但這一切都取決於您應該編輯問題和標籤以提供的一些內容:
- 您作為不同查詢計劃器使用的數據庫可能不會針對給定查詢以相同的方式優化(將數據庫和版本添加到標籤中)。
此外,大多數數據庫引擎都提供了一種方法來讀取查詢計劃程序可能對給定查詢執行的操作,這種情況有助於判斷哪個選項是最佳的 - 我不會在我知道的每個數據庫中列出如何執行此操作,是具體關於您正在使用的數據庫,我們可以更具體和相關我們給出的答案。 2. 相關表上的索引(將索引和鍵定義添加到問題文本中)
請注意,如果您執行第二個查詢並且其中有兩行
department
,name='Research'
那麼您可能會收到錯誤,因為該=
運算符只能在每一側處理一個值。要使用該名稱列出所有部門中的人員,請IN
改用。這可能會改變最有效的答案。