我有一个包含26个部分的页面 - 每个字母表的一个字母。我正在从数据库中检索制造商列表,并为每个制造商创建一个链接 - 使用数据库中的不同字段。所以目前,我打开连接,然后按每个字母做一个新的SELECT,其中名称就像那个字母一样。但这很慢。
有什么更好的方法可以做到这一点?
TIA
答案 0 :(得分:4)
由于您无论如何都要获取它们,您可能会发现一次获取它们并将它们拆分为代码中的字母组会更快。
从另一端看,为什么你需要获取所有列表只是为了构建一组链接?单击其链接时,您不应该获取单个字母吗?
答案 1 :(得分:2)
听起来你正在做26个查询,这些查询永远不会很快。由于网络延迟,建立连接等,单个数据库查询通常至少需要40毫秒。因此,执行此操作26次意味着需要大约40 x 26 ms或超过一秒。当然,根据您的架构,数据集,硬件等,它可能需要更长的时间,但这是一个经验法则,可以让您大致了解查询对整个页面渲染时间的影响。
我处理这种情况的一种方法是使用DataTable
。将所有记录提取到DataTable
,然后您可以遍历字母表,并使用Select
方法进行过滤。
DataTable myData = GetMyData();
foreach(string letter in lettersOfTheAlphabet)
{
myData.Filter(String.Format("Name like '{0}%'", letter));
//create your link here
}
根据您的模型图层,您可能希望以不同的方式进行过滤,但这是应该大大提高性能的基本思路。
假设您正在查询确定使用了哪些字母,以便您知道要呈现哪些链接,您实际上只能查询字母本身,如下所示:
select distinct substring(ManufacturerName, 1, 1) as FirstCharacter
from MyTable
order by 1
答案 2 :(得分:0)
你可以用stored procedure更聪明地做到这一点。让SP在一个调用中返回所有所需的信息,然后突然只有一个数据库交互而不是26 ...
答案 3 :(得分:0)
从一个查询中获取一个结果集并将其拆分。数据库出现了相当多的开销26次基本相同的工作!
答案 4 :(得分:0)
通过存储过程或查询(包括左侧字段(col1,1))以及按该字段排序,将一组中的所有项目(数据集等)带回来。
选择左(col1,1)作为LetterGroup,col1,url_column来自table1,左(col1,1)
然后查看整个结果集,在字母更改时更改部分。
答案 5 :(得分:0)
字母表中的第一个字母很糟糕(抱歉)作为鉴别符。你不需要实际拆分它们(你可以直接问“像'a%'这样的名字),但无论你运行的是什么,你平均会得到1/26左右的名字。这不是非常有效。< / p>
“创建链接 - 在数据库中使用不同的字段”是什么意思 - 这对我来说听起来不错。
答案 6 :(得分:0)
有几种方法可以做到这一点。 1)在您的数据库中创建一个包含所有制造商及其网站链接的视图,然后继续点击每个字母的视图。 2)选择所有制造商一次并将其存储在.net数据集中,然后使用该数据集填充您的链接。
答案 7 :(得分:0)
这对我来说似乎很脏,但您可以创建第一个字母CHAR列并触发填充它。将制造商名称中的第一个字母存储在该列中并对其进行索引。然后从表中选择*,其中FirstLetter ='A'。
或者创建一个包含行A-Z的查找表,并在制造商表中设置外键。您可能需要一个触发器来更新此信息。然后你可以将查找表内部加入到制造商表中。
然后,不是在页面中放置26个数据集,而是有一个链接列表(A-Z),它一次选择并显示一个数据集。
答案 8 :(得分:0)
如果我读了你,那么你正在查询每个制造商,以获得构建链接所需的“不同字段”。如果是这样,那是你的问题,而不是26个字母查询(虽然没有帮助)。
在这种情况下,这个查询的更快方式是:
SELECT manufacturer_name, manufacturer_id, different_field
FROM manufacturers m
INNER JOIN different_field_table d
ON m.manufacturer_id = d.manufacturer_id
ORDER BY manufacturer_name
在您的服务器代码中,像往常一样循环浏览记录。如果需要,在manufacturer_name
的第一个字母发生更改时发出标题。
要获得更高的速度:
different_field_table
上的manufacturer_id
索引。