xml地图|网站地图|网站标签 [设为首页] [加入收藏]
高效查詢的範例,操作数据表语句模板
分类:数据库

从网上搜的,一点一点加吧。

if    exists (select * from sysobjects where id=object_id('GenerateData') and  OBJECTPROPERTY(id, 'IsProcedure') =1 )
    Drop Procedure GenerateData
go
CREATE PROCEDURE GenerateData 
@tablename sysname 
AS 
begin
    declare @column varchar(2000) 
    declare @columndata varchar(2000) 
    declare @sql varchar(8000) 
    declare @xtype tinyint 
    declare @name sysname 
    declare @objectId int 
    declare @objectname sysname 
    declare @ident int 

    set nocount on 
    set @objectId=object_id(@tablename) 

    if @objectId is null -- 判断对象是否存在 
    begin 
        print 'The object not exists' 
        return 
    end 
    set @objectname=rtrim(object_name(@objectId)) 

    if @objectname is null or charindex(@objectname,@tablename)=0 --此判断不严密 
    begin 
        print 'object not in current database' 
        return 
    end 

    if OBJECTPROPERTY(@objectId,'IsTable') < > 1 -- 判断对象是否是table 
    begin 
        print 'The object is not table' 
        return 
    end 

    select @ident=status&0x80 from syscolumns where id=@objectid and status&0x80=0x80 

    if @ident is not null 
    print 'SET IDENTITY_INSERT '+@TableName+' ON' 

    declare syscolumns_cursor cursor
    for select c.name,c.xtype from syscolumns c 
    where c.id=@objectid order by c.colid 

    open syscolumns_cursor 
    set @column='' 
    set @columndata='' 
    fetch next from syscolumns_cursor into @name,@xtype 

    while @@fetch_status < >-1 
    begin 
        if @@fetch_status < >-2 
        begin 
            if @xtype not in(189,34,35,99,98) --timestamp不需处理,image,text,ntext,sql_variant 暂时不处理 

            begin 
                set @column=@column+case when len(@column)=0 then'' else ','end+@name 

                set @columndata=@columndata+case when len(@columndata)=0 then '' else ','','','end 
                +case when @xtype in(167,175) then '''''''''+'+@name+'+''''''''' --varchar,char 
                when @xtype in(231,239) then '''N''''''+'+@name+'+''''''''' --nvarchar,nchar 
                when @xtype=61 then '''''''''+convert(char(23),'+@name+',121)+''''''''' --datetime 
                when @xtype=58 then '''''''''+convert(char(16),'+@name+',120)+''''''''' --smalldatetime 
                when @xtype=36 then '''''''''+convert(char(36),'+@name+')+''''''''' --uniqueidentifier 
                else @name end 

            end 

        end 

        fetch next from syscolumns_cursor into @name,@xtype 

    end 

    close syscolumns_cursor 
    deallocate syscolumns_cursor 

    set @sql='set nocount on select ''insert into '+@tablename+'('+@column+') values(''as ''--'','+@columndata+','')'' from '+@tablename 

    print '--'+@sql 
    exec(@sql) 

    if @ident is not null 
    print 'SET IDENTITY_INSERT '+@TableName+' OFF' 
end
GO

最近線上系統突然出現匯出資料超過 10 筆時,查詢逾時的狀況,在仔細查找之後。

-----------设置事务全部回滚-----------------
SET XACT_ABORT ON

BEGIN
BEGIN  TRY
    BEGIN TRANSACTION TR


---------------------------------删除表=======================
--DROP TABLE T_QuestionBankItem


---=================================修改列名========================================
--exec sp_rename 'T_MyCourse.CourseClassId' , 'ClassId', 'column'




-----==========================修改字段类型及默认值------------------

--ALTER TABLE T_Message ALTER COLUMN Title nvarchar(20) NOT NULL




--===========================增加列======================================----

----------------T_AssNews-------------
--alter table T_AssNews ADD ViewCount int NOT NULL Default 0
--EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'浏览量' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'T_AssNews', @level2type=N'COLUMN',@level2name=N'ViewCount'



-----------删除字段、先删除约束
--ALTER TABLE [dbo].[T_TICategory] DROP CONSTRAINT [DF_T_TICategory_TrainingInstitutionId]    
--ALTER TABLE T_TICategory DROP COLUMN TrainingInstitutionId




     COMMIT TRANSACTION TR
     END TRY

     BEGIN CATCH 
        PRINT 'EXECUTED FAILED';

        select error_number() as error_number ,
             error_message() as error_message
        ROLLBACK TRANSACTION TR
        RETURN
    END CATCH
END

EXEC GenerateData '同一数据库下的表名' 

發現了問題原因,透過應用端與數據端兩邊同時調整,將查詢的效率提昇了約數百倍以上

 

首先,原本應用端的商務邏輯為每一分頁筆數固定為10筆,所以使用者最多可以匯出 10 筆資料

而且原本的商務邏輯是寫成這樣的

            if (condition.LCKeys != null && condition.LCKeys.Count > 0)
            {
                sql += "AND (LTRIM(RTRIM(STR(T2.[LawNo],20,3)))+LTRIM(RTRIM(STR([LCNo],20,6)))) IN @LCKeys "; //問題點 (IN參數與欄位用了函數做處理)
                dynamicParams.Add("@LCKeys", condition.LCKeys);
            }

  

這段語法在 SQL Server 執行時,會轉換成以下的範例語法

(這裡 A 表 與 B表 為 1:N 關聯 )

SELECT LawNo,LCNo

FROM A INNER JOIN B

WHERE 1=1 AND LTRIM(RTRIM(STR(LawNo+LCNo))) IN (‘A1’,’A2’….’A10’)

在IN條件少的情況下,即使效率不好,還是可以進行資料匯出的

這次的問題是因為應用商務邏輯修改導致,從原本使用者最多只能匯出 10 筆資料

改為最多能匯出500筆資料.

本文由澳门新葡亰手机版发布于数据库,转载请注明出处:高效查詢的範例,操作数据表语句模板

上一篇:没有了 下一篇:没有了
猜你喜欢
热门排行
精彩图文