Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/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# 使用“不存在”查询超时_C#_Sql - Fatal编程技术网

C# 使用“不存在”查询超时

C# 使用“不存在”查询超时,c#,sql,C#,Sql,我有一个查询,目的是查找表项位置中的记录,而不存在于一年中特定月份的表操作详细信息中 SELECT il.item_id, il.SEQUENCE, SUM (il.quantity) AS quantity, i.buy_price, i.sell_price, i.item_name, i.unit_measure_id, i.is_raw_item AS is_raw FROM item_location il,

我有一个查询,目的是查找表项位置中的记录,而不存在于一年中特定月份的表操作详细信息中

SELECT il.item_id, 
       il.SEQUENCE, 
       SUM (il.quantity) AS quantity, 
       i.buy_price,
       i.sell_price, i.item_name, i.unit_measure_id,
       i.is_raw_item AS is_raw
FROM item_location il, item i
WHERE il.quantity <> 0
AND il.item_id = i.item_id
AND il.SEQUENCE = i.SEQUENCE
AND NOT EXISTS (
                 SELECT od.*
                 FROM operation_detail od, operation_header oh, rt_operation o
                 WHERE od.item_id = il.item_id
                 AND od.SEQUENCE = il.SEQUENCE
                 AND od.operation_header_id = oh.operation_header_id
                 AND oh.operation_type_id = o.operation_type_id
                 AND o.operation_stock IN ('I', 'O')
                 AND MONTH (oh.operation_date) = @MONTH
                 AND YEAR (oh.operation_date) = @YEAR)
GROUP BY il.item_id,
         il.SEQUENCE,
         i.buy_price,
         i.sell_price,
         i.item_name,
         i.unit_measure_id,
         i.is_raw_item
请注意,使用DataAdapter从.net平台运行此查询会导致超时,从SQL运行此查询需要40秒


我的主要问题是超时…任何建议运行查询的默认超时时间是30秒,如果您的命令需要更长时间,它将被终止。我想您应该优化查询以更快地运行,但也可以增加数据适配器的超时时间:

dataAdapter.SelectCommand.CommandTimeout = 120; // Two minutes

每当我看到包含多个分组列的查询时,我就开始认为可以重写该查询。通常,您应该尝试仅对键列进行分组,将键和聚合结果存储到临时表中,然后加入该临时表以获取其他详细信息。例如:

insert into
    #tmp
select
    key1, key2, sum(things)
from
    table;
然后:

这将避免必须对所有非键列进行排序的所有开销,这是作为分组操作的一部分发生的

第二,因为在not exists子句中有一个相关子查询,所以在本例中,应该在匹配谓词上提供一个或多个索引,item_id和sequence。exists的工作方式是,如果结果集包含任何行,它将返回true,但它仍然需要为外部查询的每一行重新执行内部查询。所以你需要索引来减少痛苦


因为您的内部查询本身包含3个连接,所以我会认真考虑单独运行,并将结果存储在另一个临时表中。

< P>为了提高性能,不要使用非SGARABLE WHERE子句。使查询不可搜索的主要错误是直接在WHERE子句中的列上使用函数。这不会使用索引

请看这个示例,其中为查询强制索引查找操作声明新参数

DECLARE @YEAR int = 1971,
        @MONTH int = 11,
        @StartDate datetime,
        @EndDate datetime
SELECT @StartDate = CAST(CAST(@YEAR AS nvarchar(4)) + RIGHT('0' + CAST(@MONTH AS nvarchar(2)), 2) + '01' AS datetime),
       @EndDate = DATEADD(month, 1, CAST(@YEAR AS nvarchar(4)) + RIGHT('0' + CAST(@MONTH AS nvarchar(2)), 2) + '01')

SELECT
...
WHERE od.item_id = il.item_id
  AND od.SEQUENCE = il.SEQUENCE
  AND od.operation_header_id = oh.operation_header_id
  AND oh.operation_type_id = o.operation_type_id
  AND o.operation_stock IN ('I', 'O')
  AND oh.operation_date >= @StartDate AND oh.operation_date < @EndDate 

有关于操作详细信息、操作标题和rt操作的索引吗?有没有看过执行计划?您使用的是什么数据库系统?似乎是MSSQL,因为它在应用程序端使用.NET。-,ConnectionTimeout不是要设置的属性,更喜欢命令特定命令的超时…此外,我更喜欢写TimeSpan.FromMinutes2.TotalSeconds之类的东西;但这只是味道的问题…谢谢,亲爱的,这个查询在一个循环中运行了3次,持续了1、2和3个月,设置CommandTimeout=120。第一次运行查询时,它会运行得很好,第二次它给事务处理时,SID 87是另一个进程的锁资源上的死锁,并被选为死锁受害者。重新运行TransactionOrry进行编辑,否则我将无法删除我的否决票。。。希望你能理解!我如何提供索引?你是说创建索引,还是在表上查看现有索引,或者其他什么?我是说你希望我这样做的方式,你建议我提供索引,那么我如何提供索引?我明白了。我只是想确保相关表中这些列上有索引。如果它们不存在,就创建它们。伙计们正在使用SQL 2008,我的主要问题是我不明白为什么这样一个查询会花费这么多时间来执行,现在给定的月份=2执行时间是1:30 MN您有关于操作日期列的索引吗?
DECLARE @YEAR int = 1971,
        @MONTH int = 11,
        @StartDate datetime,
        @EndDate datetime
SELECT @StartDate = CAST(CAST(@YEAR AS nvarchar(4)) + RIGHT('0' + CAST(@MONTH AS nvarchar(2)), 2) + '01' AS datetime),
       @EndDate = DATEADD(month, 1, CAST(@YEAR AS nvarchar(4)) + RIGHT('0' + CAST(@MONTH AS nvarchar(2)), 2) + '01')

SELECT
...
WHERE od.item_id = il.item_id
  AND od.SEQUENCE = il.SEQUENCE
  AND od.operation_header_id = oh.operation_header_id
  AND oh.operation_type_id = o.operation_type_id
  AND o.operation_stock IN ('I', 'O')
  AND oh.operation_date >= @StartDate AND oh.operation_date < @EndDate