在一行rdr.GetString需要12-15秒慢速SqlDataReader的GetString的
几个行需要4 - 5秒
几采取1-4秒
大多数行是小于100毫秒
整个查询只返回SSMS 3,286行,运行在15秒
[超值]为varchar(600) - 没有什么特别的地方,我知道
有上[fieldID],[值的索引]重建(s everal次)
在SqlDataReader的读出行208需要12 - 15秒
读取一行,只要需要为阅读所有剩余的3285行
的如果我更改排序上[fieldID]来说明那挂在行2050
而这是不一样的行(它甚至不是同一[fieldID])
的rdr.GetString是rdr.GetByte它从不挂在了getByte之前。 它已经有排! 即使打到另一台具有类似但不精确的数据库的服务器,它也会挂起。
我知道这听起来很疯狂,但它正在发生。 这感觉就像SqlDataReader挂起,但我在这个应用程序中一直使用SqlDataReader并返回比这更多的行。
如果我在fieldID更改时手动执行GC.Collect(),它仍然挂在大多数相同的行上。 个人挂起的时间有点小,但总数大致相同。使用1秒的阈值可能有一个刚刚进入或刚刚进入状态,但问题行肯定会重复。
认为它可能与挂钩之间的字符数有关,但可以低至600和高达60,000。
但它似乎与返回的数据有关。 如果我排除或包含[rownumber](并且不读取它),它将挂在不同的行上。 但行在相同的附近。
fieldID = rdr.GetByte(0); // this line does not hang
delta = sw.ElapsedMilliseconds;
textValue = rdr.GetString(1); // this is the line that hang on some rows
if ((sw.ElapsedMilliseconds - delta) > 1000L)
Debug.WriteLine("GabeLib_Helper sw in fields thisFieldID = " + thisFieldID + " counter = " + counter + " ccount = " + ccount + " after getstring read delta = " + (sw.ElapsedMilliseconds - delta).ToString("N0") + " textValue = " + textValue);
select [fieldID], [value], [rowNum]
from
(
SELECT [fieldID], ltrim(rtrim([value])) as [value]
, ROW_NUMBER() over (partition by [fieldID] order by ltrim(rtrim([value]))) as [rowNum]
FROM [docSVtext] with (nolock)
JOIN [docFieldDef] with (nolock)
ON [docFieldDef].[ID] = [fieldID]
AND [docFieldDef].[typeID] in (101)
AND [docFieldDef].[active] = 'true'
AND len(ltrim(rtrim([value]))) > 0 and len(ltrim(rtrim([value]))) <= 200
JOIN [docSVsys] with (nolock)
on [docSVsys].[sID] = [docSVtext].[sID]
and [docSVsys].[visibility] = 0
group by [fieldID], ltrim(rtrim([value]))
) as withRow
where [rowNum] < 1001
order by [fieldID], [rowNum]
如果我添加rdr.GetInt64(2);上面的rdr.GetString(1);
然后挂在rdr.GetInt64(2);并不会挂在rdr.GetString(1);
并与rdr.GetInt64(2);我得到一个慢rdr.Read()。
delta = sw.ElapsedMilliseconds;
rowNum = rdr.GetInt64(2);
if ((sw.ElapsedMilliseconds - delta) > 1000L)
Debug.WriteLine("GabeLib_Helper sw in fields in PastEntries new rowNum rdr.GetInt64(2) " + rowNum + " counter = " + counter + " ccount = " + ccount + " delta = " + (sw.ElapsedMilliseconds - delta).ToString("N0"));
在SSMS
下方运行查询2秒这是没问题的查询
包括显示索引似乎是工作
select fieldID, value, count(*)
from docSVtext
group by fieldID, value
我跟踪GC,这是不相关的缓慢起伏
即使GC运行时也只需要20 ms
delta = sw.ElapsedMilliseconds;
List<int> gcCounts = new List<int>();
for (int g = 0; g <= GC.MaxGeneration; g++) gcCounts.Add(GC.CollectionCount(g));
textValue = rdr.GetString(1); // " Chen, Andy </O=ENRON/OU=NA/CN=RECIPIENTS/CN=ACHEN>" + Guid.NewGuid(); //
if ((sw.ElapsedMilliseconds - delta) > 100L)
{
Debug.WriteLine("GabeLib_Helper sw in fields thisFieldID = " + thisFieldID + " counter = " + counter + " ccount = " + ccount + " after getstring read delta = " + (sw.ElapsedMilliseconds - delta).ToString("N0") + " textValue = " + textValue);
}
for (int g = 0; g <= GC.MaxGeneration; g++)
{
if (GC.CollectionCount(g) != gcCounts[g])
Debug.WriteLine("GabeLib_Helper GC new count = " + GC.CollectionCount(g) + " old count =" + gcCounts[g] + " generation " + g + " ccount = " + ccount + " after getstring read delta = " + (sw.ElapsedMilliseconds - delta).ToString("N0"));
}
@Rhumborl但它挂在GetString - 这是一个用词不当吗?如果我将textValue赋值为硬编码的“值”,它没有问题 – Paparazzi
第一个查询是导致问题的第一个查询吗?即'order by fieldID,rownum'加上'desc'加入它?如果是这样,请尝试在子查询的'order by'子句中删除'ltrim(rtrim(..))'。 – shahkalpesh
@shahkalpesh没有解决问题。它现在挂在不同的行上。正如我所说的,查询在SSMS中运行得很好。它已经在该行上执行了rdr.GetByte(0),没有任何问题。 – Paparazzi