Questão nº 44
Questão de Tecnologia da Informação · FGV TJ-MS 2024 (nº 44)
João, administrador de Banco de Dados experiente, percebeu que muitas consultas geradas por relatórios precisam fazer filtros pelo campo "LAST_NAME". No entanto, notou um desempenho insatisfatório devido à ausência de índices nesse campo, resultando em operações de FULL TABLE SCAN e impactando negativamente o tempo de resposta das consultas. Para resolver esse problema, ele decide identificar todas as tabelas com ausências de índices na coluna "LAST_NAME" do banco de dados, independentemente do proprietário.
Para isso, João deverá executar o script:
FROM DBA_IND_COLUMNS
WHERE COLUMN_NAME = 'LAST_NAME';
FROM DBA_TAB_COLUMNS C
LEFT JOIN DBA_IND_COLUMNS I ON I.TABLE_OWNER = C.OWNER AND I.TABLE_NAME = C.TABLE_NAME AND I.COLUMN_NAME = C.COLUMN_NAME
WHERE C.COLUMN_NAME = 'LAST_NAME' AND I.INDEX_NAME IS NULL;
FROM USER_TAB_COLUMNS C
LEFT JOIN USER_IND_COLUMNS I ON I.TABLE_NAME = C.TABLE_NAME AND I.COLUMN_NAME = C.COLUMN_NAME
WHERE C.COLUMN_NAME = 'LAST_NAME' AND I.INDEX_NAME IS NULL;
FROM ORA_COLUMNS C
LEFT JOIN ORA_IND_COLUMNS I ON I.TABLE_OWNER = C.OWNER AND I.TABLE_NAME = C.TABLE_NAME AND I.COLUMN_NAME = C.COLUMN_NAME
WHERE C.COLUMN_NAME = 'LAST_NAME' AND I.INDEX_NAME IS NULL;
FROM DBA_TAB_COLUMNS C
LEFT JOIN DBA_IND_COLUMNS I ON I.TABLE_OWNER = C.OWNER AND I.TABLE_NAME = C.TABLE_NAME AND I.COLUMN_NAME = C.COLUMN_NAME
WHERE C.COLUMN_NAME = 'LAST_NAME' AND I.INDEX_NAME IS NOT NULL;
- ASELECT *
- BSELECT C.OWNER, C.TABLE_NAME (alternativa correta)
- CSELECT C.TABLE_NAME
- DSELECT C.OWNER, C.TABLE_NAME
- ESELECT C.OWNER, C.TABLE_NAME
Resposta comentada
Gabarito Alternativa B
O dicionário de dados do Oracle é um conjunto de tabelas e visões que armazenam informações sobre a estrutura do banco de dados. Para consultar objetos de todos os usuários (schemas), usamos visões que começam com DBA_, enquanto para objetos do usuário atual, usamos USER_.
A query completa que João deve executar é a combinação do segundo bloco FROM/WHERE com a alternativa B. O script correto é:
SELECT C.OWNER, C.TABLE_NAME
FROM DBA_TAB_COLUMNS C
LEFT JOIN DBA_IND_COLUMNS I ON I.TABLE_OWNER = C.OWNER AND I.TABLE_NAME = C.TABLE_NAME AND I.COLUMN_NAME = C.COLUMN_NAME
WHERE C.COLUMN_NAME = 'LAST_NAME' AND I.INDEX_NAME IS NULL;
- (A) Incorreta: A cláusula
SELECT *retornaria todas as colunas das visõesDBA_TAB_COLUMNSeDBA_IND_COLUMNS, o que é excessivo e não foca na identificação clara das tabelas. - (B) Correta: Esta opção, combinada com o segundo bloco
FROM/WHEREfornecido na questão, seleciona o proprietário (C.OWNER) e o nome da tabela (C.TABLE_NAME) para cada coluna 'LAST_NAME' que não possui um índice, atendendo exatamente ao requisito de identificar as tabelas problemáticas. - (C) Incorreta: A cláusula
SELECT C.TABLE_NAMEnão incluiria o proprietário da tabela. Em um banco de dados Oracle, diferentes usuários (schemas) podem ter tabelas com o mesmo nome, e é crucial identificar o proprietário para localizar a tabela corretamente. - (D) Incorreta: Embora a cláusula
SELECT C.OWNER, C.TABLE_NAMEesteja correta em si, esta alternativa não é o gabarito oficial. A questão apresenta múltiplas alternativas idênticas para a cláusulaSELECT, mas o gabarito aponta especificamente para a letra B. - (E) Incorreta: Similarmente à alternativa D, esta opção é idêntica à B, mas não é a designada como gabarito oficial.
Armadilha da banca (para o distrator mais tentador no FROM/WHERE):
A armadilha mais comum para o bloco FROM/WHERE seria escolher a opção que usa FROM USER_TAB_COLUMNS C LEFT JOIN USER_IND_COLUMNS I.... Essa opção é tentadora porque parece correta na estrutura, mas o problema pede para identificar tabelas "independentemente do proprietário", o que exige o uso das visões DBA_ (como DBA_TAB_COLUMNS e DBA_IND_COLUMNS) que mostram objetos de todos os usuários, e não apenas do usuário atual (USER_).
Fonte: FGV TJ-MS 2024 Técnico de Nível Superior - Analista de Banco de Dados (Caderno Tipo 1). Reproduzida para fins de estudo.