程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> 其他數據庫知識 >> MSSQL >> SQL Server2014 哈希索引道理詳解

SQL Server2014 哈希索引道理詳解

編輯:MSSQL

SQL Server2014 哈希索引道理詳解。本站提示廣大學習愛好者:(SQL Server2014 哈希索引道理詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是SQL Server2014 哈希索引道理詳解正文


當一個key-value鍵值對傳遞給一個哈希函數的時刻,經由哈希函數的盤算以後,依據成果會把key-value鍵值對放在適合的hash buckets(哈希存儲桶)裡

舉個栗子

我們假定對10取模( % 10 )就是哈希函數。假如key-value鍵值對的key是1525 ,傳遞到哈希函數,那末1525 會寄存在第五個bucket裡

由於5 as 1525 % 10 = 5。

異樣,537 會寄存在第七個bucket ,2982 會寄存在第二個bucket ,順次類推

異樣,在hash index外面,哈希索引列會被傳遞給哈希函數做婚配(相似於java外面的HashMap的Map操作),婚配勝利以後,

索引列會被存儲在婚配到的hash bucket外面的內外,這個內外會有現實的數據行指針,再依據現實的數據行指針查找對應的數據行。

歸納綜合來講,要查找一行數據或許處置一個where子句,SQL Server引擎須要做上面幾件事

1、依據where前提外面的參數生成適合的哈希函數

2、索引列停止婚配,婚配到對應hash bucket,找到對應hash bucket意味著也找到了對應的數據行指針(row pointer)

3、讀取數據

哈希索引比起B樹索引簡略,由於它不須要遍歷B樹,所以拜訪速度會更快

 

哈希函數和響應語法的例子

CREATE TABLE dbo.HK_tbl
 (
  [ID] INT IDENTITY(1, 1)
    NOT NULL
    PRIMARY KEY NONCLUSTERED HASH WITH ( BUCKET_COUNT = 100000 ) ,
  [Data] char(32) COLLATE Latin1_General_100_BIN2
      NULL ,
  [dt] datetime NOT NULL,
 )
 WITH (
   MEMORY_OPTIMIZED =
   ON,
   DURABILITY =
   SCHEMA_AND_DATA);

在SQL Server 2014外面,內存優化表創立完以後就不克不及再加哈希索引了,然則在 SQL Server 2016 裡支撐表創立完以後添加哈希索引,不外

添加哈希索引是一個離線操作。

哈希索引的Bucket 數目

( BUCKET_COUNT = 100000 )界說了哈希索引可以或許應用的BUCKET數目,這個Bucket 是固定的而且由用戶指定Bucket 數目,

而不是履行查詢的時刻由SQL Server決議生成的Bucket 數目。BUCKET數目老是2的次方的四捨五入( 1024, 2048, 4096 etc..)

SQL Server2014的哈希索引其實跟MySQL的自順應哈希索引道理其實差不多,都是為了解脫B樹的約束,使查找效力更快

How does a relational database work這篇文章也有描寫hash join的道理,年夜家可以看一下

��碼很難保護。其實我們可以用一個對象來處置這類工作:

function getDeviceState() {
var index = parseInt(window.getComputedStyle(indicator).getPropertyValue('z-index'), 10);
var states = {
2: 'small-desktop',
3: 'tablet',
4: 'phone'
};
return states[index] || 'desktop';
}
如許,你就一個寫出更具可讀性的邏輯斷定:

if(getDeviceState() == 'tablet') {
// Do whatever
}
或許應用CSS的偽元素的content屬性是個更好的辦法:


.state-indicator {
position: absolute;
top: -999em;
left: -999em;
}
.state-indicator:before { content: 'desktop'; }
/* 小屏幕桌面 */
@media all and (max-width: 1200px) {
.state-indicator:before { content: 'small-desktop'; }
}
/* 平板 */
@media all and (max-width: 1024px) {
.state-indicator:before { content: 'tablet'; }
}
/* 手機 */
@media all and (max-width: 768px) {
.state-indicator:before { content: 'mobile'; }
}
用上面的JavaScript辦法獲得症結的內容:

var state = window.getComputedStyle(
document.querySelector('.state-indicator'), ':before'
).getPropertyValue('content')
若何組織這些代碼全看你本身了。假如你有一個全局對象,例如window.config或window.app等,你可以把這些辦法放到外面。我偏向於模塊化這些功效,你可以把它做成jQuery插件或JavaScript對象包。不論你若何完成,它們都是你可以信任的、簡略易用的檢測用戶裝備的好辦法。

更上一層樓

我們曉得屏幕尺寸會產生變更——用戶手工調劑閱讀器年夜型或手機用戶調劑了手機偏向,所以,當這些事宜產生時,我們須要讓體系告知我們。上面這段簡略的代碼估量是你須要的:

var lastDeviceState = getDeviceState();
window.addEventListener('resize', debounce(function() {
var state = getDeviceState();
if(state != lastDeviceState) {
// 堅持以後的狀況
lastDeviceState = state;
// 宣布狀況變更,經由過程自界說的DOM事宜或JS 新聞宣布/定閱形式,
// 我愛好後者,一切就假定應用了一個如許的對象庫
publish('/device-state/change', [state]);
}
}, 20));
// 用法
subscribe('/device-state/change', function(state) {
if(state == 3) {
// or "tablet", if you used the object
}
});
留意,這裡我應用了debounce辦法來履行resize事宜產生時的舉措——這關於機能來講異常主要。是應用自界說DOM事宜照樣應用宣布/定閱形式,你自在選擇,由於都很簡略。

我認為這類辦法異常的好。有人能夠會指出應用matchMedia也能夠有雷同後果,但成績是你須要在CSS裡和JavaScript裡都應用媒體查詢,而有些媒體查詢語句能夠會很龐雜,乃至會成為你的惡夢,不如應用簡略的z-index。也有人會說可使用 window.innerWidth來斷定,但如許JS裡獲得的屬性和CSS裡的媒體查詢就須要互相轉換了,異樣也會成為你的惡魔。我的辦法的利益就在於你可以用它斷定其他類型的媒體查詢屬性,例如檢討手機是橫向(landscape)照樣豎向(portrait)。

不論如何,你可以試一下,告知我你的感到!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved