婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > SQL2005CLR函數擴展 - 關于山寨索引

SQL2005CLR函數擴展 - 關于山寨索引

熱門標簽:浙江地圖標注 海南自動外呼系統(tǒng)價格 松原導航地圖標注 舞鋼市地圖標注app 九鹿林外呼系統(tǒng)怎么收費 創(chuàng)業(yè)電銷機器人 滄州營銷外呼系統(tǒng)軟件 電銷機器人虛擬號碼 沈陽智能外呼系統(tǒng)代理
本文只是一個山寨試驗品,思路僅供參考.
--------------------------------------------------------------------------------
原理介紹:
索引建立
目錄結構劃分方案也只是很簡易的實現了一下,通過unicode把任意連續(xù)的兩個字符(中文或英文)分為4個字節(jié)來做四層目錄,把索引的內容對應的主關鍵字(主要為了使用sql索引和唯一性)作為文件名,兩個字符在索引內容中的位置作為文件后綴來存儲.文件本身為0字節(jié),不保存任何信息.

比如一條數據 "pk001","山寨索引"
山寨索引 四個字的unicode為
[0]: 113
[1]: 92
[2]: 232
[3]: 91
[4]: 34
[5]: 125
[6]: 21
[7]: 95
那么對應的文件結構為
../113/92/232/91/pk001 .0
../232/91/34/125/pk001 .1
../34/125/21/95/pk001 .2

索引使用
比如搜索"寨索引 "
則搜索 "../232/91/34/125/" 目錄下的所有文件,然后根據 pk001 .1的文件后綴名1,去看 ../34/125/21/95/pk001.2文件是否存在.依次類推,最后返回一個結果集.
--------------------------------------------------------------------------------
實用性
具體的實用性還有待驗證.這只是實現了精確的like搜索,而不能做常見搜索引擎的分詞效果.另外海量數據重建索引的性能也是面臨很嚴峻的問題,比如cpu負載和磁盤io負載.關于windows一個目錄下可以保持多少個文件而不會對文件搜索造成大的性能損失也有待評估,不過這個可以考慮根據主鍵的文件名hash來增加文件目錄深度降低單一目錄下的文件數量.
--------------------------------------------------------------------------------
演示效果
實現了針對test標的name和caption兩個字段作索引搜索.
 
-- 設置和獲取索引文件根目錄
--select dbo.xfn_SetMyIndexFileRoot('d:/MyIndex')
--select dbo.xfn_GetMyIndexFileRoot()
-- 建立測試環(huán)境
 go
create table test( id uniqueidentifier , name nvarchar ( 100), caption nvarchar ( 100))
insert into test select top 3 newid (), ' 我的索引 ' , ' 測試 ' from sysobjects
insert into test select top 3 newid (), ' 我的測試 ' , ' 索引 ' from sysobjects
insert into test select top 3 newid (), ' 測試索引 ' , ' 測試索引 ' from sysobjects
insert into test select top 3 newid (), ' 我的索引 ' , ' 索引 ' from sysobjects
create index i_testid on test( id)
-- 建立索引文件
declare @t int
select @t=
dbo. xfn_SetKeyForMyIndex( id, 'testIndex' , name + ' ' + caption)   
from test
-- 查詢數據
select  a.*   from   test a, dbo. xfn_GetKeyFromMyIndex( '測試 索引 我的' , 'testIndex' )  b
    where a. id= b. pk
/*
0C4634EA-DF94-419A-A8E5-793BD5F54EED   我的索引 測試
2DD87B38-CD3F-4F14-BB4A-00678463898F   我的索引 測試
8C67A6C3-753F-474C-97BA-CE85A2455E3E   我的索引 測試
C9706BF1-FB1F-42FB-8A48-69EC37EAD3E5   我的測試 索引
8BBF25CC-9DBB-4FCB-B2EB-D318E587DD5F   我的測試 索引
8B45322D-8E46-4691-961A-CD0078F1FA0A   我的測試 索引
*/
--drop table test
--------------------------------------------------------------------------------
clr代碼如下:編譯為MyFullIndex.dll
復制代碼 代碼如下:

using System;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
using System.Collections;
using System.Collections.Generic;
public partial class UserDefinedFunctions
{
    /// summary>
    /// 設置索引目錄
    /// /summary>
    /// param name="value">/param>
    /// returns>/returns>
    [Microsoft.SqlServer.Server.SqlFunction ]
    public static SqlBoolean SetRoot(SqlString value)
    {
        if (value.IsNull) return false ;
        if (System.IO.Directory .Exists(value.Value))
        {
            root = value.Value;
            return true ;
        }
        else
        {
            return false ;
        }
    }
    /// summary>
    /// 獲取索引目錄
    /// /summary>
    /// returns>/returns>
    [Microsoft.SqlServer.Server.SqlFunction ]
    public static SqlString GetRoot()
    {
        return new SqlString (root);
    }
    /// summary>
    /// 建立索引
    /// /summary>
    /// param name="key"> 主鍵 /param>
    /// param name="indexName"> 索引名稱 /param>
    /// param name="content"> 索引內容 /param>
    /// returns>/returns>
    [Microsoft.SqlServer.Server.SqlFunction ]
    public static SqlInt32 SetIndex(SqlString key,SqlString indexName,SqlString content)
    {
        if (key.IsNull || content.IsNull||indexName.IsNull) return 0;
        return _setIndex(key.Value,indexName.Value, content.Value);
    }

    /// summary>
    /// 查詢索引
    /// /summary>
    /// param name="word"> 關鍵字(空格區(qū)分) /param>
    /// param name="indexName"> 索引名稱 /param>
    /// returns>/returns>
    [SqlFunction (TableDefinition = "pk nvarchar(900)" , Name = "GetIndex" , FillRowMethodName = "FillRow" )]
    public static IEnumerable GetIndex(SqlString word,SqlString indexName)
    {

        System.Collections.Generic.List string > ret = new List string >();
        if (word.IsNull || indexName.IsNull) return ret;
        return _getIndex2(word.Value, indexName.Value);
    }

    public static void FillRow(Object obj, out SqlString pk)
    {
        string key = obj.ToString();
        pk = key;
    }
    static string root = @"d:/index" ;

    /// summary>
    /// 獲取有空格分隔的索引信息
    /// /summary>
    /// param name="word">/param>
    /// param name="indexName">/param>
    /// returns>/returns>
    static System.Collections.Generic.List string > _getIndex2(string word, string indexName)
    {
        string [] arrWord = word.Split(new char [] { ' ' }, StringSplitOptions .RemoveEmptyEntries);

        System.Collections.Generic.List string > key_0 = _getIndex(arrWord[0], indexName);

        if (arrWord.Length == 0) return key_0;
        System.Collections.Generic.List string > [] key_list=new List string >[arrWord.Length-1];
        for (int i = 0; i arrWord.Length-1; i++)
        {
            System.Collections.Generic.List string > key_i = _getIndex(arrWord[i+1],indexName);
            key_list[i] = key_i;
        }

        for (int i=key_0.Count-1;i>=0;i--)
        {
            foreach (System.Collections.Generic.List string > key_i in key_list)
            {
                if (key_i.Contains(key_0[i]) == false )
                {
                    key_0.RemoveAt(i);
                    continue ;
                }
            }
        }
        return key_0;
    }
    /// summary>
    /// 獲取單個詞的索引信息
    /// /summary>
    /// param name="word">/param>
    /// param name="indexName">/param>
    /// returns>/returns>
    static System.Collections.Generic.List string > _getIndex(string word, string indexName)
    {
        System.Collections.Generic.List string > ret = new List string >();
        byte [] bWord = System.Text.Encoding .Unicode.GetBytes(word);
        if (bWord.Length 4) return ret;

        string path = string .Format(@"{0}/{1}/{2}/{3}/{4}/{5}/" , root,indexName, bWord[0], bWord[1], bWord[2], bWord[3]);
        if (System.IO.Directory .Exists(path) == false )
        {
            return ret;
        }
        string [] arrFiles = System.IO.Directory .GetFiles(path);

        foreach (string file in arrFiles)
        {
            string key = System.IO.Path .GetFileNameWithoutExtension(file);
            string index = System.IO.Path .GetExtension(file).TrimStart(new char [] { '.' });
            int cIndex = int .Parse(index);
            bool bHas = true ;
            for (int i = 2; i bWord.Length - 3; i = i + 2)
            {
                string nextFile = string .Format(@"{0}/{1}/{2}/{3}/{4}/{5}/{6}.{7}" ,
                    root, indexName, bWord[i + 0], bWord[i + 1], bWord[i + 2], bWord[i + 3], key, ++cIndex);

                if (System.IO.File .Exists(nextFile) == false )
                {
                    bHas = false ;
                    break ;
                }
            }
            if (bHas == true ret.Contains(key)==false )
                ret.Add(key);

        }
        return ret;
    }

    /// summary>
    /// 建立索引文件
    /// /summary>
    /// param name="key">/param>
    /// param name="indexName">/param>
    /// param name="content">/param>
    /// returns>/returns>
    static int _setIndex(string key,string indexName, string content)
    {
        byte [] bContent = System.Text.Encoding .Unicode.GetBytes(content);
        if (bContent.Length = 4) return 0;
        for (int i = 0; i bContent.Length - 3; i = i + 2)
        {
            string path = string .Format(@"{0}/{1}/{2}/{3}/{4}/{5}/" , root,indexName, bContent[i + 0], bContent[i + 1], bContent[i + 2], bContent[i + 3]);
            if (System.IO.Directory .Exists(path) == false )
            {
                System.IO.Directory .CreateDirectory(path);
            }
            string file = string .Format(@"{0}/{1}.{2}" , path, key, i / 2);

            if (System.IO.File .Exists(file) == false )
            {
                System.IO.File .Create(file).Close();
            }
        }
        return content.Length;
    }
};

--------------------------------------------------------------------------------
部署的sql腳本如下
--drop function dbo.xfn_SetMyIndexFileRoot
--drop function dbo.xfn_GetMyIndexFileRoot
--drop function dbo.xfn_GetKeyFromMyIndex
--drop function dbo.xfn_SetKeyForMyIndex
--drop assembly MyFullIndex
--go
CREATE ASSEMBLY MyFullIndex FROM 'd:/SQLCLR/MyFullIndex.dll' WITH PERMISSION_SET = UnSAFE;
--
go
-- 索引搜索
CREATE FUNCTION dbo. xfn_GetKeyFromMyIndex ( @word nvarchar ( max ), @indexName  nvarchar ( 900))   
RETURNS table ( pk nvarchar ( 100))
AS EXTERNAL NAME MyFullIndex. UserDefinedFunctions. GetIndex
go
-- 索引建立
CREATE FUNCTION dbo. xfn_SetKeyForMyIndex ( @pk nvarchar ( 900), @indexName  nvarchar ( 900), @word nvarchar ( max ))   
RETURNS int
AS EXTERNAL NAME MyFullIndex. UserDefinedFunctions. SetIndex
go
-- 獲取索引文件根目錄
CREATE FUNCTION dbo. xfn_GetMyIndexFileRoot ()   
RETURNS nvarchar ( max )
AS EXTERNAL NAME MyFullIndex. UserDefinedFunctions. GetRoot
go
-- 設置索引文件根目錄(默認目錄為 d:/myindex )
CREATE FUNCTION dbo. xfn_SetMyIndexFileRoot ( @FileRoot nvarchar ( max ))   
RETURNS bit
AS EXTERNAL NAME MyFullIndex. UserDefinedFunctions. SetRoot
go
您可能感興趣的文章:
  • mssql 建立索引
  • SQL2000 全文索引完全圖解
  • MSSQL 大量數據時,建立索引或添加字段后保存更改提示超時的解決方法
  • 關于重新組織和重新生成索引sp_RefreshIndex的介紹
  • MSSQL自動重建出現碎片的索引的方法分享
  • 理解Sql Server中的聚集索引
  • Sql Server中的非聚集索引詳細介
  • 在SQL SERVER中導致索引查找變成索引掃描的問題分析
  • 詳解sqlserver查詢表索引
  • SQL2005重新生成索引的的存儲過程 sp_rebuild_index

標簽:咸寧 西藏 日喀則 公主嶺 海口 商洛 臺灣 寶雞

巨人網絡通訊聲明:本文標題《SQL2005CLR函數擴展 - 關于山寨索引》,本文關鍵詞  SQL2005CLR,函數,擴展,關于,;如發(fā)現本文內容存在版權問題,煩請?zhí)峁┫嚓P信息告之我們,我們將及時溝通與處理。本站內容系統(tǒng)采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《SQL2005CLR函數擴展 - 關于山寨索引》相關的同類信息!
  • 本頁收集關于SQL2005CLR函數擴展 - 關于山寨索引的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    亚洲第一福利视频在线| 国内精品国产三级国产a久久| 精品久久一区二区| 在线不卡免费欧美| 欧美色倩网站大全免费| 欧美日韩国产小视频在线观看| 色综合咪咪久久| 91高清视频在线| 精品视频一区 二区 三区| 欧美丝袜丝交足nylons| 8v天堂国产在线一区二区| 欧美一区二区视频在线观看2020 | 老司机精品视频一区二区三区| 五月综合激情网| 日本aⅴ免费视频一区二区三区| 免费成人在线网站| 精久久久久久久久久久| 大陆成人av片| 99久久精品一区二区| 在线观看视频一区二区| 欧美午夜不卡在线观看免费| 欧美中文字幕一区二区三区| 欧美精品丝袜中出| 欧美卡1卡2卡| 欧美极品少妇xxxxⅹ高跟鞋 | 色综合一个色综合| 91黄色免费网站| 日韩一级高清毛片| 久久精品亚洲精品国产欧美kt∨| 国产日韩综合av| 亚洲图片另类小说| 亚洲国产va精品久久久不卡综合| 日韩av一级电影| 日本欧美一区二区| www.欧美色图| www.一区二区| 精品少妇一区二区三区免费观看| 国产精品情趣视频| 日韩成人一级大片| 99国产欧美另类久久久精品| 日韩欧美的一区| 亚洲欧美日韩国产另类专区 | 国产精品视频麻豆| 日韩高清在线不卡| av在线不卡观看免费观看| 欧美一区二区成人6969| 亚洲欧美一区二区三区孕妇| 日本三级韩国三级欧美三级| 色猫猫国产区一区二在线视频| 日韩欧美你懂的| 一区二区三区高清在线| 国产大片一区二区| 制服.丝袜.亚洲.中文.综合| 中文字幕亚洲一区二区av在线 | 中文在线一区二区| 日韩av电影免费观看高清完整版 | 欧美本精品男人aⅴ天堂| 一区二区三区在线播放| 国产成人av福利| 欧美va亚洲va| 免费观看30秒视频久久| 91久久精品午夜一区二区| 中文幕一区二区三区久久蜜桃| 久久99精品国产麻豆婷婷洗澡| 精品视频在线看| 亚洲国产精品久久不卡毛片| 色欧美日韩亚洲| 亚洲视频免费在线| 成人激情文学综合网| 国产视频在线观看一区二区三区| 免费看日韩a级影片| 91无套直看片红桃| 久久午夜老司机| 激情成人综合网| 久久久久久亚洲综合影院红桃| 久久av资源站| 久久精品水蜜桃av综合天堂| 国产91精品一区二区| 欧美激情中文不卡| 色婷婷综合久久| 亚洲午夜免费福利视频| 欧美三级中文字幕在线观看| 午夜精品视频在线观看| 制服丝袜激情欧洲亚洲| 国产综合色在线视频区| 国产欧美日韩另类视频免费观看| 成人免费视频免费观看| 亚洲欧美日韩中文播放| 欧美人动与zoxxxx乱| 久久国产尿小便嘘嘘| 欧美激情一区二区三区四区 | 午夜亚洲国产au精品一区二区| 69堂精品视频| 国产精品一区二区三区乱码| 18成人在线观看| 欧美在线观看你懂的| 看片的网站亚洲| 国产日韩亚洲欧美综合| 欧美影视一区二区三区| 精品一区二区在线看| 综合久久国产九一剧情麻豆| 欧美日韩一区三区| 国产乱妇无码大片在线观看| 亚洲欧美日韩人成在线播放| 欧美肥妇free| 粉嫩aⅴ一区二区三区四区| 亚洲综合一二三区| 精品国精品国产尤物美女| 99久久国产免费看| 日精品一区二区三区| 欧美激情一区二区三区蜜桃视频 | 欧美在线看片a免费观看| 色婷婷国产精品久久包臀| 最新中文字幕一区二区三区| 欧美老女人第四色| 国产成人在线免费观看| 一区二区三区在线免费| 国产欧美一区二区精品仙草咪| 色妞www精品视频| 久久97超碰色| 天天综合色天天| 国产精品毛片久久久久久久 | 久久爱www久久做| 中文字幕亚洲综合久久菠萝蜜| 欧美一区二区三区四区在线观看| 成人综合在线观看| 免费在线看一区| 亚洲一区二区中文在线| 成人免费在线播放视频| 精品日韩在线观看| 欧美日韩一区二区三区四区| a亚洲天堂av| 韩国三级在线一区| 日韩精品免费专区| 亚洲自拍偷拍av| 亚洲综合在线视频| 中文字幕在线观看一区| 久久久欧美精品sm网站| 日韩一级片在线播放| 欧美男生操女生| 欧美日韩欧美一区二区| 在线观看不卡一区| 在线免费精品视频| 日本精品一级二级| 色先锋aa成人| 在线视频一区二区三| 欧美在线一二三四区| 91香蕉视频污| 日本黄色一区二区| 在线看日韩精品电影| 色婷婷久久99综合精品jk白丝| 99精品欧美一区二区三区综合在线| 国产电影精品久久禁18| 成人一区二区视频| 97久久精品人人澡人人爽| 成人一二三区视频| 国产69精品一区二区亚洲孕妇| 国产精品一线二线三线精华| 国产99精品国产| 99久久综合狠狠综合久久| 色天天综合色天天久久| 日本美女一区二区三区视频| 美女网站一区二区| 久久国产婷婷国产香蕉| 国产麻豆视频一区二区| 成人18视频日本| 91国产免费看| 91麻豆精品91久久久久久清纯| 精品处破学生在线二十三| 中文字幕不卡在线| 亚洲高清三级视频| 蜜臀av国产精品久久久久| 黑人巨大精品欧美一区| 成人高清伦理免费影院在线观看| 一本到一区二区三区| 欧美α欧美αv大片| 国产精品久久久久久久久动漫| 亚洲一区二区三区三| 久久av资源站| 色综合久久久久综合99| 日韩欧美综合一区| 亚洲欧洲一区二区在线播放| 亚洲国产欧美一区二区三区丁香婷 | 91福利视频在线| 日韩精品一区二区三区四区视频| 国产午夜亚洲精品不卡| 天堂av在线一区| 国产suv精品一区二区6| 91传媒视频在线播放| 精品福利视频一区二区三区| 亚洲欧美日韩人成在线播放| 国产在线播放一区| 色狠狠综合天天综合综合| 欧美精品一区二区三区在线| 一区二区在线电影| 国产成人8x视频一区二区| 欧美老女人在线| 亚洲一二三四在线观看| 粗大黑人巨茎大战欧美成人| 欧美成人在线直播|