Oracle功能索引与带筛选器谓词的索引

Oracle功能索引与带筛选器谓词的索引,oracle,indexing,functional-index,Oracle,Indexing,Functional Index,我有以下疑问: SELECT * FROM USERS WHERE UPPER(FIRST_NAME) = 'JOHN' AND UPPER(LAST_NAME) = 'DOE' AND DOB = '07-SEP-11 00:00:00' 创建功能索引是否有任何性能优势: CREATE INDEX functional_idx ON USERS (UPPER(FIRST_NAME), UPPER(LAST_NAME), DOB) 与以下各项相比: CREATE INDEX dob_name

我有以下疑问:

SELECT * FROM USERS WHERE UPPER(FIRST_NAME) = 'JOHN' AND UPPER(LAST_NAME) = 'DOE' AND DOB = '07-SEP-11 00:00:00'
创建功能索引是否有任何性能优势:

CREATE INDEX functional_idx ON USERS (UPPER(FIRST_NAME), UPPER(LAST_NAME), DOB)
与以下各项相比:

CREATE INDEX dob_name_idx ON USERS (DOB, FIRST_NAME, LAST_NAME)
第一个索引使用访问谓词对索引进行范围扫描

第二个索引对索引进行范围扫描,访问谓词=DOB,过滤谓词=UPPER(FIRST_NAME)和UPPER(LAST_NAME)

就我而言,两者的成本相同。在某些情况下,第一个索引会产生更好的性能,还是第二个(非功能性)索引更好


谢谢。

我认为这取决于如何访问数据。在任何一种情况下,我都会把姓放在名之前。但是,如果要通过UPPER(name)访问它,那么在两个备选方案中使用函数索引将为您提供最佳服务。至于顺序,您必须同时测试这两个索引,而且还要使用两个索引进行测试,一个仅使用DOB,另一个使用最后/第一个函数索引。谢谢您的反馈。你能详细说明一下为什么你会在索引中把姓放在名之前吗?如果你总是要搜索名和姓,那就没关系了。但是Oracle将使用复合索引中的第一列,因此,如果您要单独搜索姓氏,则首先索引姓氏是有意义的。@JonathanSK我看到这一点时正在考虑电话簿。大多数姓名列表或姓名搜索都以姓氏优先为中心。但是,如上所述,这取决于您/您的应用程序如何搜索数据。我认为这取决于如何访问数据。在任何一种情况下,我都会把姓放在名之前。但是,如果要通过UPPER(name)访问它,那么在两个备选方案中使用函数索引将为您提供最佳服务。至于顺序,您必须同时测试这两个索引,而且还要使用两个索引进行测试,一个仅使用DOB,另一个使用最后/第一个函数索引。谢谢您的反馈。你能详细说明一下为什么你会在索引中把姓放在名之前吗?如果你总是要搜索名和姓,那就没关系了。但是Oracle将使用复合索引中的第一列,因此,如果您要单独搜索姓氏,则首先索引姓氏是有意义的。@JonathanSK我看到这一点时正在考虑电话簿。大多数姓名列表或姓名搜索都以姓氏优先为中心。但是,如上所述,这取决于您/您的应用程序搜索数据的方式。