快速 SQL 与慢速 OCR。通过独特但较小的搜索来提高性能。哪个搜索?

问题描述 投票:0回答:3

我有一个 Firebird 数据库,我在其中查询“名称”以找到与我自己的游戏机器人匹配的游戏。 OCR(光学字符读取)是我自己创建的,工作原理如此。我现在正在采取措施提高其速度。

我的数据库中有大约 40,000 个“名字”,它们大多是唯一的,但举一个小例子

paradise of cup
Paradise when gone
paranoid
paradise

还有 40,000 多个

现在我正在寻找以下内容。 Firebird 对我想要完成的以下事情有任何支持吗?

当我使用上面的示例数据时,我的 OCR 需要找到至少 (Paradise *) = 10 个字母,以确保它始终是唯一的。

我不知道是否可以找到一种方法/查询,通过我的数据库进行某个/特定查询,以找出该查询的字母长度必须至少有多长,才能发现我的搜索始终是唯一的.

PS。我确实知道如果 SQL 中不支持此类内容,我可以自己编写脚本,但也许我可以在这里节省一些时间并学习一两件事。

sql performance search ocr firebird
3个回答
0
投票

我将您的问题读为“已知(可能是部分)值是否唯一标识一个名称”?很容易检查是否存在完全匹配:

SELECT COUNT(*)
FROM table
WHERE name = value

并且很容易检查该值是否部分匹配:

SELECT COUNT(*)
FROM table
WHERE name LIKE value||'%'

但是这个查询也计算完全匹配。因此,搜索“paradise%”将返回 3 - 两个部分匹配和一个完全匹配。这对您来说可能是个问题,我不知道。

这是一个 sql fiddle,其中包含用于测试的示例表、数据和 select 语句:http://sqlfiddle.com/#!2/21100b/1


0
投票

我认为没有你问的这个功能。 你可以尝试这样问。 请注意,它不使用任何索引,因此您不应该过度滥用它。

create procedure get_min_distinct_length
returns (
    min_length integer,
    count_table integer,
    count_spaces integer)
as
begin
    min_length = 0;
    count_table = 0;
    count_spaces = 1;

    while ((count_table <> count_spaces) and (min_length < 55)) do
    begin
        min_length = min_length + 1;

        select count(distinct(word))
        from table
        into :count_table;

        select count(distinct(substring(word from 1 for :min_length)))
        from table
        into :count_spaces;
    end

    suspend;
end

0
投票

您可以使用

LIKE
STARTING WITH
:

SELECT theColumn
FROM theTable
WHERE theColumn LIKE 'theValue %'

或者

SELECT theColumn
FROM theTable
WHERE theColumn STARTING WITH 'theValue '

如果您对列建立索引,那么使用

STARTING WITH
可能会更好,因为优化器可以做出更明智的选择来使用索引。特别是如果您使用参数化查询,
LIKE
将不会使用索引(因为它不知道您是否会传递类似“%...”的内容,而
STARTING WITH
会。

如果您需要不区分大小写的搜索,请确保该列具有不区分大小写的排序规则(在创建索引之前)。

© www.soinside.com 2019 - 2024. All rights reserved.