Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/17.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
.net 基数估计问题?日期时间参数与强制转换?_.net_Vb.net_Sql Server 2005 - Fatal编程技术网

.net 基数估计问题?日期时间参数与强制转换?

.net 基数估计问题?日期时间参数与强制转换?,.net,vb.net,sql-server-2005,.net,Vb.net,Sql Server 2005,我在为下面发布的查询解决性能不佳的问题 我的问题是: 如果我在SQLServerManagementStudio中或使用.NETSQLClient运行下面的精确查询,则查询运行平均需要14秒 但是,如果在.NET中我去掉了查询的这一部分: DECLARE @time_diff INT DECLARE @start_date DATETIME DECLARE @end_date DATETIME SET @time_diff = 2 SET @start_date = '05/04/11 00:

我在为下面发布的查询解决性能不佳的问题

我的问题是:

如果我在SQLServerManagementStudio中或使用.NETSQLClient运行下面的精确查询,则查询运行平均需要14秒

但是,如果在.NET中我去掉了查询的这一部分:

DECLARE @time_diff INT
DECLARE @start_date DATETIME
DECLARE @end_date DATETIME

SET @time_diff = 2
SET @start_date = '05/04/11 00:00:00 AM'
SET @end_date = '5/4/2011 11:59:59 PM'
并在代码中使用如下参数:

sqlParameter = sqlCmd.Parameters.Add(New SqlParameter("@start_date", System.Data.SqlDbType.DateTime))
sqlParameter.Value = parameters.StartDate
sqlParameter = sqlCmd.Parameters.Add(New SqlParameter("@end_date", System.Data.SqlDbType.DateTime))
sqlParameter.Value = parameters.EndDate
然后查询运行大约需要2-3分钟

另外,我注意到,如果我用字符串日期常量替换参数值并在.NET或SSMS中运行,运行大约需要2-3分钟

--AND v.call_start_time BETWEEN @start_date AND @end_date
AND v.call_start_time BETWEEN '05/04/11' AND '5/4/2011 11:59:59 PM'
我找到了这篇关于基数和查询优化器的文章,我认为这与我的问题有关,但在我的案例中似乎没有意义。 根据这篇文章,在确定基数时应该执行强制类型转换。就我而言,这似乎没有发生。这篇文章还说使用参数代替局部变量——这对.NET参数也不起作用

关于改用存储过程: 我有一个可变数量的参数,我不知道它会有多好的结果。即使这是唯一的选择,那么我仍然想知道到底是什么问题

查询:

DBCC DROPCLEANBUFFERS
DBCC FREEPROCCACHE

SET STATISTICS IO ON

DECLARE @time_diff INT
DECLARE @start_date DATETIME
DECLARE @end_date DATETIME

SET @time_diff = 2
SET @start_date = '05/04/11 00:00:00 AM'
SET @end_date = '5/4/2011 11:59:59 PM'

--INSERT QUERY
SELECT * INTO ##tmp_15 FROM (-- PRI CALL RECORDINGS SEARCH QUERY:
    SELECT DISTINCT
    v.call_recording_id,
    v.call_start_time,
    v.call_source,
    v.call_type,
    IsNull(v.phone, '') AS phone,
    d.call_duration_seconds AS pri_call_duration_seconds,
    IsNull(cdr.extension, 'N/A') AS pri_extension,
    IsNull(users.last_name, 'N/A') AS pri_last_name,
    IsNull(users.first_name, 'N/A') AS pri_first_name,
    NULL AS debtor_no,
    NULL AS d_extension,
    NULL AS d_last_name,
    NULL AS d_first_name
    FROM tbl_call_recordings AS v
    JOIN tbl_pri_call_details AS d ON v.call_recording_id = d.call_recording_id
    LEFT JOIN (
        SELECT extension, phone, call_start_time
        FROM tbl_pri_cdr_records
        WHERE is_discard = 0
    ) AS cdr ON v.phone = cdr.phone AND
        ABS(DATEDIFF(mi, v.call_start_time, cdr.call_start_time)) <= @time_diff

    -- MATCH RECORDS TO USER INFO VIA EXTENSION
     LEFT JOIN (
        SELECT extension,
               start_date,
               IsNull(end_date, GETDATE()) AS end_date,
               usr.user_id,
               last_name,
               first_name,
              cr_user_id
        FROM tbl_extensions AS ext
        JOIN tbl_extension_users AS ext_usr ON ext.id = ext_usr.extension_id
        JOIN tbl_users AS usr ON ext_usr.user_id = usr.user_id
    ) AS users ON cdr.extension = users.extension
    AND v.call_start_time BETWEEN users.start_date AND users.end_date
    WHERE 1 = 1

    -- INSERT PRI SEARCH CONSTRAINTS HERE:
    AND v.call_start_time BETWEEN @start_date AND @end_date
    --AND v.call_start_time BETWEEN '05/04/11' AND '5/4/2011 11:59:59 PM'

UNION

-- DIALER RECORDINGS SEARCH QUERY:
      SELECT
        v.call_recording_id,
        v.call_start_time,
        v.call_source,
        v.call_type,
        IsNull(v.phone, '') AS phone,
        NULL AS pri_call_duration_seconds,
        NULL AS pri_extension,
        NULL AS pri_last_name,
        NULL AS pri_first_name,
       d.debtor_no,
        IsNull(users.extension, 'N/A') AS extension,
        IsNull(users.last_name, 'N/A') AS last_name,
        IsNull(users.first_name, 'N/A') AS first_name
      FROM tbl_call_recordings AS v
      JOIN tbl_dialer_call_details AS d ON v.call_recording_id = d.call_recording_id

      -- MATCH RECORDS TO USER INFO VIA EXTENSION
      LEFT JOIN (
                SELECT extension,
                       start_date,
                       IsNull(end_date, GETDATE()) AS end_date,
                       last_name,
                       first_name,
                       cr_user_id
                FROM tbl_extensions AS ext
                JOIN tbl_extension_users AS ext_usr ON ext.id = ext_usr.extension_id
                JOIN tbl_users AS usr ON ext_usr.user_id = usr.user_id

      ) as users ON d.agent = users.cr_user_id
        AND v.call_start_time BETWEEN users.start_date AND users.end_date
      WHERE 1 = 1
      -- INSERT DIALER SEARCH CONSTRAINTS HERE:
    AND v.call_start_time BETWEEN @start_date AND @end_date
    --AND v.call_start_time BETWEEN '05/04/11' AND '5/5/2011'
)t

自上次更新统计数据以来,数据的变化似乎对当前考虑的范围产生了不成比例的影响,这意味着统计数据目前具有误导性,需要手动更新


因此,与有机会查看实际值相比,使用变量可以获得更好的性能?也许您需要更新该表上的统计信息。是的,我使用变量获得了更好的性能-但只有在sql中声明和设置时。在.NET中使用参数时,性能为2-3分钟,而不是15秒。如果.NET参数未运行,更新统计信息是否仍然有意义?是的,我认为是这样。“我认为这些参数值仍在嗅探中。@马丁-这很有效,谢谢。现在每件事的平均时间是15秒。提交它作为一个答案,我会给你们信用。这篇文章非常适合我的情况。每天有2500万条记录+60K条,在日期和时间上有聚集索引。我运行的查询也希望获得最后的记录。看来我得制定一个更新统计数据的时间表了。