Explorar estruturas de dados relacionais

Concluído

Um banco de dados relacional consiste em um conjunto de tabelas. Uma tabela poderá ter zero (se a tabela estiver vazia) ou mais linhas. Cada tabela tem um número fixo de colunas. Você pode definir relações entre tabelas usando chaves primárias e estrangeiras e pode acessar os dados em tabelas usando o SQL.

Além das tabelas, um banco de dados relacional típico contém outras estruturas que ajudam a otimizar a organização de dados e a aumentar a velocidade de acesso. Nesta unidade, você examinará duas dessas estruturas com mais detalhes: índices e exibições.

O que é um índice?

Um índice ajuda a pesquisar dados em uma tabela. Imagine um índice em uma tabela como um índice no final de um livro. Um índice de livro contém um conjunto classificado de referências, com as páginas nas quais cada referência ocorre. Quando você deseja encontrar uma referência a um item no livro, procura por ela no índice. Você pode usar os números de página no índice para ir diretamente para as páginas corretas no livro. Sem um índice, talvez seja necessário ler todo o livro para localizar as referências que você está procurando.

Quando você cria um índice em um banco de dados, especifica uma coluna da tabela e o índice contém uma cópia desses dados em uma ordem classificada, com ponteiros para as linhas correspondentes na tabela. Quando o usuário executa uma consulta que especifica essa coluna na cláusula WHERE, o sistema de gerenciamento de banco de dados pode usar esse índice para buscar os dados mais rapidamente do que se precisasse examinar toda a tabela, linha por linha. No exemplo a seguir, a consulta recupera todos os pedidos para o cliente C1. A tabela Pedidos tem um índice na coluna ID do cliente. O sistema de gerenciamento de banco de dados pode consultar o índice para localizar rapidamente todas as linhas correspondentes na tabela Pedidos.

Diagrama mostrando um exemplo de um índice em que a consulta recupera todos os pedidos de um cliente.

É possível criar vários índices em uma tabela. Portanto, se você também quisesse encontrar todos os pedidos de um produto específico, a criação de outro índice na coluna ID do Produto na tabela Pedidos seria útil. No entanto, os índices não são gratuitos. Um índice pode consumir espaço de armazenamento adicional e sempre que você insere, atualiza ou exclui dados em uma tabela, os índices dessa tabela precisam ser mantidos. Esse trabalho adicional pode retardar as operações de inserção, atualização e exclusão e incorrer em encargos de processamento adicionais. Portanto, ao decidir quais índices criar, você precisa ter um equilíbrio entre o uso índices que aceleram suas consultas e o custo de executar outras operações. Em uma tabela que é somente leitura ou que contém dados modificados com pouca frequência, um número maior de índices aprimorará o desempenho da consulta. Se uma tabela for consultada com pouca frequência, mas estiver sujeita a um grande número de inserções, atualizações e exclusões (como uma tabela envolvida em OLTP), a criação de índices nessa tabela poderá deixar o sistema lento.

Alguns sistemas de gerenciamento de banco de dados relacional também dão suporte a índices clusterizados. Um índice clusterizado reorganiza fisicamente uma tabela pela chave de índice. Essa disposição pode aprimorar ainda mais o desempenho das consultas, pois o sistema de gerenciamento de banco de dados relacional não precisa seguir as referências do índice para localizar os dados correspondentes na tabela subjacente. A imagem abaixo mostra a tabela Pedidos com um índice clusterizado na coluna ID do cliente.

Diagrama mostrando um exemplo de índice clusterizado.

Em sistemas de gerenciamento de banco de dados que dão suporte a índice clusterizado, só pode existir um desses índices em cada tabela.

O que é uma exibição?

Uma exibição é uma tabela virtual com base no conjunto de resultados de uma consulta. No caso mais simples, é possível considerar uma exibição como uma janela em linhas especificadas em uma tabela subjacente. Por exemplo, é possível criar uma exibição na tabela Pedidos, que lista os pedidos de um produto específico (nesse caso, o produto P1) da seguinte maneira:

CREATE VIEW P1Orders AS
SELECT CustomerID, OrderID, Quantity
FROM Orders
WHERE ProductID = "P1"

É possível consultar a exibição e filtrar os dados de maneira muito semelhante à de uma tabela. A consulta a seguir localiza os pedidos do cliente C1 usando a exibição. Esta consulta retornará apenas pedidos do produto P1 feitos pelo cliente:

SELECT CustomerID, OrderID, Quantity
FROM P1Orders
WHERE CustomerID = "C1"

Uma exibição também pode unir tabelas. Se você precisar com frequência encontrar os detalhes dos clientes e os produtos que eles solicitaram, poderá criar uma exibição com base na consulta de junção mostrada na unidade anterior:

CREATE VIEW CustomersProducts AS
SELECT Customers.CustomerName, Orders.QuantityOrdered, Products.ProductName
FROM Customers JOIN Orders
ON Customers.CustomerID = Orders.CustomerID
JOIN Products
ON Orders.ProductID = Products.ProductID

A seguinte consulta, usando a exibição abaixo, localiza o nome do cliente e os nomes de produtos maiores que QuantityOrdered 100:

SELECT CustomerName, ProductName
FROM CustomersProducts
WHERE QuantityOrdered > 100