首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • [向zjcxc提问]向专家求教,这样的function应该怎么优化 [已结贴,结贴人:M1234]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-16 19:11:26 楼主
    首先架构肯定是不好的,但先不论这个,同事写出一堆这样的function,我无从下手了。

    CREATE FUNCTION [dbo].[fnA]
    (
      @p_ProviderId        CHAR(10),
      @p_ProviderName      NVARCHAR(256),
      @p_DeliveryId        CHAR(10),
      @p_DeliveryName      NVARCHAR(75),
      @p_FileId            CHAR(10),
      @p_RawFileName      NVARCHAR(256),
      @p_ProcessStatus    TINYINT,
      @p_StartDownloadDate SMALLDATETIME,
      @p_EndDate          SMALLDATETIME,
      @p_ParseRateBegin    DECIMAL(5, 2),
      @p_ParseRateEnd      DECIMAL(5, 2),
      @p_UserId            INT
    )
    RETURNS TABLE
    AS
    RETURN
      SELECT a.FileId            AS r_PK,
              a.FileId            AS r_FileId,
              b.RawFileName        AS r_RawFileName,
              c.DeliveryName      AS r_DeliveryName,
              c.ProviderDeliveryId AS r_ProviderDeliveryId,
              d.CompanyName        AS r_CompanyName,
              d.ProviderId        AS r_ProviderId,
              b.DownloadDate      AS r_DownloadDate,
              a.ParseDate          AS r_ParseDate,
              b.RawFileDate        AS r_RawFileDate,
              e.Email              AS r_Email,
              b.LastUpdate        AS r_LastUpdate,
              a.Status            AS r_Status,
              a.ParseRowsRate      AS r_ParseRowsRate,
              a.ParseDataDetail    AS r_ParseDataDetail,
              a.ImportDataDetail  AS r_ImportDataDetail,
              dbo.fn_UserIdMappingToString(d.ProviderId, 256) AS r_Analysts
        FROM dbo.PerformanceFileStatus a
              INNER JOIN DB1.dbo.ProviderRawFile b ON a.FileId = b.FileId
              INNER JOIN DB1.dbo.ProviderDelivery c ON b.ProviderDeliveryId = c.ProviderDeliveryId
              INNER JOIN DB1.dbo.ClientCompany d ON c.ProviderId = d.ProviderId
              LEFT JOIN DB1.dbo.UserSearch e ON b.UserId = e.UserId
        WHERE a.Status <> 9
          AND ( a.FileId = @p_FileId OR @p_FileId IS NULL
                                      AND b.DownloadDate >= ISNULL(@p_StartDownloadDate, CONVERT(CHAR(10), GETDATE(), 120))
                                      AND b.DownloadDate <= ISNULL(@p_EndDate, CONVERT(CHAR(10), GETDATE(), 120) + ' 23:59:00')
                                      AND (@p_ProviderId IS NULL OR d.ProviderId = @p_ProviderId)
                                      AND (@p_ProviderName IS NULL OR d.CompanyName LIKE @p_ProviderName)
                                      AND (@p_DeliveryId IS NULL OR c.ProviderDeliveryId = @p_DeliveryId)
                                      AND (@p_DeliveryName IS NULL OR c.DeliveryName LIKE @p_DeliveryName)
                                      AND (@p_RawFileName IS NULL OR b.RawFileName LIKE @p_RawFileName)
                                      AND (@p_ProcessStatus IS NULL OR @p_ProcessStatus = 0 AND a.Status = 0
                                                                    OR @p_ProcessStatus = 1 AND a.Status IN (1, 2, 12)
                                                                    OR @p_ProcessStatus = 2 AND a.Status IN (4, 11)
                                                                    OR @p_ProcessStatus = 3 AND a.Status IN (3, 13))
                                      AND ( @p_ParseRateBegin IS NULL OR a.ParseRowsRate >= @p_ParseRateBegin )
                                      AND ( @p_ParseRateEnd IS NULL OR a.ParseRowsRate <= @p_ParseRateEnd )
                                      AND ( @p_UserId IS NULL
                                            OR EXISTS ( SELECT 1
                                                          FROM DB1.dbo.UserIdMapping f
                                                          WHERE ( d.ProviderId = f.Id AND f.IdType = 256 AND f.UserId = @p_UserId ))))
    100  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-16 19:16:551楼 得分:5
    签到 :)
    貌似没有好的优化空间.
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-17 08:43:362楼 得分:5
    引用 1 楼 hery2002 的回复:
    貌似没有好的优化空间.


    深切赞同. LZ看看执行计划, 确定索引吧.
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-17 08:51:063楼 得分:5
    语句就算优化也提升不了多少时间。
    在索引上下功夫吧``
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-17 08:52:204楼 得分:5
    看看执行计划.
    优化一下索引是否正确建立 :)
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • only_endure
    • 等级:
    发表于:2008-07-17 08:57:455楼 得分:10
    执行一下优化策略,调试索引选择或顺序.
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-17 09:03:416楼 得分:5
    sqlserver不会为Function维护统计资料,还是转成View较好.
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-17 09:09:247楼 得分:0
    期待更多不同的声音
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-17 09:11:188楼 得分:5
    其实是优化一个查询。通过执行计划利用索引优化。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • tianhuo_soft
    • 等级:
    发表于:2008-07-17 09:17:499楼 得分:5
    最好把你的表结构 贴出来
    然后在把需求写出来
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-17 10:22:4610楼 得分:15
    SQL code
    CREATE FUNCTION [dbo].[fnA] ( @p_ProviderId CHAR(10), @p_ProviderName NVARCHAR(256), @p_DeliveryId CHAR(10), @p_DeliveryName NVARCHAR(75), @p_FileId CHAR(10), @p_RawFileName NVARCHAR(256), @p_ProcessStatus TINYINT, @p_StartDownloadDate SMALLDATETIME, @p_EndDate SMALLDATETIME, @p_ParseRateBegin DECIMAL(5, 2), @p_ParseRateEnd DECIMAL(5, 2), @p_UserId INT ) RETURNS TABLE AS RETURN SELECT a.FileId AS r_PK, a.FileId AS r_FileId, b.RawFileName AS r_RawFileName, c.DeliveryName AS r_DeliveryName, c.ProviderDeliveryId AS r_ProviderDeliveryId, d.CompanyName AS r_CompanyName, d.ProviderId AS r_ProviderId, b.DownloadDate AS r_DownloadDate, a.ParseDate AS r_ParseDate, b.RawFileDate AS r_RawFileDate, e.Email AS r_Email, b.LastUpdate AS r_LastUpdate, a.Status AS r_Status, a.ParseRowsRate AS r_ParseRowsRate, a.ParseDataDetail AS r_ParseDataDetail, a.ImportDataDetail AS r_ImportDataDetail, dbo.fn_UserIdMappingToString(d.ProviderId, 256) AS r_Analysts FROM dbo.PerformanceFileStatus a INNER JOIN DB1.dbo.ProviderRawFile b ON a.FileId = b.FileId INNER JOIN DB1.dbo.ProviderDelivery c ON b.ProviderDeliveryId = c.ProviderDeliveryId INNER JOIN DB1.dbo.ClientCompany d ON c.ProviderId = d.ProviderId LEFT JOIN DB1.dbo.UserSearch e ON b.UserId = e.UserId WHERE a.Status <> 9 AND ( a.FileId = @p_FileId OR @p_FileId IS NULL AND b.DownloadDate BETWEEN ISNULL(@p_StartDownloadDate, CONVERT(CHAR(10), GETDATE(), 120)) AND ISNULL(@p_EndDate, CONVERT(CHAR(10), GETDATE(), 120) + ' 23:59:00') AND (@p_ProviderId IS NULL OR d.ProviderId = @p_ProviderId) AND (@p_ProviderName IS NULL OR CONTAINS(d.CompanyName,@p_ProviderName)) AND (@p_DeliveryId IS NULL OR c.ProviderDeliveryId = @p_DeliveryId) AND (@p_DeliveryName IS NULL OR CONTAINS(c.DeliveryName,@p_DeliveryName)) AND (@p_RawFileName IS NULL OR CONTAINS(b.RawFileName,@p_RawFileName)) AND (@p_ProcessStatus IS NULL OR (@p_ProcessStatus = 0 AND a.Status = 0) OR (@p_ProcessStatus = 1 AND a.Status IN (1, 2, 12)) OR (@p_ProcessStatus = 2 AND a.Status IN (4, 11)) OR (@p_ProcessStatus = 3 AND a.Status IN (3, 13))) AND ( @p_ParseRateBegin IS NULL OR a.ParseRowsRate >= @p_ParseRateBegin ) AND ( @p_ParseRateEnd IS NULL OR a.ParseRowsRate <= @p_ParseRateEnd ) AND ( @p_UserId IS NULL OR EXISTS ( SELECT 1 FROM DB1.dbo.UserIdMapping f WHERE ( d.ProviderId = f.Id AND f.IdType = 256 AND f.UserId = @p_UserId )))) 使用LIKE改为CONTAINS全文检索。使用之前必须创建全文检索。具体查看帮助。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-17 10:38:5511楼 得分:5
    SQL code
    a.FileId = @p_FileId OR @p_FileId IS NULL 是不是还可以这样 AND ((a.FileId = @p_FileId OR @p_FileId IS NULL) AND AND b.DownloadDate
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-17 10:54:1712楼 得分:5
    就楼主的查询, 主要还是分析执行计划, 纯粹从语句上可优化的空间很小了
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • tianhuo_soft
    • 等级:
    发表于:2008-07-17 11:30:3613楼 得分:5
    引用 12 楼 zjcxc 的回复:
    就楼主的查询, 主要还是分析执行计划, 纯粹从语句上可优化的空间很小了
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zhuyx808
    • 等级:
    发表于:2008-07-17 11:37:4214楼 得分:15
    一下关联几个表,看哪个表比较大,可以先把需要的东西取出来,用临时表搞搞看
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-17 11:55:1415楼 得分:10
    dbo.fn_UserIdMappingToString(d.ProviderId, 256) AS r_Analysts 的必要性
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-17 12:42:4916楼 得分:0
    。。。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-27 01:43:5617楼 得分:0
    没有其他方法了么?
    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
    世纪乐知(北京)网络技术有限公司 提供技术支持
    Copyright © 2000-2008, CSDN.NET, All Rights Reserved