我正在尝试从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条记录。我还能尝试什么?我做错了什么?
答案 0 :(得分:3)
看看How to read SQL Server execution plans它将向您展示如何分析您自己的SQL查询并改进速度和执行性能。
您希望针对您的查询运行此操作并查看它是如何执行的,以便您可以添加索引/更改联接等。
Trim
函数也是一个计算量很大的函数,它不仅仅是从行中选择而是处理命令。以40,000运行它可能会受到很大影响。考虑只在你需要它的列上进行,并在INSERT时间进行,而不是选择时间(然后你做一次,而不是一百万次;))。
答案 1 :(得分:3)
您应该考虑从select查询中删除trim函数。这样做需要SQL Server的大量工作。您应该在插入之前修剪值。
答案 2 :(得分:1)
从where条件中删除trim函数,因为在执行它时首先在所有行上应用函数,然后在执行where条件后执行它会影响性能。