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

转载自:

最近線上系統突然出現匯出資料超過
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

什么是函数

mysql中的函数与存储过程类似,都是一组SQL集;

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

 

与存储过程的区别

函数可以return值,存储过程不能直接return,但是有输出参数可以输出多个返回值;

函数可以嵌入到sql语句中使用,而存储过程不能;

函数一般用于实现较简单的有针对性的功能(如求绝对值、返回当前时间等),存储过程用于实现复杂的功能(如复杂的业务逻辑功能);

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

mysql自带函数

mysql本身已经实现了一些常见的函数,如数学函数、字符串函数、日期和时间函数等等,不一一列举,这里简单的使用下几个函数:

求绝对值ABS:

图片 1

求ASCII:

图片 2

时间相关(NOW、CURRENT_DATE、CURRENT_TIME):

图片 3

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

自定义函数

自定义个函数,判断输入参数是否大于等于10:

图片 4

-- ----------------------------
-- Function structure for `func_compare`
-- ----------------------------
DROP FUNCTION IF EXISTS `func_compare`;
DELIMITER ;;
CREATE DEFINER=`root`@`localhost` FUNCTION `func_compare`(a int) RETURNS varchar(200) CHARSET utf8
BEGIN
    #Routine body goes here...
  IF a >= 10 THEN
        RETURN '大于等于10';
  ELSE
      RETURN '小于10';
  END IF;
END
;;
DELIMITER ;

图片 5

验证函数:

SELECT func_compare(9), func_compare(11)

执行结果:

图片 6

            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筆資料.

发表评论

电子邮件地址不会被公开。 必填项已用*标注