我们有一张有2.5亿条记录的桌子(唯一的15位数)。(群集唯一索引列),平均每天将查询至少70万至90万个请求。
我们有多个应用程序访问这个表。每个应用程序将尝试将50万个数据与这2.6亿条记录进行比较。
我们的应用程序将向这个大表添加更多的数据,这实际上减缓了对其他应用程序的查询。
如何提高查询的性能?这张桌子怎么保养?分区?环境: Win 2K8R2,SQL2K8R2,64 it内存,双处理器8核
发布于 2013-02-18 08:31:56
如果多个应用程序只是试图比较数据,那么我相信这些应用程序不会写入表,缓存记录也会有所帮助。另外,还有一种叫做切分的技术,不幸的是,SQL server没有提供这种技术。但是codeplex上有一个库,它为Server提供了这样一个特性。它基本上试图平衡数据库的负载。
我还没有试过,但值得一试。如果你想在这里看到它,http://enzosqlshard.codeplex.com/
发布于 2013-02-18 08:37:28
1.使用临时表格
在您感兴趣的数据子集(行和列)上创建临时表。临时表应该比原始源表小得多,并且可以轻松地进行索引(如果需要的话)。
要创建临时表,可以使用以下代码(未测试):
-- copy records from last month to temporary table
INSERT INTO
#my_temporary_table
SELECT
*
FROM
er101_acct_order_dtl WITH (NOLOCK)
WHERE
er101_upd_date_iso > DATEADD(month, -1, GETDATE())
-- run other queries on temporary table (which can be indexed)
SELECT TOP 100
*
FROM
#my_temporary_table
ORDER BY
er101_upd_date_iso DESC优点:
对于任何数据子集都很容易做到。很容易管理--这是临时的,也是桌子的。不会影响系统的整体性能,如视图。临时表可以被索引。缺点:
这是数据的快照--但这可能对临时查询来说足够好了。
2.创建视图
类似于上面,但是创建视图而不是临时表。
您可以在您感兴趣的数据子集上创建视图或索引视图,并在视图上运行查询--这应该只包含比整个表小得多的有趣的数据子集。
优点:
一苇可航。它是最新的源数据。缺点:
可能只适用于定义的数据子集。对于更新速度较高的大型表,可能效率低下。管理起来可不容易。会影响整个系统的性能。在大表上选择所有运行星型查询(SELECT * FROM)的列不是件好事.
如果您有大型列(如长字符串),则从磁盘读取它们并通过网络传递需要大量时间。
我会尝试用你真正需要的列名来代替*。
或者,如果需要所有列,请尝试将查询重写到以下内容:
;WITH recs AS (
SELECT TOP 100
id as rec_id -- select primary key only
FROM
er101_acct_order_dtl
ORDER BY
er101_upd_date_iso DESC
)
SELECT
*
FROM
er101_acct_order_dtl
WHERE
id = rec.rec_id
ORDER BY
er101_upd_date_iso DESC 脏读
最后一件可以加速查询的事情是允许带有表提示的脏读取(NOLOCK)。
您可以将事务隔离级别设置为未实现的读取,而不是提示:
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTEDhttps://stackoverflow.com/questions/14930696
复制相似问题