日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長提供免費收錄網(wǎng)站服務(wù),提交前請做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(wù)(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

本文介紹了如何讓多參數(shù)的SQL Server過濾程序更快的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧!

問題描述

目前我正在努力尋找在大表格中搜索的來源,我有一個很好的模型化表格1個主要表格供用戶使用,還有幾個表格用于性別、地址、上次購買、評論的產(chǎn)品等功能。

合并和篩選時EF非常慢,因此我決定使用存儲過程并使用Dapper進(jìn)行調(diào)用。
我想過濾這些幾乎5.5 GB(47萬行)的數(shù)據(jù)
轉(zhuǎn)到更大,31列,7個表,每個表+15列)。
我有5個不同的過濾器,它必須很快。因為這個程序
預(yù)計響應(yīng)時間為1分鐘

查詢應(yīng)使用動態(tài)參數(shù)

我必須這樣做,我嘗試了一些不同的方法,但仍然很慢。我有5個過濾器和1個日期聲明。用戶可以發(fā)送5個、4個或3個篩選器,也可以不發(fā)送篩選器。

    我試過的方法,如果參數(shù)為空,它不會做任何事情,但參數(shù)不是空的,而不是過濾,但我從博客上讀到使用‘or’確實會降低性能
    where (SaOr.InsertDate between ISNULL(@StartDate,'1900-01-01') and ISNULL(DATEADD(DAY, 1, @DueDate),@TOMORROW))
            and (@ProductName is null or  SaOrPr.Name like '%' + @ProductName + '%')
            and (@PaymentType is null or LEN(@PaymentType)> LEN(REPLACE(@PaymentType,PaymentMethodId,'')) )
            and (@Channel is null or LEN(@Channel)> LEN(REPLACE(@Channel,SaOr.ChannelId,'')))
            and (@SalesType is null or  LEN(@SalesType)> LEN(REPLACE(@SalesType,SalesOrderTypeId,'')) )
            and (@SalesStatus is null or  LEN(@SalesStatus)> LEN(REPLACE(@SalesStatus,StatusId,''))  )
    我嘗試過的方法,沒有‘or’,但速度比%1慢。
    where (SaOr.InsertDate between ISNULL(@StartDate,'1920-01-01') and ISNULL(DATEADD(DAY, 1, @DueDate),@TOMORROW)) 
      
            AND (SELECT CHARINDEX(ISNULL(ISNULL(@ProductName,SaOrPr.[Name]),' '),ISNULL(SaOrPr.[Name],' '))) >0
            AND (SELECT CHARINDEX(ISNULL(CAST(PaymentMethodId AS VARCHAR(38)),' '),ISNULL(ISNULL(@PaymentType,PaymentMethodId),' '))) >0
             AND (SELECT CHARINDEX(ISNULL(CAST(SaOr.ChannelId AS VARCHAR(38)),' '),ISNULL(ISNULL(@Channel,SaOr.ChannelId),' '))) >0
              AND (SELECT CHARINDEX(ISNULL(CAST(SalesOrderTypeId AS VARCHAR(38)),' '),ISNULL(ISNULL(@SalesType,SalesOrderTypeId),' '))) >0
               AND (SELECT CHARINDEX(ISNULL(CAST(StatusId AS VARCHAR(38)),' '),ISNULL(ISNULL(@SalesStatus,StatusId),' '))) >0

    方法正在使用動態(tài)查詢

    DECLARE@QUERY varchar(Max)=‘INSERT INTO#TmpResult
    選擇
    一些字段
    來自#tmpSales saor

     where ( FilteredCount between   @pagination  and   @pagination + @PageSize - 1) '
    
     + CASE WHEN @PaymentType IS NOT NULL THEN
     ' AND LEN(@PaymentType)> LEN(REPLACE(@PaymentType,CONVERT(varchar(38),SaOr.PaymentMethodId),''''))  ' ELSE '' END
    
     + CASE WHEN @Channel IS NOT NULL THEN
     ' AND LEN(@Channel)> LEN(REPLACE(@Channel,CONVERT(varchar(38),SaOr.ChannelId),''''))  ' ELSE '' END
    
     + CASE WHEN @SalesType IS NOT NULL THEN
     ' AND LEN(@SalesType)> LEN(REPLACE(@SalesType,CONVERT(varchar(38),SaOr.SalesOrderTypeId),''''))  ' ELSE '' END
    
     + CASE WHEN @SalesStatus IS NOT NULL THEN
     ' AND LEN(@SalesStatus)> LEN(REPLACE(@SalesStatus,CONVERT(varchar(38),SaOr.StatusId),''''))  ' ELSE '' END
    
     +    '  OPTION (RECOMPILE);';
    

盡管仍然不夠快,但3.方法在大約15秒內(nèi)就能響應(yīng)。我應(yīng)該如何在幾秒鐘內(nèi)完成?

推薦答案

您需要執(zhí)行幾個步驟。

    將表劃分為2個或3個部分,如篩選產(chǎn)品和付款,然后插入到#temptable中,并與Channel等其他表應(yīng)用內(nèi)部連接,并獲得篩選的數(shù)據(jù)#Tempable2,然后將第二個temptable與Sales和SalesType連接
    在WHERE中篩選列,在所有列上創(chuàng)建索引。

如果您一次從所有表中獲取數(shù)據(jù)并應(yīng)用篩選器,則會同時篩選數(shù)百萬條記錄。因此,如果劃分表,則篩選將應(yīng)用于較少的記錄。

這篇關(guān)于如何讓多參數(shù)的SQL Server過濾程序更快的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,

分享到:
標(biāo)簽:dapper database entity-framework errorHowshouldmakefasterSQLServerfilteri
用戶無頭像

網(wǎng)友整理

注冊時間:

網(wǎng)站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨大挑戰(zhàn)2018-06-03

數(shù)獨一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學(xué)四六

運動步數(shù)有氧達(dá)人2018-06-03

記錄運動步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績評定2018-06-03

通用課目體育訓(xùn)練成績評定