BÖLÜM 1: YALIN DÜŞÜNCE VE YALIN ÜRETİM
1.3. Yalın Felsefe Uygulaması Olarak Toyota Yaklaşımı
1.3.4. Toyota Yaklaşımı’nın Temel İlkeleri
1.3.4.2. Sürekli İyileştirme
Tendo computado os vetores de caracter´ısticas, os dados complexos est˜ao aptos para ser comparados por similaridade. Para isso, o FMI-SiRO fornece fun¸c˜oes de distˆancia,
que retornam o valor de dissimilaridade entre dois vetores de caracter´ısticas e podem ser chamadas em consultas SQL. As fun¸c˜oes de distˆancia s˜ao definidas no FMI-SiROpor meio
de fun¸c˜oes definidas pelo usu´ario (UDFs) da seguinte forma:
<distance_name>_distance(signature1 BLOB, signature2 BLOB)
onde <distance_name> ´e o nome da fun¸c˜ao de distˆancia implementada. O FMI-SiRO implementa v´arias fun¸c˜oes de distˆancia, tais como a Manhattan_distance,
a Euclidean_distance e a Canberra distance. Al´em disso, novas fun¸c˜oes de distˆancia podem ser inclu´ıdas de acordo com os requisitos das aplica¸c˜oes. As fun¸c˜oes de distˆancia do FMI-SiRO podem ser utilizadas para formular consultas por similaridade, com execu¸c˜ao
sequencial, utilizando a sintaxe SQL padr˜ao, como apresentado a seguir.
As consultas por similaridade por abrangˆencia utilizam condi¸c˜oes simples baseadas em uma fun¸c˜ao de distˆancia. Por exemplo, a consulta a seguir ´e uma consulta por abrangˆencia (Rq), utilizando a fun¸c˜ao de distˆancia Manhattan (L1):
SELECT image FROM image_table
WHERE Manhattan_distance(image_sign, center_sign) <= 0.5;
onde center_sign ´e um BLOB contendo o vetor de caracter´ısticas da imagem de consulta e o valor 0.5 ´e o limiar de dissimilaridade.
A consulta pontual (Pq) e a consulta por abrangˆencia reversa (Rq−1)
seguem a mesma sintaxe da consulta por abrangˆencia, mas alterando o ope- rador de compara¸c˜ao e/ou o limiar de dissimilaridade. Seguindo o exem- plo de consulta Rq apresentado, uma consulta pontual utilizaria a condi¸c˜ao Manhattan distance(image sign, center sign) = 0 e uma consulta por abrangˆencia reversa utilizaria a condi¸c˜ao Manhattan distance(image sign, center sign) > 0.5.
As consultas aos k-vizinhos mais pr´oximos (k-NNq) s˜ao representadas utilizando fun¸c˜oes de janela (window functions) do padr˜ao SQL, como no exemplo a seguir:
SELECT image FROM (
SELECT image, ROW_NUMBER()
OVER (ORDER BY Manhattan_distance(image_sign, center_sign)) AS rn
FROM image_table ) WHERE rn <= 10;
onde a fun¸c˜ao ROW NUMBER atribui a um novo atributo (rn) a posi¸c˜ao de cada tupla de acordo com a janela definida, que neste caso ordena as tuplas pelo valor da distˆancia Ma- nhattan entre o vetor de caracter´ısticas da imagem armazenada e o vetor de caracter´ısticas da imagem de consulta (center_sign). O atributo rn ´e, ent˜ao, usado na condi¸c˜ao de fil- tragem consulta externa, para retornar apenas os k-vizinhos mais pr´oximos (no exemplo, k = 10).
As consultas aos k-vizinhos mais distantes (k-FNq) com execu¸c˜ao sequencial tamb´em usam esta sintaxe, por´em invertendo a ordena¸c˜ao da janela de consulta. A consulta aos k-vizinhos mais pr´oximos apresentada seria transformada em uma consulta aos k-vizinhos mais distantes, k = 10, sendo escrita da seguinte maneira:
SELECT image FROM (
SELECT image, ROW_NUMBER()
OVER (ORDER BY Manhattan_distance(image_sign, center_sign) DESC) AS rn
FROM image_table ) WHERE rn <= 10;
As consultas apresentadas nesta se¸c˜ao s˜ao executadas por meio de uma varredura sequencial na tabela de entrada. Para melhorar o desempenho de execu¸c˜ao, o FMI-SiRO
oferece ´ındices para responder a buscas por similaridade, apresentados na pr´oxima se¸c˜ao.
5.1.3
´Indices para Consultas por Similaridade
O FMI-SiRO acrescenta ao SGBD um conjunto de novos tipos de ´ındices para executar
consultas por similaridade, utilizando a interface de indexa¸c˜ao da arquitetura extens´ıvel do Oracle. Esta interface permite definir os m´etodos necess´arios para implementar os novos tipos de ´ındices. Estes m´etodos s˜ao encapsulados em um tipo de dados que define uma classe de objetos, que possui a seguinte interface:
CREATE OR REPLACE TYPE index_im_type AS OBJECT ( scanctx RAW(4),
STATIC FUNCTION ODCIIndexCreate(), STATIC FUNCTION ODCIIndexDrop(), STATIC FUNCTION ODCIIndexInsert(), STATIC FUNCTION ODCIIndexDelete(), STATIC FUNCTION ODCIIndexUpdate(), STATIC FUNCTION ODCIIndexStart(), MEMBER FUNCTION ODCIIndexFetch(), MEMBER FUNCTION ODCIIndexClose());
A implementa¸c˜ao deste novo tipo de dados mapeia as fun¸c˜oes declaradas para fun¸c˜oes externas C++, da biblioteca compartilhada dinˆamica. A vers˜ao corrente do FMI-SiROde-
fine um novo tipo de ´ındices utilizando a implementa¸c˜ao do MAM Slim-tree (Se¸c˜ao 3.3.2) na biblioteca Arboretum. Na verdade, o FMI-SiRO define um conjunto de novos ti-
pos de ´ındices baseados na Slim-tree, pois os MAMs s˜ao dependentes da fun¸c˜ao de distˆancia utilizada para definir o espa¸co m´etrico onde os dados s˜ao representados. Ent˜ao, h´a um novo tipo de ´ındice Slim-tree para cada distˆancia implementada no FMI-SiRO:
Slim Manhattan, Slim Canberra, etc. Al´em disso, um mesmo atributo armazenando um vetor de caracter´ısticas pode possuir mais de um ´ındice Slim-tree, desde que utilizando
fun¸c˜oes de distˆancia diferentes. Esta abordagem permite efetuar buscas indexadas medi- ante diferentes combina¸c˜oes de vetores de caracter´ısticas e fun¸c˜oes de distˆancia.
Novos tipos de ´ındices no Oracle exigem a declara¸c˜ao de operadores para disparar as buscas sobre o ´ındice. Na concep¸c˜ao da Oracle, um operador associa uma fun¸c˜ao definida pelo usu´ario a um tipo de ´ındice. Por isso, o FMI-SiROdefine um operador para a consulta
por abrangˆencia e um operador para a consulta aos k-vizinhos mais pr´oximos para cada fun¸c˜ao de distˆancia implementada. Por exemplo, o operador de consulta por abrangˆencia para a distˆancia Manhattan ´e definido como:
CREATE OPERATOR Manhattan_dist BINDING (BLOB, BLOB) RETURN FLOAT USING Manhattan_distance;
onde Manhattan_distance ´e a fun¸c˜ao definida pelo usu´ario que implementa o c´alculo desta fun¸c˜ao de distˆancia. O operador de consulta aos k-vizinhos mais pr´oximos (Manhattan_kNN) ´e definido de forma semelhante. Os novos tipos de ´ındices essencial- mente estabelecem a associa¸c˜ao entre os operadores e os tipos de dados que definem as classes que contˆem os m´etodos para manipular os ´ındice. Por exemplo, a instru¸c˜ao a seguir cria o tipo de ´ındice Slim_Manhattan, associando os operadores Manhattan_dist e Manhattan_kNN ao tipo de dados index_im_type:
CREATE INDEXTYPE Slim_Manhattan FOR
Manhattan_dist(BLOB, BLOB), Manhattan_kNN(BLOB, BLOB) USING index_im_type;
Com a defini¸c˜ao do novo tipo de ´ındice, o processador de consultas do SGBD passa a aceitar a cria¸c˜ao de ´ındices usando este novo tipo. A sintaxe para criar ´ındices utilizando os novos tipos de ´ındices disponibilizados pelo FMI-SiRO´e a mesma usada para criar ´ındices
de outros tipos. Por exemplo, a instru¸c˜ao a seguir cria um ´ındice do tipo Slim_Manhattan sobre o atributo image_sign da tabela image_table:
CREATE INDEX image_sign_Slim_Manhattan_ix ON image_table(image_sign) INDEX TYPE IS Slim_Manhattan PARAMETERS (’8192’);
onde o ´unico parˆametro considerado na implementa¸c˜ao corrente do FMI-SiRO´e o tamanho
em bytes das p´aginas do ´ındice (8192).
A cria¸c˜ao de um ´ındice dispara o processo ilustrado na Figura 5.2. O processador de consultas invoca a fun¸c˜ao ODCIIndexCreate, definida no tipo de dados que implementa o ´ındice, passando as informa¸c˜oes a respeito do ´ındice a ser criado, tais como o nome da tabela e o nome do atributo a ser indexado (Passo 1). A fun¸c˜ao ODCIIndexCreate requisita `a Arboretum a cria¸c˜ao de uma Slim-tree vazia (Passo 2). Em seguida, a fun¸c˜ao consulta os dados (vetor de caracter´ısticas e rowId ) armazenados na tabela (Passo 3).
Utilizando os LobLocators dos vetores de caracter´ısticas, a fun¸c˜ao recupera os dados dos BLOBs (Passo 4) e insere os vetores de caracter´ısticas com os respectivos rowIds na Slim- tree (Passo 5). Por fim, a fun¸c˜ao retorna o controle ao processador de consultas (Passo 6). Observe que os ´ındices do FMI-SiRO s˜ao armazenados em arquivos de dados externos ao
SGBD, gerenciados por meio da biblioteca Arboretum, que implementa acesso paginado aos dados e com controle de cache.
(si gn) Processador de Consultas 1 5 3 2 4 6 Oracle Database informações índice criar estrutura código de retorno código de retorno inserir elementos código de retorno cons ultar atribut o + row Ids ve tore s de car acte rística s LobL ocators LobL oc ators (sign) Index Create Arboretum Arquivo de Índice disk page disk page id
Figura 5.2: Passos executados pela fun¸c˜ao ODCIIndexCreate.
Os ´ındices criados s˜ao dinamicamente atualizados quando ocorrem inser¸c˜oes (INSERT), remo¸c˜oes (DELETE) ou atualiza¸c˜oes (UPDATE) nas tabelas indexadas. As fun¸c˜oes que implementam estas opera¸c˜oes nos ´ındices (ODCIIndexInsert, ODCIIndexDelete e ODCIIndexUpdate) executam os passos 4-6 do processo de cria¸c˜ao do ´ındice, utilizando o LobLocator e o rowId da tupla atualizada, que s˜ao fornecidos pelo processador de consul- tas como parˆametros. Quando um ´ındice ´e removido (via DROP INDEX, DROP TABLE, etc.), o processador de consultas invoca a fun¸c˜ao ODCIIndexDrop, que elimina o arquivo externo que armazenava o ´ındice, e, em seguida, remove do cat´alogo do banco as informa¸c˜oes a respeito do ´ındice.
A pr´oxima se¸c˜ao mostra como os novos tipos de ´ındices do FMI-SiRO s˜ao usados para
executar sele¸c˜oes por similaridade.