在字符列上的数值操作

请避免将数值文字与字符列比较。它要求将所有被比较的字符串转换为数值,这会花费比比较两个字符串长得多的时间。

例如,假设您想要找到 356 电话交换代码内所有的客户:
SELECT lname FROM customer WHERE phone [5,7] = '356';
请注意,将其值为 356 的运算对象括在引号中。该引号表明数据库服务器必须将该过滤器处理为字符串。相反,当该运算对象不在引号中时,服务器将每一检索的值作为数值处理,并必须隐式地将从该表检索到的每一值强制转型为数值的数据类型。
下列示例导致 phone 子字符串的隐式的数据类型转换:
SELECT lname FROM customer WHERE phone [5,7] = 356;

如果已经在此列上运行了 UPDATE STATISTICS MEDIUM 或 UPDATE STATISTICS HIGH 语句,则查询优化器试图通过将查询中的常量与保存在分布 bin 中的子字符串相匹配,来确定谓词的选择性。对字符列中每行进行数据类型转换,以便它可与数值过滤器相比较,与第一个示例中查询的成本相比,这种需要毫无必要地增加了忽略 356 周围的引号定界符的查询的成本。

如果数据库服务器不可转换该字符串,则比较字符串与数值的查询可失败并报错 EM -1213。如果您不可避免地将数值的过滤器应用于字符数值,则请仅在数值列上尝试这种操作,其字符限制为取值范围从 ASCII 0x30 至 0x39 的数字,以及小数点(ASCII 0x2e)。此取值范围又称为半数值的

当 DML 语句将带有非字符值的字符列与在长度上不等于该字符列的非字符值相比较时,数据库服务器不使用索引。