要从表中选择一行需要对DB2做一次调用。如果有一个处理记录的程序,要根据各个记录执行一个SQL UPDATE或SQL INSERT,它就需要知道在一般执行期间的更新数和插入数,这很重要。你可能并不希望首先用SQL SELECT语句来确定表中是否已经存在某一行。如果程序在运行期间处理的SQL UPDATE多于SQL INSERT,那么程序逻辑就应该跳过最初的SQL Select,而直接执行SQL Update。如果SQL Update语句得到一个+100 Not Found(未找到)错误,则执行SQL Insert。
如果程序执行的插入多于更新,则跳过SQL Select而直接执行SQL Insert。如果SQL INSERT语句接收到一个-803 Duplicate Insert(重复插入)错误,则执行SQL UPDATE。
要当心-803错误存在很大开销,如果遇到太多这种错误就会影响性能。因此应当注意一定要了解插入和更新的记录有多少。
注意DB2 V9引入了一个SQL MERGE语句,这个语句会更为高效。SQL Merge可以指定在匹配和不匹配条件下分别做什么(分别完成UPDATE和INSERT),这样一来,两种情况都可以在同一个SQL语句中加以处理(有关内容参见本章后面的调优技巧#82)。