Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 比如使用前导通配符Oracle_Sql_Oracle - Fatal编程技术网

Sql 比如使用前导通配符Oracle

Sql 比如使用前导通配符Oracle,sql,oracle,Sql,Oracle,我只有街道名称,我正在尝试搜索数据库中包含街道名称的所有地址。例如,我有莫哈韦路,数据库值可能是123莫哈韦路拉斯维加斯。这迫使我使用前导和结尾通配符。我正在尝试对数百个街道名称执行以下查询。执行计划看起来不错,但查询不断超时。我如何优化它 SELECT full_address, city, state, zip FROM address_table WHERE full_address LIKE '%MOJAVE RD%' AND state IN ('NV')

我只有街道名称,我正在尝试搜索数据库中包含街道名称的所有地址。例如,我有
莫哈韦路
,数据库值可能是
123莫哈韦路拉斯维加斯
。这迫使我使用前导和结尾通配符。我正在尝试对数百个街道名称执行以下查询。执行计划看起来不错,但查询不断超时。我如何优化它

SELECT
  full_address,
  city,
  state,
  zip
FROM
  address_table
WHERE
  full_address LIKE '%MOJAVE RD%'
AND 
  state IN ('NV');

甲骨文是好的

超级基本示例:

CREATE INDEX test_idx_addr ON address_table (full_address)
indextype is ctxsys.context;

select * from address_table
where contains(full_address,'MOJAVE RD') > 0;

但是它有很多优点,所以如果您决定使用它,请仔细阅读。

我最喜欢Oracle文本解决方案。另一方面:

如果您想要一个使用普通索引的简单解决方案,您可以尝试覆盖索引并强制执行执行索引完全扫描的计划这只是一个尝试的建议,并非针对所有情况都是一个好的解决方案。

首先,我要检查查询当前使用的计划。如果使用的是全表扫描,并且扫描时间太长,您可以尝试以下方法:

例如,在
(state,full_address)
上放置一个索引,然后检查查询的解释计划。如果它对新索引进行完全扫描,然后通过Rowid进行表访问,那么就完成了它的工作

如果该计划没有自动获取指数(即,它仍在进行FTS),您可以用以下方式强制其操作:

SELECT
  a.full_address,
  a.city,
  a.state,
  a.zip
FROM
  address_table a
WHERE a.rowid in (
  select a1.rowid from address_table a1
  where  a1.full_address LIKE '%MOJAVE RD%'
  AND   a1.state IN ('NV')
);
可能还有其他方法可以达到同样的效果。其思想是让它尽可能快速地扫描索引中的匹配行,然后从表中获取所需的其余数据

注意但是,此计划的执行情况可能比您当前的情况更糟-尤其是如果表中有相当大数量的匹配记录


当然,如果您可以将需求更改为只检索
state
full\u address
列,这将更快(因为您可以避免完全访问表)。

成百上千应该不是问题,尤其是当state被索引时。请张贴解释计划。你说“超时”是什么意思?我运行的查询需要几个小时才能完成,而且从未“超时”。检查您的数据库参数可能。。。除此之外,我认为在字符串的开头使用通配符可能会否定索引的任何积极效果(如果它越向右,索引就可以使用得越好)。PS:通过使用规范化来建立原子性可能会有帮助,使用以通配符开头的类可以使查询优化器忽略该字段上的索引。但是长的varchar通常不被索引,所以一个LIKE不会使它在这些上变慢。不过,查询将受益于州索引。OP表示,他需要搜索数百个街道名称,但没有说明表的大小。