主頁 > 前端設計 > ASP.NETWeb表單-SQL到CSV輸出極慢

ASP.NETWeb表單-SQL到CSV輸出極慢

2022-01-08 09:23:25 前端設計

我使用指南在 VS 2019 中構建了一個帶有按鈕的 ASP.NET Web 表單,該按鈕在我的 SQL 服務器上執行存盤程序,并將結果寫入 CSV 檔案以通過瀏覽器下載。

這一切都很好,除了它非常慢。

例如,它需要一個多小時才能生成一個 3.4 MB 的 CSV 檔案,其中包含 20K 行。

有什么辦法可以加快速度嗎?

這是我的代碼,因為我確實根據搜索此問題的內容對其進行了一些修改,但不幸的是,這些都沒有幫助:

    Protected Sub ExportCSV(ByVal sender As Object, ByVal e As EventArgs)

    Dim sqlcmd As String = "EXEC my_sp_name;"

    Dim constr As String = ConfigurationManager.ConnectionStrings("CONNSTR").ConnectionString

    Using con As New SqlConnection(constr)

        Using cmd As New SqlCommand(sqlcmd)

            Using sda As New SqlDataAdapter()

                cmd.Connection = con
                sda.SelectCommand = cmd

                Using dt As New DataTable()

                    sda.Fill(dt)

                    Dim csv As String = String.Empty

                    For Each column As DataColumn In dt.Columns
                        csv  = column.ColumnName   ","
                    Next

                    csv  = vbCrLf

                    For Each row As DataRow In dt.Rows

                        For Each column As DataColumn In dt.Columns
                            csv  = row(column.ColumnName).ToString().Replace(",", ";")   ","
                        Next

                        csv  = vbCrLf
                    Next

                    Response.Clear()
                    Response.ClearHeaders()
                    Response.ClearContent()
                    Response.Buffer = True
                    Response.AddHeader("content-disposition", "attachment;filename=Data.csv")
                    Response.Charset = Encoding.UTF8.WebName
                    Response.ContentType = "text/csv"
                    Response.Output.Write(csv)
                    Response.Flush()
                    Response.End()

                End Using
            End Using
        End Using
    End Using

End Sub

我的 SQL 服務器在運行時沒有看到任何活動。我什至可以在幾秒鐘內在我的 SQL 服務器上手動執行具有相同引數的相同存盤程序。

我不知道該怎么做。因此,非常感謝任何幫助。

uj5u.com熱心網友回復:

好的,有一個簡單的解釋為什么它運行得這么慢。事實上,你可以讓這個運行速度快幾百萬倍!

首先:資料庫和索引?20,000 行沒有問題。實際上,如果您使用在垃圾箱中找到的舊計算機?它可以輕松地每秒提取 100,000 行 - 并且在沒有任何索引的情況下針對資料庫執行此操作!- 即使您應用排序和標準。

所以,不,這不是資料庫問題——你的速度非常快,實際上你需要付出一些努力才能使資料庫運行緩慢。

那么,有什么問題呢?

為什么當然是字串連接!!!!

可以這樣想:

假設你必須步行 150 英里

但是,說當你達到 100 英里?去第101英里?

好吧,你回到 1 英里,然后步行 100 英里 1 英里。

那么102英里呢?

你回到第 1 英里,然后步行 102 英里

那么103英里呢?

你回到第 1 英里,然后步行 103 英里

請注意,僅 100 到 103,您現在已經走了 300 多英里!!!

您的字串連接也發生了相同的情況。事實上,在你的字串達到大約 2000 個字符后,你會看到巨大的減速。

那么,假設您的字串現在有 500,000 個字符?

你去

 MyString = MyString & "Hello"

它有什么作用?

為什么它從字符位置 1 開始,并通過 500,000 個字符運行,然后添加第二部分。

所以,這就像走路的問題!!!

順便說一句,最有趣的是有些人建議檢查資料庫速度。事實上,如果你去微軟或谷歌這樣的地方面試呢?

作為開發人員,他們會提出一大堆以您為中心的問題,以回答有關多大、多遠、多少等問題。

換句話說,他們正在尋找具有規模感的開發人員。

我的意思是,你可以步行到 1 個街區外的商店。但是10英里外呢?不,你只能在一天內實際做到這一點!!!(到商店 10 英里,回來 10 英里)。因此,您需要使用某種形式的交通工具。(你需要意識到你不能再步行去商店了——可以嗎??)。

這里發布的可愛的小問題是一個完美的例子,就是這種簡單的思考方式,為什么它運行得這么慢!

事實上,洗掉所有資料庫和所有檔案操作。

試試這個簡單的回圈:

    Dim str1 As String = ""
    Dim str2 As String = Space(500)

    Dim t As Long = Date.Now.Ticks

    Dim i As Integer
    For i = 1 To 3000
        str1 = str1   str2
    Next

    Dim td As Double = (Date.Now.Ticks - t) / 10000 / 1000

    TextBox1.Text = td

那么,一個簡單的回圈到3000?

(您的計算機可以在 1 秒內完成 for/next 回圈到 10 億次!!!)

大約需要 10 秒(在慢速計算機上)。

但是,現在讓我們嘗試 6000。(但請記住,您每次都回到起點,每次您走得更遠才能到達終點)。這不是程序中的線性增長 - 而是指數級的!!!!

So, will it take 20 seconds? No, because each time, you walk back to the start, traverse all to the end, and then add the 2nd string. And each walk each time gets farther (longer) each time!!!

So, with 6000? It should take 20 seconds, right? nope!!!

We get: 48 seconds!!! -- the time increase is exponential!!!1

Now you know why those hiring firms ask the above kind of job interview questions!!! - how high, how far, how big!!! You have to be able to think in terms of these types of probelms.

So, what happens if we create new row of data, but "add" it to say an array, or even a list (which then would be easy to write out as rows to a file).

Lets now try this:

    Dim str2 As String = Space(500)

    Dim myList As List(Of String) = New List(Of String)

    Dim t As Long = Date.Now.Ticks

    Dim i As Integer

    For i = 1 To 6000
        myList.Add(str2)
    Next

    Dim td As Double = (Date.Now.Ticks - t) / 10000 / 1000

    TextBox1.Text = td

Time: 0

it runs so fast, that it don't even register.

Lets go to 100,000 rows.

eg:

    For i = 1 To 100000
        myList.Add(str2)
    Next

time: 0.005033

5 1/1000th of a second!

請注意這是多么令人驚嘆!!!!- 它不僅僅是 1000 倍,而是以 100 倍的速度運行!!!

那么,對于您的代碼?好吧,既然上面的速度非常快,那么我們可以在這里稍微偷懶一點,甚至不必創建一行并將其寫出來。因為我們正在處理 20,000 行?這么小,又是為了節省時間和簡化代碼?

我們可以在上面使用。但是,如果這是 50k 或 100k 行?那么是的,我建議主回圈執行創建行,然后將其發送到檔案中。

但是,我們可以說這樣做:(空氣代碼如下!!!)

    Dim MyOutList As List(Of String) = New List(Of String)
    Dim csv As String = ""


    For Each column As DataColumn In dt.Columns
        csv  = column.ColumnName   ","
    Next

    MyOutList.Add(csv)

    For Each row As DataRow In dt.Rows
        csv = ""
        For Each column As DataColumn In dt.Columns
            csv  = row(column.ColumnName).ToString().Replace(",", ";")   ","
        Next

        MyOutList.Add(csv)

    Next


    Response.Clear()
    Response.ClearHeaders()
    Response.ClearContent()
    Response.Buffer = True
    Response.AddHeader("content-disposition", "attachment;filename=Data.csv")
    Response.Charset = Encoding.UTF8.WebName
    Response.ContentType = "text/csv"
    For Each OneLine As String In MyOutList
        Response.Write(OneLine & vbCrLf)
    Next
    Response.Flush()
    Response.End()

試試上面的方法——它會跑得更快哦!!!

并在這里發回需要多長時間!

因此,我們需要逐行處理資料庫,但不要使用我們一遍又一遍地連接的一些巨大的大字串。

轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/405169.html

標籤:

上一篇:如何查找XAMARINApp崩潰的原因

下一篇:cmakeVisualStudio嵌套共享庫子專案

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • vue移動端上拉加載

    可能做得過于簡單或者比較low,請各位大佬留情,一起探討技術 ......

    uj5u.com 2020-09-10 04:38:07 more
  • 優美網站首頁,頂部多層導航

    一個個人用的瀏覽器首頁,可以把一下常用的網站放在這里,平常打開會比較方便。 第一步,HTML代碼 <script src=https://www.cnblogs.com/szharf/p/"js/jquery-3.4.1.min.js"></script> <div id="navigate"> <ul> <li class="labels labels_1"> ......

    uj5u.com 2020-09-10 04:38:47 more
  • 頁面為要加<!DOCTYPE html>

    最近因為寫一個js函式,需要用到$(window).height(); 由于手寫demo的時候,過于自信,其實對前端方面的認識也不夠體系,用文本檔案直接敲出來的html代碼,第一行沒有加上<!DOCTYPE html> 導致了$(window).height();的結果直接是整個document的高 ......

    uj5u.com 2020-09-10 04:38:52 more
  • WordPress網站程式手動升級要做好資料備份

    WordPress博客網站程式在進行升級前,必須要做好網站資料的備份,這個問題良家佐言是遇見過的;在剛開始接觸WordPress博客程式的時候,因為升級問題和博客網站的修改的一些嘗試,良家佐言是吃盡了苦頭。因為購買的是西部數碼的空間和域名,每當佐言把自己的WordPress博客網站搞到一塌糊涂的時候 ......

    uj5u.com 2020-09-10 04:39:30 more
  • WordPress程式不能升級為5.4.2版本的原因

    WordPress是一款個人博客系統,受到英文博客愛好者和中文博客愛好者的追捧,并逐步演化成一款內容管理系統軟體;它是使用PHP語言和MySQL資料庫開發的,用戶可以在支持PHP和MySQL資料庫的服務器上使用自己的博客。每一次WordPress程式的更新,就會牽動無數WordPress愛好者的心, ......

    uj5u.com 2020-09-10 04:39:49 more
  • 使用CSS3的偽元素進行首字母下沉和首行改變樣式

    網頁中常見的一種效果,首字改變樣式或者首行改變樣式,效果如下圖。 代碼: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, ......

    uj5u.com 2020-09-10 04:40:09 more
  • 關于a標簽的講解

    什么是a標簽? <a> 標簽定義超鏈接,用于從一個頁面鏈接到另一個頁面。 <a> 元素最重要的屬性是 href 屬性,它指定鏈接的目標。 a標簽的語法格式:<a href=https://www.cnblogs.com/summerxbc/p/"指定要跳轉的目標界面的鏈接">需要展示給用戶看見的內容</a> a標簽 在所有瀏覽器中,鏈接的默認外觀如下: 未被訪問的鏈接帶 ......

    uj5u.com 2020-09-10 04:40:11 more
  • 前端輪播圖

    在需要輪播的頁面是引入swiper.min.js和swiper.min.css swiper.min.js地址: 鏈接:https://pan.baidu.com/s/15Uh516YHa4CV3X-RyjEIWw 提取碼:4aks swiper.min.css地址 鏈接:https://pan.b ......

    uj5u.com 2020-09-10 04:40:13 more
  • 如何設定html中的背景圖片(全屏顯示,且不拉伸)

    1 <style>2 body{background-image:url(https://uploadbeta.com/api/pictures/random/?key=BingEverydayWallpaperPicture); 3 background-size:cover;background ......

    uj5u.com 2020-09-10 04:40:16 more
  • Java學習——HTML詳解(上)

    HTML詳解 初識HTML Hyper Text Markup Language(超文本標記語言) 1 <!--DOCTYPE:告訴瀏覽器我們要使用什么規范--> 2 <!DOCTYPE html> 3 <html lang="en"> 4 <head> 5 <!--meta 描述性的標簽,描述一些 ......

    uj5u.com 2020-09-10 04:40:33 more
最新发布
  • 我的第一個NPM包:panghu-planebattle-esm(胖虎飛機大戰)使用說明

    好家伙,我的包終于開發完啦 歡迎使用胖虎的飛機大戰包!! 為你的主頁添加色彩 這是一個有趣的網頁小游戲包,使用canvas和js開發 使用ES6模塊化開發 效果圖如下: (覺得圖片太sb的可以自己改) 代碼已開源!! Git: https://gitee.com/tang-and-han-dynas ......

    uj5u.com 2023-04-20 07:59:23 more
  • 生產事故-走近科學之消失的JWT

    入職多年,面對生產環境,盡管都是小心翼翼,慎之又慎,還是難免捅出簍子。輕則滿頭大汗,面紅耳赤。重則系統停擺,損失資金。每一個生產事故的背后,都是寶貴的經驗和教訓,都是專案成員的血淚史。為了更好地防范和遏制今后的各類事故,特開此專題,長期更新和記錄大大小小的各類事故。有些是親身經歷,有些是經人耳傳口授 ......

    uj5u.com 2023-04-18 07:55:04 more
  • 記錄--Canvas實作打飛字游戲

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 打開游戲界面,看到一個畫面簡潔、卻又富有挑戰性的游戲。螢屏上,有一個白色的矩形框,里面不斷下落著各種單詞,而我需要迅速地輸入這些單詞。如果我輸入的單詞與螢屏上的單詞匹配,那么我就可以獲得得分;如果我輸入的單詞錯誤或者時間過長,那么我就會輸 ......

    uj5u.com 2023-04-04 08:35:30 more
  • 了解 HTTP 看這一篇就夠

    在學習網路之前,了解它的歷史能夠幫助我們明白為何它會發展為如今這個樣子,引發探究網路的興趣。下面的這張圖片就展示了“互聯網”誕生至今的發展歷程。 ......

    uj5u.com 2023-03-16 11:00:15 more
  • 藍牙-低功耗中心設備

    //11.開啟藍牙配接器 openBluetoothAdapter //21.開始搜索藍牙設備 startBluetoothDevicesDiscovery //31.開啟監聽搜索藍牙設備 onBluetoothDeviceFound //30.停止監聽搜索藍牙設備 offBluetoothDevi ......

    uj5u.com 2023-03-15 09:06:45 more
  • canvas畫板(滑鼠和觸摸)

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>canves</title> <style> #canvas { cursor:url(../images/pen.png),crosshair; } #canvasdiv{ bo ......

    uj5u.com 2023-02-15 08:56:31 more
  • 手機端H5 實作自定義拍照界面

    手機端 H5 實作自定義拍照界面也可以使用 MediaDevices API 和 <video> 標簽來實作,和在桌面端做法基本一致。 首先,使用 MediaDevices.getUserMedia() 方法獲取攝像頭媒體流,并將其傳遞給 <video> 標簽進行渲染。 接著,使用 HTML 的 < ......

    uj5u.com 2023-01-12 07:58:22 more
  • 記錄--短視頻滑動播放在 H5 下的實作

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 短視頻已經無數不在了,但是主體還是使用 app 來承載的。本文講述 H5 如何實作 app 的視頻滑動體驗。 無聲勝有聲,一圖頂百辯,且看下圖: 網址鏈接(需在微信或者手Q中瀏覽) 從上圖可以看到,我們主要實作的功能也是本文要講解的有: ......

    uj5u.com 2023-01-04 07:29:05 more
  • 一文讀懂 HTTP/1 HTTP/2 HTTP/3

    從 1989 年萬維網(www)誕生,HTTP(HyperText Transfer Protocol)經歷了眾多版本迭代,WebSocket 也在期間萌芽。1991 年 HTTP0.9 被發明。1996 年出現了 HTTP1.0。2015 年 HTTP2 正式發布。2020 年 HTTP3 或能正... ......

    uj5u.com 2022-12-24 06:56:02 more
  • 【HTML基礎篇002】HTML之form表單超詳解

    ??一、form表單是什么

    ??二、form表單的屬性

    ??三、input中的各種Type屬性值

    ??四、標簽 ......

    uj5u.com 2022-12-18 07:17:06 more