获取 8101 行值的最快方法?

Posted

技术标签:

【中文标题】获取 8101 行值的最快方法?【英文标题】:Fastest way to get 8101 row values? 【发布时间】:2016-04-06 05:00:35 【问题描述】:

在https://jsfiddle.net/mgjftrdz/1/,而不是以下值:

var availableTags = [
     label: 'honey', value: 1,
     label: 'apples', value: 2,
     label: 'milk', value: 3,
     label: 'tea', value: 4,

我想像这样列出 AirportNames 和 AirportCodes:

 var availableTags = [
         label: 'LAX - Los Angeles Airport', value: 'LAX',
         label: 'JFK - John F Kennedy Airport', value: 'JFK',
         label: 'LHR - London Heathrow Airport', value: 'LHR',
         etc

我有一个包含 8101 行 tblAirportNamesAndCodes 的表。

而不是在 VB.NET 中执行 SqlDataReader 循环,例如:

    Try
        sqlConnection1.Open()
        dr = cmd.ExecuteReader
        While dr.Read()
            strResult += "label: '" + dr("AirportName") + "' value: '" + dr("AirportCode") +"'," 

        End While

在 T-SQL 中是否有一种方法可以在 SQL Server 上进行所有连接并让存储过程只返回一个长字符串?这会更快吗?

【问题讨论】:

你指的是什么版本的SQL server? 你知道asp.net webapi会序列化为json吗?查询数据库并向客户端吐出 json 非常简单。 ***.com/questions/35437032/… SQL 2012。感谢大家的 cmets 和回复。不过,我刚刚有了另一个想法。由于表格是相当静态的,我可以创建一些 vb.net 代码来生成包含这些项目的一次性静态 js 文本文件 (lookup-codes.js),例如var availableTags = [label: 'honey', value: 1, label: 'apples', value: 2 等并保存。然后只需从该网页引用它作为脚本引用 .js。这样就不需要任何 SQL 服务器调用。 【参考方案1】:

您可以将此查询作为起点:

declare @t as varchar(max)

select @t = coalesce(@t + ',
' + name, name) from syscolumns option (maxdop 1)

select @t

但我建议您在 .NET 代码中保留格式化逻辑,而不是将其移至 T-SQL。在您的情况下几乎看不到性能差异,但是如果没有 SQL 内部的格式化逻辑,您的代码将更易于维护。

UPD:同意 @TomTom 关于 StringBuilder。

附:此示例中的选项 (maxdop 1) 仅用于保持复杂查询的行顺序。

【讨论】:

谢谢,知道我是否真的这样做会很有帮助。【参考方案2】:

是的。不要优化错误的元素。

所以,不。

说真的,如果您在传输大约 8000 条小行时遇到问题,那么您要么拥有一个完全糟糕的 sql 服务器(比我的旧手机还小),要么通过慢速连接(互联网)传输它们。在这两种情况下,SQL 都不是您的问题(第二,请在 SQL Server 前面放置一个 Web 服务)。

我看到的一个糟糕的代码实际上是这样的:

strResult += "label: '" + dr("AirportName") + "' value: '" + 博士(“机场代码”)

这在 2 个级别上很糟糕。

它进行字典查找。在循环之前获取字段的索引,然后由它们访问(即'dr(0)')。优化了这一点。

不要像这样把字符串放在一起。将一个大小合适的 StringBuilder 放在那里。你分配了大量的字符串只是为了把它们扔掉。

上次我做这样的事情时,我在半秒内将 50 万个条目读入字典,所以 SQL 不是你的问题。但是你的VB代码很草率。

如果您通过网络连接从一个非常远程的服务器中提取它 - 如果不添加 Web 服务,您将无法做很多事情。

【讨论】:

感谢您的这些优点。我认为我曾经遇到过 100,000 行的性能问题实际上是 VB.NET 循环,而不是您提到的 SQL。

以上是关于获取 8101 行值的最快方法?的主要内容,如果未能解决你的问题,请参考以下文章

XLForm 检测行值的变化

UIPickerView:旋转时获取行值?

尝试使用Javascript从gridview获取复选框选中的行值

从datagridview中选定行的值的ID中获取名称

获取焦点行值与获取焦点单元格值的区别

获取焦点行值与获取焦点单元格值的区别