fbpx
Wikipedia

Sort-merge join

The sort-merge join (also known as merge join) is a join algorithm and is used in the implementation of a relational database management system.

The basic problem of a join algorithm is to find, for each distinct value of the join attribute, the set of tuples in each relation which display that value. The key idea of the sort-merge algorithm is to first sort the relations by the join attribute, so that interleaved linear scans will encounter these sets at the same time.

In practice, the most expensive part of performing a sort-merge join is arranging for both inputs to the algorithm to be presented in sorted order. This can be achieved via an explicit sort operation (often an external sort), or by taking advantage of a pre-existing ordering in one or both of the join relations.[1] The latter condition, called interesting order, can occur because an input to the join might be produced by an index scan of a tree-based index, another merge join, or some other plan operator that happens to produce output sorted on an appropriate key. Interesting orders need not be serendipitous: the optimizer may seek out this possibility and choose a plan that is suboptimal for a specific preceding operation if it yields an interesting order that one or more downstream nodes can exploit.

Let's say that we have two relations and and . fits in pages memory and fits in pages memory. So, in the worst case sort-merge join will run in I/Os. In the case that and are not ordered the worst case time cost will contain additional terms of sorting time: , which equals (as linearithmic terms outweigh the linear terms, see Big O notation – Orders of common functions).

Pseudocode edit

For simplicity, the algorithm is described in the case of an inner join of two relations left and right. Generalization to other join types is straightforward. The output of the algorithm will contain only rows contained in the left and right relation and duplicates form a Cartesian product.

function Sort-Merge Join(left: Relation, right: Relation, comparator: Comparator) {  result = new Relation()    // Ensure that at least one element is present  if (!left.hasNext() || !right.hasNext()) {  return result  }    // Sort left and right relation with comparator  left.sort(comparator)  right.sort(comparator)    // Start Merge Join algorithm  leftRow = left.next()  rightRow = right.next()    outerForeverLoop:  while (true) {  while (comparator.compare(leftRow, rightRow) != 0) {  if (comparator.compare(leftRow, rightRow) < 0) {  // Left row is less than right row  if (left.hasNext()) {  // Advance to next left row  leftRow = left.next()  } else {  break outerForeverLoop  }  } else {  // Left row is greater than right row  if (right.hasNext()) {  // Advance to next right row  rightRow = right.next()  } else {  break outerForeverLoop  }  }  }    // Mark position of left row and keep copy of current left row  left.mark()  markedLeftRow = leftRow    while (true) {  while (comparator.compare(leftRow, rightRow) == 0) {  // Left row and right row are equal  // Add rows to result  result = add(leftRow, rightRow)    // Advance to next left row  leftRow = left.next()    // Check if left row exists  if (!leftRow) {  // Continue with inner forever loop  break  }  }    if (right.hasNext()) {  // Advance to next right row  rightRow = right.next()  } else {  break outerForeverLoop  }    if (comparator.compare(markedLeftRow, rightRow) == 0) {  // Restore left to stored mark  left.restoreMark()  leftRow = markedLeftRow  } else {  // Check if left row exists  if (!leftRow) {  break outerForeverLoop  } else {  // Continue with outer forever loop  break  }  }  }  }    return result } 

Since the comparison logic is not the central aspect of this algorithm, it is hidden behind a generic comparator and can also consist of several comparison criterias (e.g. multiple columns). The compare function should return if a row is less(-1), equal(0) or bigger(1) than another row:

function compare(leftRow: RelationRow, rightRow: RelationRow): number {  // Return -1 if leftRow is less than rightRow  // Return 0 if leftRow is equal to rightRow  // Return 1 if leftRow is greater than rightRow } 

Note that a relation in terms of this pseudocode supports some basic operations:

interface Relation {  // Returns true if relation has a next row (otherwise false)  hasNext(): boolean    // Returns the next row of the relation (if any)  next(): RelationRow    // Sorts the relation with the given comparator  sort(comparator: Comparator): void    // Marks the current row index  mark(): void    // Restores the current row index to the marked row index  restoreMark(): void } 

Simple C# implementation edit

Note that this implementation assumes the join attributes are unique, i.e., there is no need to output multiple tuples for a given value of the key.

public class MergeJoin {  // Assume that left and right are already sorted  public static Relation Merge(Relation left, Relation right)  {  Relation output = new Relation();  while (!left.IsPastEnd() && !right.IsPastEnd())  {  if (left.Key == right.Key)  {  output.Add(left.Key);  left.Advance();  right.Advance();  }  else if (left.Key < right.Key)  left.Advance();  else // if (left.Key > right.Key)  right.Advance();  }  return output;  } }   public class Relation {  private List<int> list;  public const int ENDPOS = -1;  public int position = 0;  public int Position => position;  public int Key => list[position];  public bool Advance()  {  if (position == list.Count - 1 || position == ENDPOS)  {  position = ENDPOS;  return false;  }  position++;  return true;  }  public void Add(int key)  {  list.Add(key);  }  public bool IsPastEnd()  {  return position == ENDPOS;  }  public void Print()  {  foreach (int key in list)  Console.WriteLine(key);  }  public Relation(List<int> list)  {  this.list = list;  }  public Relation()  {  this.list = new List<int>();  } } 

See also edit

References edit

  1. ^ "Sort-Merge Joins". www.dcs.ed.ac.uk. Retrieved 2022-11-02.

External links edit

C# Implementations of Various Join Algorithms

sort, merge, join, sort, merge, join, also, known, merge, join, join, algorithm, used, implementation, relational, database, management, system, basic, problem, join, algorithm, find, each, distinct, value, join, attribute, tuples, each, relation, which, displ. The sort merge join also known as merge join is a join algorithm and is used in the implementation of a relational database management system The basic problem of a join algorithm is to find for each distinct value of the join attribute the set of tuples in each relation which display that value The key idea of the sort merge algorithm is to first sort the relations by the join attribute so that interleaved linear scans will encounter these sets at the same time In practice the most expensive part of performing a sort merge join is arranging for both inputs to the algorithm to be presented in sorted order This can be achieved via an explicit sort operation often an external sort or by taking advantage of a pre existing ordering in one or both of the join relations 1 The latter condition called interesting order can occur because an input to the join might be produced by an index scan of a tree based index another merge join or some other plan operator that happens to produce output sorted on an appropriate key Interesting orders need not be serendipitous the optimizer may seek out this possibility and choose a plan that is suboptimal for a specific preceding operation if it yields an interesting order that one or more downstream nodes can exploit Let s say that we have two relations R displaystyle R and S displaystyle S and R lt S displaystyle R lt S R displaystyle R fits in P r displaystyle P r pages memory and S displaystyle S fits in P s displaystyle P s pages memory So in the worst case sort merge join will run in O P r P s displaystyle O P r P s I Os In the case that R displaystyle R and S displaystyle S are not ordered the worst case time cost will contain additional terms of sorting time O P r P s P r log P r P s log P s displaystyle O P r P s P r log P r P s log P s which equals O P r log P r P s log P s displaystyle O P r log P r P s log P s as linearithmic terms outweigh the linear terms see Big O notation Orders of common functions Contents 1 Pseudocode 2 Simple C implementation 3 See also 4 References 5 External linksPseudocode editFor simplicity the algorithm is described in the case of an inner join of two relations left and right Generalization to other join types is straightforward The output of the algorithm will contain only rows contained in the left and right relation and duplicates form a Cartesian product function Sort Merge Join left Relation right Relation comparator Comparator result new Relation Ensure that at least one element is present if left hasNext right hasNext return result Sort left and right relation with comparator left sort comparator right sort comparator Start Merge Join algorithm leftRow left next rightRow right next outerForeverLoop while true while comparator compare leftRow rightRow 0 if comparator compare leftRow rightRow lt 0 Left row is less than right row if left hasNext Advance to next left row leftRow left next else break outerForeverLoop else Left row is greater than right row if right hasNext Advance to next right row rightRow right next else break outerForeverLoop Mark position of left row and keep copy of current left row left mark markedLeftRow leftRow while true while comparator compare leftRow rightRow 0 Left row and right row are equal Add rows to result result add leftRow rightRow Advance to next left row leftRow left next Check if left row exists if leftRow Continue with inner forever loop break if right hasNext Advance to next right row rightRow right next else break outerForeverLoop if comparator compare markedLeftRow rightRow 0 Restore left to stored mark left restoreMark leftRow markedLeftRow else Check if left row exists if leftRow break outerForeverLoop else Continue with outer forever loop break return result Since the comparison logic is not the central aspect of this algorithm it is hidden behind a generic comparator and can also consist of several comparison criterias e g multiple columns The compare function should return if a row is less 1 equal 0 or bigger 1 than another row function compare leftRow RelationRow rightRow RelationRow number Return 1 if leftRow is less than rightRow Return 0 if leftRow is equal to rightRow Return 1 if leftRow is greater than rightRow Note that a relation in terms of this pseudocode supports some basic operations interface Relation Returns true if relation has a next row otherwise false hasNext boolean Returns the next row of the relation if any next RelationRow Sorts the relation with the given comparator sort comparator Comparator void Marks the current row index mark void Restores the current row index to the marked row index restoreMark void Simple C implementation editNote that this implementation assumes the join attributes are unique i e there is no need to output multiple tuples for a given value of the key public class MergeJoin Assume that left and right are already sorted public static Relation Merge Relation left Relation right Relation output new Relation while left IsPastEnd amp amp right IsPastEnd if left Key right Key output Add left Key left Advance right Advance else if left Key lt right Key left Advance else if left Key gt right Key right Advance return output public class Relation private List lt int gt list public const int ENDPOS 1 public int position 0 public int Position gt position public int Key gt list position public bool Advance if position list Count 1 position ENDPOS position ENDPOS return false position return true public void Add int key list Add key public bool IsPastEnd return position ENDPOS public void Print foreach int key in list Console WriteLine key public Relation List lt int gt list this list list public Relation this list new List lt int gt See also editHash join Nested loop joinReferences edit Sort Merge Joins www dcs ed ac uk Retrieved 2022 11 02 External links editC Implementations of Various Join Algorithms Retrieved from https en wikipedia org w index php title Sort merge join amp oldid 1145149844, wikipedia, wiki, book, books, library,

article

, read, download, free, free download, mp3, video, mp4, 3gp, jpg, jpeg, gif, png, picture, music, song, movie, book, game, games.