Aqui está uma pergunta de entrevista que acabei de fazer. Gostaria de saber qual seria uma boa resposta para isso e quais seriam as diferentes opções.
Temos um procedimento armazenado que está demorando 26 segundos para retornar informações obtidas de 5 tabelas. Nosso servidor atinge o tempo limite após 25 segundos. Como você pode resolver este problema?
Isso não é literal, mas está próximo da pergunta que foi feita. Eu não tinha ideia e nem acho que entramos nesse tipo de detalhe em nossa aula de banco de dados. Tudo o que consegui pensar em dizer a eles é para garantir que as tabelas sejam indexadas e nem sei se isso está certo.
Aqui está um exemplo de como isso pode parecer na criação:
CREATE PROCEDURE GetOrderForCustomers(@CustID varchar(20))
AS
BEGIN
SELECT * FROM orders o
JOIN state s ON s.stateID = o.stateID
JOIN customers c ON c.customerID = o.customerID
JOIN items i ON i.itemID = o.itemID
JOIN parts p ON p.partListID = o.partListID
WHERE c.customerID = @CustID
END
Mais uma vez, isso levaria um pouco mais de tempo do que o tempo limite permite.
- Quais são minhas opções para acelerar este procedimento armazenado sintaticamente?
- Quais são os diferentes tipos de metadados que podem ajudar a resolver o problema?
- Quais práticas devem ser evitadas que são vistas no procedimento acima?
- (Como uma pergunta não obrigatória) Seria aceitável dizer a um entrevistador que eu faria a pergunta da vida real no Stack Overflow?
Pergunta incrivelmente ampla, mas com algumas respostas simples.
Indexação como você sugeriu. Certifique-se de que os índices apropriados existam e, se a necessidade for grande o suficiente, verifique se eles estão cobrindo todos.
Livre-se do *. Especifique as colunas necessárias. Se você estiver puxando 100 colunas em mais de um milhão de linhas, haverá MUITOS dados. Se você precisar apenas de 3 colunas, especifique apenas 3 colunas.
Altere o tempo limite. Isso soa piegas, mas, honestamente, às vezes é realmente a resposta. O SQL Server (por exemplo) na verdade não tem um tempo limite, então o problema está no lado da conexão. Peça-lhes que aumentem o tempo limite para 30 segundos (supondo que seja uma quantidade aceitável de tempo, e frequentemente não será).
Certifique-se de que a falha é do DBMS. É muito possível que você esteja tendo um problema no lado da conexão que está fazendo com que demore de 5 a 10 segundos apenas para conectar. Corrija isso e você estará bem dentro do seu tempo.