获取 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 行值的最快方法?的主要内容,如果未能解决你的问题,请参考以下文章