这是我刚刚遇到的一个面试问题。我想知道对此的一个好的答案是什么以及不同的选择是什么。
我们有一个存储过程需要 26 秒才能返回从 5 个表中获取的信息。我们的服务器在 25 秒后超时。你怎么能解决这个问题?
这不是逐字逐句的,但它接近被问到的问题。我一点头绪都没有,我什至不认为我们在 db 类中讨论过那种细节。我能想到的就是告诉他们要确保表已编入索引,但我什至不知道这是否正确。
这是一个示例,说明这在创建时的样子:
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
这将再一次花费比超时时间允许的时间稍长的时间。
- 在语法上加速此存储过程的选项有哪些?
- 哪些不同类型的元数据可能有助于解决问题?
- 在上述过程中应该避免哪些做法?
- (作为一个非必需的旁白问题)告诉面试官我会在 Stack Overflow 上问现实生活中的问题是否可以接受?
令人惊讶的广泛问题,但有几个简单的答案。
像你建议的那样建立索引。确保存在适当的索引,如果需要足够大,确保它们都被覆盖。
去掉 *. 指定您需要的列。如果您要跨越 100 列超过 100 万行,那将是大量数据。如果你只需要 3 列只指定 3 列。
更改超时。这听起来很矫揉造作,但老实说,有时这确实是答案。SQL Server(例如)实际上没有超时,所以问题出在连接端。让他们将超时时间增加到 30 秒(假设这是一个可以接受的时间量,但通常不会)。
确保这是 DBMS 的错。您很可能在连接端遇到问题,导致连接需要 5-10 秒。解决这个问题,您就可以在自己的时间内完成。