2013-04-28 97 views
0

我對Oracle很陌生。我有一個表,這裏的一些疑問:oracle sql查詢執行順序

http://sqlfiddle.com/#!4/a7b7c/1

我不知道如何查詢:

select distinct name,id from test; 

select name,id from test group by name,id; 

生產相同輸出。如何在oracle中,我可以找到執行上述查詢的順序?它隨機的每個數據?或者有一種方法可以執行所有數據集。

回答

1

通常,如果你想進行性能調試,你會使用像這樣的解釋計劃:

解釋計劃 SELECT DISTINCT姓名,身份證 來自測試;

解釋計劃 SELECT NAME,ID FROM TEST GROUP BY(NAME,ID);

這將告訴你查詢優化器認爲哪種處理是最好的,你不能保證你總是會得到相同的計劃,例如,如果你添加索引計劃可能會改變,你可以使用提示,但我不會我不認爲我已經看到他們實際上正在使用

1

所有查詢產生相同結果的原因是因爲表具有唯一值。

使用「group by」在這種情況下是沒有意義的。當你想計算或求和(或其他數學運算)時,使用「group by」。這裏是一個例子:

select name, count(*) ct from test group by name 

這將顯示名稱和名稱在表格中出現的次數。

關於輸出的順序:Oracle將按照隨機順序返回行,直到指示爲止。因此,要指定一個特定的順序,那麼「按訂單」子句中使用如:

select name,id from test order by name, id; 

然後你保證的結果將返回按名稱排序。如果名稱不止一次出現,它們將按ID排序。

1

如何在oracle中我可以找到上述查詢的執行順序?它隨機的每個數據?或者有一種方法可以執行所有數據集。

在SQL中,其中行確定的順序是不確定除非你要求一個明確使用order by條款。 (如果沒有,你會在他們找到符合您的查詢的順序得到行,以及他們將取決於查詢計劃。)

[查詢都是]生產相同輸出爲

這是因爲你有id。據推測,它們都是獨特的,並被標記爲實際模式中的主鍵。

distinct,順便說一句,是一個group by所有檢索字段的所有意圖和目的。

無論如何,如果你想要的行順序一致,你想要的東西像order by name, id

1

看看你的SQL小提琴:表中有五條記錄,包含NAME和ID的五種組合。所以你發佈的查詢只會返回所有行。有效它們是相同的,因爲這查詢...

select name, id from test; 

...只爲多少價值排序數據庫承諾確保其唯一性的額外資源消耗。添加一個複製NAME和ID但具有不同EMAIL的新記錄將幫助您瞭解正在發生的事情。

您應該明白在實際生活中使用DISTINCT實際上相當罕見:正確定義的WHERE子句應該足以生成唯一的結果集。 GROUP BY通常與COUNT()或SUM()之類的聚合函數一起使用;例如,有多少個NAME + ID擁有多個EMAIL?

select name, id from test 
group by name, id having count(*) > 1; 

至於排序,您執行的查詢需要排序,因此結果集的順序可能與輸入順序不同。 Oracle不保證其結果集的順序,但排序使得它更不可預測。爲了得到這樣的保證,必須指定一個ORDER BY子句:

select distinct name, id from test 
order by name, id 

這ORDER BY子句將保證相同的順序進行任何聲明,無論在過濾時會發生什麼其他的處理和處理結果集。