我只需要确认我理解正确:
我最近查看了一个 SO 问题,其中用户在 Linq 中发布了一个答案,例如:
from p in db.table where p.column.AddMinutes(1) > DateTime.Now select p
Run Code Online (Sandbox Code Playgroud)
对于那些不熟悉 Linq 的人,我希望该语句的输出(未经公平测试)是:
SELECT *
FROM table t
WHERE DATEADD(min, 1, t.column) >= GETDATE()
Run Code Online (Sandbox Code Playgroud)
我对此发表了回复,说日期时间操作应该在变量上(在这种情况下GETDATE()
),因此实际上该语句应该反映如下内容:
SELECT *
FROM table t
WHERE t.column >= DATEADD(min, -1, GETDATE())
Run Code Online (Sandbox Code Playgroud)
在我的回复中,我现在不确定的部分,假设如下:
我的问题:
我在推理中遗漏了什么吗?我对么?最后,有没有机构有关于 SARGability 的好文章?
如标题所述,我开始对表查询进行性能调整,该查询使用由使用 Linq To SQL 作为 ORM 的遗留程序生成的分页。
我发现这个资源强烈建议在分页之前对表进行排序: https: //rimdev.io/optimizing-linq-sql-skip-take/
所以我遵循了提供的建议并尝试了巨大的差异。我很清楚这与 row_number 的计算方式有一定关系,但我不清楚到底发生了什么以及为什么两个查询之间有如此大的差异。
原始慢查询(〜7K元素的数据集,需要〜3s):
SELECT [t7].[ID], [t7].[ID_BRAND], [t7].[CODE], [t7].[CODFOR], [t7].[COD_ALT01], [t7].[COD_ALT02], [t7].[COD_ALT03], [t7].[ID_UOM], [t7].[IS_ACTIVE], [t7].[_ATTRIBUTES] AS [_ATTRIBUTES], [t7].[_DOCUMENTS] AS [_DOCUMENTS], [t7].[_SEO] AS [_SEO], [t7].[_TRANSLATIONS] AS [_TRANSLATIONS], [t7].[_TAGS] AS [_TAGS], [t7].[_NOTES] AS [_NOTES], [t7].[_METADATA] AS [_METADATA], [t7].[IS_B2B], [t7].[IS_B2C], [t7].[IS_PROMO], [t7].[IS_NEWS], [t7].[CAN_BE_RETURNED], [t7].[IS_SHIPPABLE], [t7].[HAS_SHIPPING_COSTS], [t7].[IS_PURCHEASABLE], [t7].[test], [t7].[ID2], [t7].[CODE2], [t7].[BUSINESS_NAME], [t7].[NAME], [t7].[PHONE_01], [t7].[PHONE_02], [t7].[PHONE_03], [t7].[FAX_01], [t7].[FAX_02], [t7].[COUNTRY_01], [t7].[CITY_01], [t7].[ADDRESS_01], [t7].[COUNTRY_02], [t7].[CITY_02], [t7].[ADDRESS_02], [t7].[EMAIL_01], [t7].[EMAIL_02], [t7].[PEC], [t7].[SITE_01], [t7].[SITE_02], [t7].[SITE_03], [t7].[SITE_04], [t7].[VAT_NUMBER], [t7].[SORT], [t7].[GROUPID_01], [t7].[IS_GROUPLEADER_01], …
Run Code Online (Sandbox Code Playgroud) 请让我解释一下我的问题和情况:
我有一个 Web 应用程序 - MVC3、MSSQL Server 2005、LinqToSQL。它一直运行良好,直到一个晴朗的早晨,我将很多行推送到一个经常使用的表中,从那时起我就遇到了查询超时。为了解决这个问题,我运行了 Database Tuning Advisor 并添加了一些索引和统计信息。我还创建了一个维护计划来每天重建索引。这些添加后,应用程序一直表现不稳定;它会快速工作几个小时,然后它会再次开始超时。接下来,生活迫使我清理表格,现在其中的行数比以前更少,但超时仍在发生。所以,我删除了我创建的所有索引,现在网站更加稳定,但有时我仍然会看到一些超时。
我一直在试图弄清楚如何修复这些查询,当我对其进行分析并将查询直接粘贴到 SQL Management Studio 时,它会在 1 秒内返回结果,但是当我从我的应用程序运行此查询时,大约需要 25 秒. 然后在它第一次运行后,下次它会像在服务器上一样快!
我开始做一些研究,看起来当我使用所有这些索引时,我的查询计划搞砸了,现在它们正在产生问题。
我的问题是:
我们有大量用于设置表格的表格。在每个表格中,都需要填写Code
和Description
。
代码由varchar(10)
数据类型组成。
现在,问题是,每次用户创建新数据或更新数据时,都需要检查是否Code
与其他人发生冲突。
在 LINQ 中,这种代码检查是不可避免的:
string ExistingCode = "ITEM01";
int ExistingKey = 1;
var recordWithConflictedCode = (from a in db.MyTable
where a.Code == ExistingCode &&
a.Key != ExistingKey).ToList();
if(recordWithConflictedCode.Count >= 1)
return BadRequest("Duplicated Code found");
Run Code Online (Sandbox Code Playgroud)
现在,由于这涉及对每个进程的字符串比较,我认为对列Code
进行索引以使查询更快是有意义的。
这对你们来说是一种常见的做法吗?