[英]Timeout expired, optimize query
我有这个查询来获取两个日期之间的所有条例草案的详细信息:
SELECT DT.*
FROM DetailTable DT, BillTable BT, PackageTable PT
WHERE PT.Id = BT.IdPackage
AND DT.IdBill= BT.Id
AND PT.CodeCompany = @codeCompany
AND PT.Date BETWEEN @begin and @end
对于每个包裹,都有很多账单,我想获取一家公司账单的详细信息,数据库中的结果仅为20,000,但是我有:
System.Data.SqlClient.SqlException(0x80131904):超时已过期。 在操作完成之前超时或服务器没有响应。
C#代码:
using (SqlConnection sqlConn = new SqlConnection(SqlServerMasterConnection))
{
if (sqlConn.State != ConnectionState.Open) sqlConn.Open();
using (SqlCommand cmd = new SqlCommand("select DT.* from DetailTable DT, BillTable BT, PackageTable PT where PT.Id= BT.IdPackage and DT.IdBill= BT.Id and PT.CodeCompany = @codeCompany and PT.Date between @begin and @end",
sqlConn))
{
cmd.Parameters.Add(new SqlCeParameter(@begin , beginDate));
cmd.Parameters.Add(new SqlCeParameter("@end", endDate));
cmd.Parameters.Add(new SqlCeParameter("@codeCompany", codeCompany));
using (DbDataReader reader = cmd.ExecuteReader())
{
while (reader.Read())
{
//work todo
}
}
}
}
我什至在SQL Server Management中尝试了25秒! 任何提示,请解决此问题。
更新
这是执行计划:
UPDATE2
我有两个问题要解决(我想要您的想法)。
PT.Date
是一个char(8)
(开发人员使用它如何开始该项目)(yyyyMMdd)
detailTable
包含102列。
试试这个查询-
SELECT DT.*
FROM dbo.DetailTable DT
WHERE EXISTS(
SELECT 1
FROM dbo.BillTable BT
JOIN (
SELECT PT.Id
FROM dbo.PackageTable PT
WHERE PT.CodeCompany = @codeCompany
AND PT.Date BETWEEN @begin AND @end
) PT ON PT.Id = BT.IdPackage
WHERE DT.IdBill = BT.Id
)
其他方式 -
CREATE PROCEDURE dbo.usp_Test1
@codeCompany VARCHAR(50)
, @begin DATETIME
, @end DATETIME
AS
BEGIN
IF OBJECT_ID (N'tempdb.dbo.#temp') IS NOT NULL
DROP TABLE #temp
CREATE TABLE #temp (ID BIGINT PRIMARY KEY)
INSERT INTO #temp (ID)
SELECT BT.Id
FROM dbo.BillTable BT
JOIN dbo.PackageTable PT ON PT.Id = BT.IdPackage
WHERE PT.CodeCompany = @codeCompany
AND PT.[Date] BETWEEN @begin AND @end
SELECT DT.*
FROM dbo.DetailTable DT
WHERE DT.IdBill IN (SELECT Id FROM #temp)
END
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.