【原】SqlServer性能优化Compression
执行SQL查询时,主要的几个瓶颈在于:CPU运算速度、内存缓存区大
执行SQL查询时,主要的几个瓶颈在于:CPU运算速度、内存缓存区大小、磁盘IO速度。而对于大数据量数据的查询,其瓶颈则一般集中于磁盘IO,以及内存缓存。那么为了提高SQL查询的效率,一方面我们需要考虑尽量减少查询设计的数据条目数——建立索引,设立分区;另一方面,我们也可以考虑切实减少数据表物理大小,从而减少IO大小。
在SQL Server 2008中,最新提供了一项功能“压缩(Compression)”,就是定位于减少数据表、索引物理大小。
设置压缩
在企业管理器中,在需要压缩的表或索引上右键选择Storage-》Manage Compression:
这里可以看到几点:
- 下方列表里列出了该表所有的分区,也就是可以同一张表的不同分区应用不同的压缩策略。
- 压缩方式(Compression Type)分为Row和Page两种。
行级压缩(Row):
一方面减少了动态长度字段元数据的大小(varchar、varbinary等),比如之前存储字段实际长度需要2bytes,压缩后只需要3bits。
另一方面也直接减少各字段存储内容的大小,比如存储数值1在一个int类型字段中,压缩后只占用了一个字节。
页级压缩(Page):能在各行间共享相同的数据,这里面包含两项技术:列前缀(Column Prefix)、页字典(Page Dictionary)。
列前缀可以让拥有同样前缀的字段值拥有类似外键一样的结构来存储相同的前缀和各自的其余部分。比如一张存储了一个网站所有页面URL的表,URL字段存储的值分别是‘www.example.com/a.html’,‘www.example.com/b.html’,‘www.example.com/c.html’,‘www.example.com/d.html’。则压缩后,它们同样的前缀‘www.example.com/’会被提取出来,而其余部分会被类似如下的形式存储‘1a.html’,‘1b.html’,‘1c.html’,‘1d.html’。
页字典则可以将在应用列前缀基础上的其余部分再次聚合存储,比如同样是一张存储了一个网站所有页面URL的表,假设有在表里里有多条URL字段的值相同,比如‘1a.html’,‘1b.html’,‘1c.html’,‘1b.html’,‘1a.html’,‘1a.html’,则通过页字典技术压缩后,实际存储在字段中的值会进一步减少为‘2’,‘3’,‘1c.html’(没有重复的字段值不会被压缩),‘3’,‘2’,‘2’。 - 点击“Calculate”后,会计算出表当前占用的空间大小,以及压缩需要的空间大小。注意这里与一般预想的不同,如果要对一张预存有数据但尚未压缩的表进行压缩,首先需要的是额外的空间大小。
执行压缩
设置好之后,就可以选择是生成脚本还是立即执行,一般压缩的执行时间受表原有数据多少以及选择压缩方式的影响。笔者对一张有上千万条记录的表做页级压缩,耗时在10分钟左右。
压缩完成之后查看数据库大小,会发现数据库的大小变大了!这也和在设置阶段计算出来的额外空间相关。但实际上这里大部分空间是预占的空间,并没有实际数据。如果需要节省磁盘空间,需要进一步执行收缩(Shrink)操作。
与Compression不同,Shrink用来释放数据库占据的没有利用的空间,一般用来对无用的日志文件收缩(如果操作频繁,日志文件很有可能大于数据库实际数据的大小)。这里我们对数据库文件(mdf)做Shrink操作,完成之后再看数据库的大小,果然减少了很多。笔者做压缩、Shrink之后,一般都能将数据库的大小减为原来的1/3~1/2左右。当然,具体压缩比率取决于压缩方式、压缩表的字段特点、压缩表占整个数据库数据的比重等。
注意事项
- 既然对表行了压缩,那么在执行查询时必然会有解压缩的过程。而这一过程会占用CPU时间,也就是我们在通过压缩减少了磁盘占用空间以及IO时间的同时,增大了CPU的消耗。所以在压缩前需要考虑清楚查询的瓶颈到底是磁盘IO还是内存还是CPU。而且如果表应用了压缩,类似建立索引,对于增删改等操作也会有一定的影响。所以同样要考虑应用在表上的操作到底以哪种为主。
- 各页面的压缩是独立进行的,页字典和列前缀也分别存储于各页内。而且压缩仅在数据页快满的时候进行,因为一个页的大小是固定的,压缩半页不会有性能上的提升。
- 数据库备份中也有Compression的选项,但这利用的是系统的文件压缩技术,而且只能应用于整个数据库上。
- 容易被忽略的是,索引也能被压缩,而且和表压缩独立,同样也会提升所有应用到索引的查询的性能。
- 在Shrink阶段,可能会造成大量的索引碎片,所以可以在Shrink完成之后重建或者重组织索引,但同时,这些操作也会造成数据库的体积变大……也就是,最小的数据库体积和最小碎片比率的索引是鱼与熊掌,不可兼得。

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

PHP數組鍵值翻轉方法效能比較顯示:array_flip()函數在大型數組(超過100萬個元素)下比for迴圈效能更優,耗時更短。手動翻轉鍵值的for迴圈方法耗時相對較長。

不同Java框架的效能比較:RESTAPI請求處理:Vert.x最佳,請求速率達SpringBoot2倍,Dropwizard3倍。資料庫查詢:SpringBoot的HibernateORM優於Vert.x及Dropwizard的ORM。快取操作:Vert.x的Hazelcast客戶端優於SpringBoot及Dropwizard的快取機制。合適框架:根據應用需求選擇,Vert.x適用於高效能Web服務,SpringBoot適用於資料密集型應用,Dropwizard適用於微服務架構。

時間複雜度衡量演算法執行時間與輸入規模的關係。降低C++程式時間複雜度的技巧包括:選擇合適的容器(如vector、list)以最佳化資料儲存和管理。利用高效演算法(如快速排序)以減少計算時間。消除多重運算以減少重複計算。利用條件分支以避免不必要的計算。透過使用更快的演算法(如二分搜尋)來優化線性搜尋。

優化C++多執行緒效能的有效技術包括:限制執行緒數量,避免爭用資源。使用輕量級互斥鎖,減少爭用。優化鎖的範圍,最小化等待時間。採用無鎖定資料結構,提高並發性。避免忙等,透過事件通知執行緒資源可用性。

在PHP中,陣列到物件的轉換會對效能產生影響,主要受陣列大小、複雜度、物件類別等因素影響。為了優化效能,可以考慮使用自訂迭代器、避免不必要的轉換、批次轉換數組等技巧。

在Go中產生隨機數的最佳方法取決於應用程式所需的安全性等級。低安全性:使用math/rand套件產生偽隨機數字,適合大多數應用程式。高安全性:使用crypto/rand套件產生加密安全的隨機字節,適用於需要更強隨機性的應用程式。

根據基準測試,對於小型、高效能應用程序,Quarkus(快速啟動、低記憶體)或Micronaut(TechEmpower優異)是理想選擇。 SpringBoot適用於大型、全端應用程序,但啟動時間和記憶體佔用稍慢。

PHP函數效率最佳化的五大方法:避免不必要的變數複製。使用引用以避免變數複製。避免重複函數呼叫。內聯簡單的函數。使用數組優化循環。
