簡體   English   中英

索引查詢優化= SQL

[英]Indexed Query Optimisation = SQL

這是我過去考試題的一部分 -

優化以下內容並假設Members.lname上有一個索引:

SELECT fname, lname 
FROM Members 
WHERE lname <> 'Rogers' 
  AND memberType='Student'; 

因此我嘗試過:

SELECT fname, lname 
FROM Members 
WHERE lname > 'Rogers' OR lname < 'Rogers'AND memberType='Student'; 

我試過這個,因為分裂<>強制使用索引 - 但我的回答是錯誤的。 我想知道是否有人可以提供幫助並指出我正確的方向?

在我看來,原始查詢本身無法進行優化。

lname有索引應該對查詢沒有影響。 所有成員都有一個名字,很少有成員將成為羅傑斯。 所以DBMS不應該使用索引,而只是讀取整個表。

但是,“優化以下內容”可能允許通過創建另一個索引來間接優化查詢。 該索引至少應包含並以memberType

create index idx1 on members (membertype);

此索引是否將用於查詢可能取決於表中的內容。 如果99%的成員是學生,則DBMS應該讀取完整的表格。 如果只有少數學生(比如說3%),那么使用索引是有意義的,DBMS會使用索引查找表中的學生,然后檢查記錄中的lname

說完這個,我們可能會想要這個:

create index idx2 on members (membertype, lname);

所以DBMS讀取索引,找到學生,立即看到名稱是否為Rogers,並且只訪問表中所需的記錄。

更好的索引仍然是包含所有相關列的覆蓋索引,因此不再需要讀取表,因為所有信息都在索引中:

create index idx3 on members (membertype, lname, fname);

如前所述,當DBMS假定大多數記錄仍然匹配時,它仍然可以讀取整個表。 索引只是DBMS可能使用與否的提議。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM