-1

我正在尝试从 C# 应用程序在 SQL Server 2008 上执行存储过程。这需要很多时间,我的应用程序“没有响应”。我的存储过程:

ALTER PROCEDURE [dbo].[PROC066]
@date_1 date,
@date_2 date
AS
SELECT
RTRIM(tt1.[Org]) as 'Org', 
RTRIM(tt1.[CustomerHQ]) as 'Customer',
RTRIM(tt1.[Customer]) as 'ShipTo', 
RTRIM(tt1.[Date]) as 'Date', 
RTRIM(tt2.Clean) as 'Clean', 
RTRIM(tt1.[PO number]) as 'PONumber',
RTRIM(tt1.[GCAS]) as 'GCAS',
'Description' = (SELECT DISTINCT [Description] FROM tDeploymentDB WHERE tDeploymentDB.[Item Code] = tt1.[GCAS]),
RTRIM(tt1.NQTY) as 'NQTY',
RTRIM(tt1.[Dummy]) as 'Dummy', 
RTRIM(tt1.[MOQ]) as 'MOQ', 
RTRIM(tt1.[Inactive]) as 'Inactive', 
RTRIM(tt1.[Allocation]) as 'Allocation', 
RTRIM(tt1.[MultiSector]) as 'MultiSector',
RTRIM(tt2.Pallet_Checked) as 'FullPallets',
RTRIM(tt2.FullTruck_Checked) as 'Full_Truck',
FROM tCleanOrderTracking_prod as tt1, tCleanOrderTracking_HDR_prod as tt2
WHERE 
SUBSTRING(RTRIM(tt1.[PO number]), 6, LEN(RTRIM(tt1.[PO number])) - 5) = 
RTRIM(tt2.CustomerOrderNumber) AND 
tt1.[Date] = @date_1 AND tt1.[Date] <= @date_2
ORDER BY Org, [PO Number]

如果我尝试在 SQL Server Management Studio 上执行此过程 - 需要 5-7 秒。但是通过 C# 我不能执行这个查询。我试图在查询中删除这一行

tt1.[Date] = @date_1 AND tt1.[Date] <= @date_2

之后它工作正常..我的应用程序需要 5 秒才能执行。我也试图重写这一行

tt1.[Date] BETWEEN @date_1 AND @date_2

没有结果!我在查询 tCleanOrderTracking_prod 中的主表有大约 40500 条记录。我还能尝试什么?我做错了什么?

4

3 回答 3

3

查看如何阅读 SQL Server 执行计划,它将向您展示如何分析您自己的 SQL 查询并改进速度和执行性能。

您想针对您的查询运行它并查看它是如何执行的,以便您可以添加索引/更改连接等。

Trim函数也是一个计算量很大的函数,它不仅仅是从行中选择,而是一个处理命令。在 40,000 上运行它可能会受到很大的打击。考虑只在您需要它的列上执行它,并在插入时间而不是选择时间执行它(然后您执行一次,而不是一百万次;))。

于 2012-07-24T10:20:57.267 回答
3

您应该考虑从选择查询中删除修剪功能。这样做需要 SQL Server 方面付出很多努力。您应该在插入它们之前修剪这些值。

于 2012-07-24T10:22:13.073 回答
1

从 where 条件中删除修剪函数,因为在执行它时首先对所有行应用函数,然后在执行 where 条件后影响性能。

于 2012-07-24T10:26:57.410 回答