㈠ hive sql 優化的常用手段有哪些
1、join連接時的優化:當三個或多個以上的表進行join操作時,如果每個on使用相同的欄位連接時只會產生一個maprece。
2、join連接時的優化:當多個表進行查詢時,從左到右表的大小順序應該是從小到大。原因:hive在對每行記錄操作時會把其他表先緩存起來,直到掃描最後的表進行計算
3、在where字句中增加分區過濾器。
4、當可以使用left semi join 語法時不要使用inner join,前者效率更高。原因:對於左表中指定的一條記錄,一旦在右表中找到立即停止掃描。
㈡ spark sql怎麼劃分stage
其實sql就是關系操作。關系操作跟map,rece這些基礎運算元對應起來的(spark其實基礎運算元也是map,rece,只是在此基礎上做了擴展)。比如projection,filter是窄依賴,join,semi join,outer join是寬依賴。
具體流程會比較復雜。首先spark會解析這條sql,生成語法樹(spark2.0會通過antlr4解析),然後經過邏輯優化(dataframe中有logic plan),然後轉換為map rece,生成對應的操作運算元(projection,filter,join等)。有了寬依賴,窄依賴,也就能劃分stage了。
㈢ 資料庫(比如MYSQL) ,表連結查詢與子查詢哪個效率高些 為什麼
in子查詢、exists子查詢、連接,效率的探討
以下是SQL的幫助 (高級查詢優化概念)
Microsoft® SQL Server™ 2000 使用內存中的排序和哈希聯接技術執行排序、交集、聯合、差分等操作。SQL Server 利用這種類型的查詢計劃支持垂直表分區,有時稱其為分列存儲。
SQL Server 使用三種類型的聯接操作:
嵌套循環聯接
合並聯接
哈希聯接
如果一個聯接輸入很小(比如不到 10 行),而另一個聯接輸入很大而且已在其聯接列上創建索引,則索引嵌套循環是最快的聯接操作,因為它們需要最少的 I/O 和最少的比較。有關嵌套循環的更多信息,請參見了解嵌套循環聯接。
如果兩個聯接輸入並不小但已在二者聯接列上排序(例如,如果它們是通過掃描已排序的索引獲得的),則合並聯接是最快的聯接操作。如果兩個聯接輸入都很大,而且這兩個輸入的大小差不多,則預先排序的合並聯接提供的性能與哈希聯接相似。然而,如果兩個輸入的大小相差很大,則哈希聯接操作通常快得多。有關更多信息,請參見了解合並聯接。
哈希聯接可以有效處理很大的、未排序的非索引輸入。它們對復雜查詢的中間結果很有用,因為:
中間結果未經索引(除非已經顯式保存到磁碟上然後創建索引),而且生成時通常不為查詢計劃中的下一個操作進行適當的排序。
查詢優化器只估計中間結果的大小。由於估計的值在復雜查詢中可能有很大的誤差,因此如果中間結果比預期的大得多,則處理中間結果的演算法不僅必須有效而且必須適度弱化。
哈希聯接使得對非規范化的使用減少。非規范化一般通過減少聯接操作獲得更好的性能,盡管這樣做有冗餘之險(如不一致的更新)。哈希聯接則減少使用非規范化的需要。哈希聯接使垂直分區(用單獨的文件或索引代表單個表中的幾組列)得以成為物理資料庫設計的可行選項。有關更多信息,請參見了解哈希聯接。
㈣ 關於SQL中的集合查詢
比較兩個查詢的結果,返回非重復值。
EXCEPT 從左查詢中返回右查詢沒有找到的所有非重復值。
INTERSECT 返回 INTERSECT 操作數左右兩邊的兩個查詢都返回的所有非重復值。
以下是將使用 EXCEPT 或 INTERSECT 的兩個查詢的結果集組合起來的基本規則:
所有查詢中的列數和列的順序必須相同。
數據類型必須兼容。
Transact-SQL 語法約定
語法
{ <query_specification> | ( <query_expression> ) }
{ EXCEPT | INTERSECT }
{ <query_specification> | ( <query_expression> ) }
參數
<query_specification> | ( <query_expression> )
查詢規范或查詢表達式返回與來自另一個查詢規范或查詢表達式的數據相比較的數據。在 EXCEPT 或 INTERSECT 運算中,列的定義可以不同,但它們必須在隱式轉換後進行比較。如果數據類型不同,則用於執行比較並返回結果的類型是基於數據類型優先順序的規則確定的。
如果類型相同,但精度、小數位數或長度不同,則根據用於合並表達式的相同規則來確定結果。有關詳細信息,請參閱 精度、小數位數和長度 (Transact-SQL)。
查詢規范或表達式不能返回 xml、text、ntext、image 或非二進制 CLR 用戶定義類型列,因為這些數據類型不可比較。
EXCEPT
從 EXCEPT 操作數左邊的查詢中返回右邊的查詢未返回的所有非重復值。
INTERSECT
返回 INTERSECT 操作數左右兩邊的兩個查詢均返回的所有非重復值。
備注
如果 EXCEPT 或 INTERSECT 操作數左邊和右邊的查詢返回的可比較列的數據類型是具有不同排序規則的字元數據類型,則根據排序規則優先順序的規則執行所需的比較。如果無法執行此轉換,Microsoft SQL Server 2005 資料庫引擎將返回錯誤。
通過比較行來確定非重復值時,兩個 NULL 值被視為相等。
EXCEPT 或 INTERSECT 返回的結果集的列名與操作數左側的查詢返回的列名相同。
ORDER BY 子句中的列名或別名必須引用左側查詢返回的列名。
EXCEPT 或 INTERSECT 返回的結果集中的任何列的為空性與操作數左側的查詢返回的對應列的為空性相同。
如果 EXCEPT 或 INTERSECT 與表達式中的其他運算符一起使用,則在以下優先順序的上下文中對其進行評估:
括弧中的表達式
INTERSECT 操作數
基於在表達式中的位置從左到右求值的 EXCEPT 和 UNION
如果 EXCEPT 或 INTERSECT 用於比較兩個以上的查詢集,則數據類型轉換是通過一次比較兩個查詢來確定的,並遵循前面提到的表達式求值規則。
EXCEPT 和 INTERSECT 不能在分布式分區視圖定義、查詢通知中使用,也不能與 COMPUTE 和 COMPUTE BY 子句一起使用。
EXCEPT 和 INTERSECT 可在分布式查詢中使用,但只在本地伺服器上執行,不會被推送到鏈接伺服器。因此,在分布式查詢中使用 EXCEPT 和 INTERSECT 可能會影響性能。
快速只進游標和靜態游標與 EXCEPT 或 INTERSECT 運算一起使用時,在結果集中完全受支持。如果由鍵集驅動的游標或動態游標與 EXCEPT 或 INTERSECT 運算一起使用,則運算的結果集的游標轉換為靜態游標。
使用 SQL Server Management Studio 中的圖形顯示計劃功能顯示 EXCEPT 運算時,該運算顯示為 left anti semi join,INTERSECT 運算顯示為 left semi join。