假設下面的查詢需要很長時間才能運行。要提高此 SQL 查詢的運行時間,以下哪個選項是最好的方法?
SELECT Name
FROM People
WHERE Birth_Date > CAST('2000-01-01' AS DATE) ;
人是表的名稱。現在有4個選項:
- 將運算式替換為
Birth_Date以CAST (Birth_Date AS DATE)避免型別轉換。 CREATE INDEX IDX ON People (Birth_Date, Name)CREATE INDEX IDX ON People (Name, Birth_Date)- 創建一個包含此查詢的視圖,并將實際出生日期作為輸入引數。
哪個選項是最好的,為什么?
uj5u.com熱心網友回復:
選項 2。
選項 1 執行不必要的型別轉換,因為我們可能假設它Birth_Date已經是一個DATE(或兼容的型別),為什么還要'2000-01-01'強制轉換為DATE?由于額外的強制轉換,這無助于加快查詢速度,只會減慢它的速度。
選項 2 創建一個索引,其第一個成員是Birth_Date,因此引擎可以使用索引中的有效搜索來找到Birth_Date滿足WHERE條件的最少記錄,然后按照索引順序從那里輸出所有記錄。
選項 3 創建了一個無用的索引,因為Birth_Date它不是它的第一個成員,因此它不能用于有效地查找具有最少 的記錄Birth_Date,也不能用于按 的順序遍歷記錄Birth_Date。
選項 4 是不可能的,因為視圖不帶引數。即使某個資料庫引擎知道這個概念,它也只會影響WHERE條件的右側,而不是資料庫引擎可以用來檢索匹配記錄的演算法。
uj5u.com熱心網友回復:
基本上,您只需要在 People(Birth_Date) 上創建索引。因為,只有這一列作為條件涉及選擇性。
- 請不要 CAST (Birth_Date AS ),除非您創建函式索引,否則對列型別進行強制轉換會導致相關索引無效。沒必要這樣做。
- 對于您的 2 和 3,無需創建組合索引。列名不在條件串列中。對效率沒有幫助。
- 這是一個簡單的查詢,無需為此創建視圖。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/475232.html
標籤:sql
上一篇:SQL中特定列的總和
下一篇:在json字串中插入變數
