Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net SQL搜索运行缓慢,仅在浏览器中运行_Asp.net_Sql_Sql Server - Fatal编程技术网

Asp.net SQL搜索运行缓慢,仅在浏览器中运行

Asp.net SQL搜索运行缓慢,仅在浏览器中运行,asp.net,sql,sql-server,Asp.net,Sql,Sql Server,我的一页上有一个小的搜索功能 IF LEN(@firstName) < 1 OR @firstName IS NULL set @firstName = '%' IF LEN(@lastName) < 1 OR @lastName IS NULL set @lastName = '%' IF LEN(@carrierId) < 1 OR @carrierId IS NULL set @carrierId = '%' IF LEN(@worksheetId) &

我的一页上有一个小的搜索功能

IF LEN(@firstName) < 1 OR @firstName IS NULL
set @firstName = '%'    


IF LEN(@lastName) < 1 OR @lastName IS NULL
set @lastName = '%'

IF LEN(@carrierId) < 1 OR @carrierId IS NULL
set @carrierId = '%'


IF LEN(@worksheetId) < 1 OR @worksheetId IS NULL
set @worksheetId = '%'  

SELECT TOP 1000 m.[Guid], m.WorksheetID, d.FirstName, d.LastName, m.VersionNum FROM Main m
INNER JOIN utl_Driver d ON m.DriverID = d.DriverID
    WHERE d.FirstName LIKE @firstName
    AND d.LastName LIKE @lastName
    AND d.CarrierID LIKE @carrierId
    AND m.WorksheetID LIKE @worksheetId
    AND m.Deleted = 0
    AND d.VersionNum = (SELECT MAX(VersionNum)
                            FROM Main B WHERE b.WorksheetID = m.WorksheetID)
    ORDER BY m.DateTimeStart DESC;

在SQLServerManagementStudio中,它的速度非常快,但当我的ASP.Net应用程序调用存储过程时,它的性能会很奇怪。通过LastName进行搜索通常很快,但FirstName或WorksheetID会超时。此外,删除'm.Deleted=0'检查会使所有查询执行得非常快,但我显然需要该检查。有什么建议吗?

这个问题永远不会得到很好的解决。您正在对4个不同的字段进行表扫描。 我也没有在查询中看到任何分页,这意味着返回所有结果。这将是一个大数据集的问题

介绍webforms,现在您就有了viewstate。即使启用了客户端分页,网格/列表视图也会将整个结果集存储在viewstate中

这是我看到的三个主要瓶颈。 1.由于like运算符,查询性能较差 2.结果集可能太大
3.webforms视图状态

请尝试以下操作:谢谢您的时间

DECLARE @whereCondition NVARCHAR(1000)
SET @whereCondition = ' WHERE 1 = 1 '

IF @firstName <> '' AND @firstName IS NOT NULL
    SET @whereCondition = @whereCondition + ' AND d.FirstName LIKE  ''' + @firstName + ''''

IF @lastName <> '' AND @lastName IS NOT NULL
    SET @whereCondition = @whereCondition + ' AND  d.LastName LIKE  ''' + @lastName + ''''

IF @carrierId <> '' AND @carrierId<> 0 AND @carrierId IS NOT NULL
    SET @whereCondition = @whereCondition + ' AND  d.CarrierID LIKE  ''' + @carrierId + ''''

IF @worksheetId <> '' AND @worksheetId<> 0  AND @worksheetId IS NOT NULL
    SET @whereCondition = @whereCondition + ' AND  m.WorksheetID LIKE  ''' + @worksheetId + ''''

SET @whereCondition = @whereCondition + ' AND  m.Deleted = 0'
SET @whereCondition = @whereCondition + ' AND  d.VersionNum = (SELECT MAX(VersionNum)
                            FROM Main B WHERE b.WorksheetID = m.WorksheetID) '

EXEC('SELECT TOP 1000 m.[Guid], m.WorksheetID, d.FirstName, d.LastName, m.VersionNum FROM Main m
       INNER JOIN utl_Driver d ON m.DriverID = d.DriverID '
       + @whereCondition +
       ' ORDER BY m.DateTimeStart DESC; ' )

您在Main.Deleted上有索引吗?存储的进程通常会得到不同于您在SSMS中执行查询时的查询计划。它通常会尝试使用实际上对查询有害的索引。是否在SSMS中运行查询或存储过程?否-Main。[Guid]具有聚集索引。其他的都没有索引。乔:我在SSMS中运行存储过程,无论我是否检查m.Deleted,它都会快速运行。只有当我通过应用程序调用存储过程时,它才会挂起。好吧,在Main.Deleted中添加一个索引,然后重试查看以获得一些解释。谢谢你的回复,Jason。为了优化这一点,您会怎么做?在这个搜索环境中,分页功能并不是一个真正的选项——显然,它不打算转储超过1000条记录。我为“已删除”字段编制了索引,它在应用程序中运行得更快,但我绝对希望尽可能快!如果您需要全文搜索,请执行全文搜索,SQL Server有全文索引,或者您可以引入Lucene.Net来管理文档索引。目前,结果集没有绑定,因此查询可能返回100K+条记录。这完全取决于数据库中的数据量。由于像预执行表扫描一样,查询性能会随着时间的推移而降低,并且会向数据库中添加更多数据。