Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.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
C# 使用OleDB从.NET查询SQL Server 2005时区分大小写_C#_.net_Sql Server_Oledb_Case Sensitive - Fatal编程技术网

C# 使用OleDB从.NET查询SQL Server 2005时区分大小写

C# 使用OleDB从.NET查询SQL Server 2005时区分大小写,c#,.net,sql-server,oledb,case-sensitive,C#,.net,Sql Server,Oledb,Case Sensitive,我有一个从.NET应用程序执行到SQL Server数据库的查询,似乎要花很长时间才能完成5分钟以上。我在c语言中创建了一个测试应用程序,试图查看什么在说这么长时间,查询应该会很快返回 当我通过添加元素来重建查询以查看哪个部分花费了这么长的时间时,我最终几乎一字不差地重建了查询,其中唯一的区别是原始查询中的空格和大小写差异。此差异在大约100毫秒内返回结果 以前有人见过这个吗?我想知道我们的服务器中是否有关闭的服务,因为一个同事有相同的问题或在我们的计算机上 提前感谢您在这方面的帮助 fk_源与

我有一个从.NET应用程序执行到SQL Server数据库的查询,似乎要花很长时间才能完成5分钟以上。我在c语言中创建了一个测试应用程序,试图查看什么在说这么长时间,查询应该会很快返回

当我通过添加元素来重建查询以查看哪个部分花费了这么长的时间时,我最终几乎一字不差地重建了查询,其中唯一的区别是原始查询中的空格和大小写差异。此差异在大约100毫秒内返回结果

以前有人见过这个吗?我想知道我们的服务器中是否有关闭的服务,因为一个同事有相同的问题或在我们的计算机上

提前感谢您在这方面的帮助

fk_源与fk_源结尾处查询第一行中的差异下面的代码示例:

//Original
    OleDbCommand comm = new OleDbCommand("select min(ctc.serial_no) as MIN_INTERVAL from countstypecode ctc, source s, countstype ct, counts c where ct.value_id=c.value_id and s.c_id=ct.fk_source and " +
      "ct.timeinterval=ctc.typename and ct.timeinterval in ('15min','1h','1day') and c.time_stamp >=  CONVERT(datetime,'01-01-2008',105)  and c.time_stamp < " +
      "CONVERT(datetime,'01-01-2009',105)  and s.c_id = '27038dbb19ed93db011a315297df3b7a'", dbConn);

//Rebuilt
    OleDbCommand comm = new OleDbCommand("select min(ctc.serial_no) as MIN_INTERVAL from countstypecode ctc, source s, countstype ct, counts c where ct.value_id=c.value_id and s.c_id=ct.fk_Source and " +
      "ct.timeinterval=ctc.typename and ct.timeinterval in ('15min','1h','1day') and c.time_stamp >= CONVERT(datetime,'01-01-2008',105) and c.time_stamp < " +
      "CONVERT(datetime,'01-01-2009',105) and s.c_id='27038dbb19ed93db011a315297df3b7a'", dbConn);

由于您使用的是SQL Server 2005,您是否尝试过使用SqlCommand对象而不是OleDbCommand对象?

由于您使用的是SQL Server 2005,您是否尝试过使用SqlCommand对象而不是OleDbCommand对象?

我看不到您的查询中会影响性能的差异-运行之间的缓存或索引/统计信息更改如何?由于统计数据或索引的更改,执行计划可能已更改


关于大小写:如果数据库设置为区分大小写,则大小写可能很重要,但对于在区分大小写的数据库中运行的两个查询,必须以两种格式命名列-查询解析器将遵循大小写-这不会导致性能差异。

我看不到查询中会影响性能的差异-运行之间的缓存或索引/统计信息更改如何?由于统计数据或索引的更改,执行计划可能已更改


关于大小写:如果数据库设置为区分大小写,则大小写可能很重要,但对于在区分大小写的数据库中运行的两个查询,必须有两种格式的列命名-查询解析器将遵循大小写-这不会导致性能差异。

首先,您100%确定是查询出错了吗?检查sql server中的跟踪配置文件,查看它在数据库中占用的时间


第二,你是否得到了同样数量的结果。在sql server中,默认情况下,资本化不应该很重要,但它可以进行不同的设置。

首先,您是否100%确定是查询出错了?检查sql server中的跟踪配置文件,查看它在数据库中占用的时间


第二,你是否得到了同样数量的结果。在sql server中,默认情况下,大写字母不应该很重要,但可以进行不同的设置。

如果我有一个耗时5分钟以上的查询,我不会担心匹配字符串大小写所需的100毫秒。

如果我有一个耗时5分钟以上的查询,我不会担心匹配字符串大小写所需的100毫秒。

谢谢您的回答,我将依次回答:

我同意SQLConnection会更好,但不幸的是,我无法设置连接类型。我刚刚创建了一个小应用程序来测试这个查询,但是查询是在一个更大的应用程序中动态创建的

2 gbjbaanb,我认为这不是服务器问题,因为我可以在大约相同的时间内从management studio运行这两个查询,只有在.net 1.1和2.0中通过oledb运行时,这似乎才是一个问题。我们已经在它上面运行了一个探查器,跟踪文件确认,当以这种方式调用时,完成查询需要5分钟以上

乔尔·科霍恩同意,但我想说的是为什么,因为现在我们不知道这个问题有多大,它在哪里


4Cade Roux,这种差异是非常可复制的,因此我不认为索引更改或缓存有问题,因为我已连续运行测试,结果相同,并且它们在SQL Server中运行所需的时间大致相同。

感谢您的所有回答,我将依次回答每个问题:

我同意SQLConnection会更好,但不幸的是,我无法设置连接类型。我刚刚创建了一个小应用程序来测试这个查询,但是查询是在一个更大的应用程序中动态创建的

2 gbjbaanb,我认为这不是服务器问题,因为我可以在大约相同的时间内从management studio运行这两个查询,只有在.net 1.1和2.0中通过oledb运行时,这似乎才是一个问题。我们已经在它上面运行了一个探查器,跟踪文件确认,当以这种方式调用时,完成查询需要5分钟以上

乔尔·科霍恩同意,但我想说的是为什么,因为现在我们不知道这个问题有多大,它在哪里

4Cade Roux,这种差异是非常可复制的,所以我认为它不是
索引更改或缓存出现问题,因为我已使用相同的结果背靠背运行测试,并且它们在SQL Server中运行的时间大致相同。

我怀疑这是一个过程缓存问题。存储过程的一个好处是为您存储计划,这会加快速度。不幸的是,即使使用动态查询,也有可能在缓存中获得错误的计划

只是为了好玩,我检查了我的过程缓存,运行了一个临时查询,再次检查,然后我以不同的大写字母运行了相同的查询,我惊讶地看到过程计数更高

试试这个

连接到SQL Server Management Studio

DBCC MemoryStatus

Select Columns... From TABLES.... Where....

dbcc MemoryStatus

Select Columns... From tables.... Where....

dbcc MemoryStatus
我想您会发现,当语句更改时,TotalProcs也会更改,即使唯一的更改是区分大小写的


更新您的统计数据可能会有所帮助。这是一个相当缓慢的运行过程,因此您可能希望在一个缓慢的时间段内运行它。

我怀疑这是一个过程缓存问题。存储过程的一个好处是为您存储计划,这会加快速度。不幸的是,即使使用动态查询,也有可能在缓存中获得错误的计划

只是为了好玩,我检查了我的过程缓存,运行了一个临时查询,再次检查,然后我以不同的大写字母运行了相同的查询,我惊讶地看到过程计数更高

试试这个

连接到SQL Server Management Studio

DBCC MemoryStatus

Select Columns... From TABLES.... Where....

dbcc MemoryStatus

Select Columns... From tables.... Where....

dbcc MemoryStatus
我想您会发现,当语句更改时,TotalProcs也会更改,即使唯一的更改是区分大小写的


更新您的统计数据可能会有所帮助。这是一个相当缓慢的运行过程,因此您可能希望在一段缓慢的时间内运行该过程。

感谢G Mastros提供了最完整的答案,尽管回顾起来,Cade建议更新统计数据。然而,G Mastos的解决方案更适合我的SQL Server经验水平

谢谢你帮助大家


我将探究为什么这一看似无辜的差异会产生如此巨大的后果

多亏G Mastros提供了最完整的答案,尽管回顾一下统计数据的更新是由Cade建议的。然而,G Mastos的解决方案更适合我的SQL Server经验水平

谢谢你帮助大家


我将探讨为什么这种看似无辜的差异会产生如此大的后果

如果您使用SQL Server和.Net,这是有意义的。是的,但它意味着可以与其他数据库互换,我们刚刚注意到SQL Server中的这种行为,所以我专门询问了它。如果您使用SQL Server和.Net,这是有道理的。是的,但它意味着可以与其他数据库互换,我们刚刚注意到SQL server中的这种行为,所以我专门问了它。您只在这两个查询之间进行了隔离,没有其他因素,每次都会得到性能差异?我要向微软开一张罚单——这些查询之间没有足够的差异来衡量性能差异。你只将这两个查询隔离开来,没有其他因素,每次都会得到性能差异?我会向微软开出一张罚单——这些查询之间没有足够的差异来弥补性能差异。两个查询之间的差异,一个在5分钟以上返回,一个在100毫秒内返回。两个查询之间的差异,一个在5分钟以上返回,一个在100毫秒内返回