Sql Server 2005 COUNT 视图花费的时间太长
我的网站中有一个时事通讯的分页列表,我使用此视图来加载它。
这是视图(没有选择列的列表):
SELECT * FROM dbo.NewsletterHistory
INNER JOIN dbo.Newsletter ON dbo.NewsletterHistory.NewsletterId = dbo.Newsletter.NewsletterId
INNER JOIN dbo.sysNewsletterHistoryState ON dbo.NewsletterHistory.sysNewsletterHistoryStateId = dbo.sysNewsletterHistoryState.sysNewsletterHistoryStateId
LEFT JOIN dbo.Client ON dbo.NewsletterHistory.AboutUserId = dbo.Client.ParentUserId
当我尝试执行计数查询以显示分页列表时,就会出现问题。
在 NewsletterHistory 表中,我有大约 700.000 行。
select count(*) from dbo.NewsletterHistoryView newsletter0_ where newsletter0_.DeliveryMethod 11
此计数查询执行大约需要 33 秒。
我不能只将这么多记录存储在某处,因为可以过滤分页列表。
关于如何解决这个问题有什么想法吗?
I have a paged list of newsletters in my website and I use this view to load it.
This is the view (without the list of columns selected):
SELECT * FROM dbo.NewsletterHistory
INNER JOIN dbo.Newsletter ON dbo.NewsletterHistory.NewsletterId = dbo.Newsletter.NewsletterId
INNER JOIN dbo.sysNewsletterHistoryState ON dbo.NewsletterHistory.sysNewsletterHistoryStateId = dbo.sysNewsletterHistoryState.sysNewsletterHistoryStateId
LEFT JOIN dbo.Client ON dbo.NewsletterHistory.AboutUserId = dbo.Client.ParentUserId
The problem appears when I try to execute a count query in order to show the paged list.
In NewsletterHistory table I have about 700.000 rows.
select count(*) from dbo.NewsletterHistoryView newsletter0_ where newsletter0_.DeliveryMethod 11
This count query takes about 33 seconds to execute.
I can't just store this number of records somewhere because the paged list can be filtered.
Any ideas about how to resolve this problem?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
使用以下列在 NewsletterHistory 表上创建索引
我不知道您的数据,因此请尝试三列的不同顺序以找到最快的一列。如果它仍然不够快,请给我更多信息。
Create an index on the NewsletterHistory table with the following columns
I dont know your data, so try different orders of the three columns to find the fastest one. If its still not fast enough, give me more info.
您可以使用 Count(PrimaryID),而不是使用 Count(*)。
Instead of using Count(*) you can use Count(PrimaryID).
显示执行计划并添加缺失的索引。
Display Execution plan and add missing indexes.
一个丑陋的解决方案....将结果放入临时表中进行计数...但我会使用索引...
使用 SQl Server Management Studio ->工具->数据库引擎优化顾问...将所有使用该表的脚本放在那里,让它告诉您什么是构建的最佳索引。这有点有助于手动完成......通过尝试和错误
an ugly solution .... throw your results into a temp table do the count... but i'd go with indexes...
Use the SQl Server management studio -> tools -> Database engine tuning advisor... place all your scripts there that use that table and let it tell you what will be the best indexes to build. It kind of helps doing it manually ... through trail and error