Sql 中--索引

it2024-10-19  38

1. 索引的介绍

索引是:数bai据库中的索引du类似于一本书的目录. 索引的用途:加快数据处理速度. 索引的利弊: 查询执行的大部分开销是I/O, 利:使用索引,避免全表扫描,提高性能. 弊:带索引的表需要在数据库中占用更多的存储空间,同样用来增删数据的命令运行时间以及维护索引所需的处理时间会更长 所以要合理使用索引,及时更新去除次优索引。

2. sql如何为表字段添加索引

(1) 添加主键索引:ALTER TABLE 'table_name' ADD PRIMARY KEY ('column') (2) 添加唯一索引:ALTER TALBE 'table_name' ADD UNIQUE KEY('column') (3) 添加普通索引:ALTER TABLE 'table_name' ADD INDEX index_name('column') (4) 添加全文索引:ALTER TABLE 'talbe_name' ADD FULLTEXT ('column') (5) 添加多行索引: ALTER TABLE 'table_name' ADD INDEX ('column1','column2','column3')

3. 表提示 (Transact-SQL)即with(index(indexname)) 

通过指定锁定方法、一个或多个索引、查询处理操作(如表扫描或索引查找)或其他选项,表提示在数据操作语言 (DML) 语句执行期间覆盖查询优化器的默认行为。 表提示在 DML 语句的 FROM 子句中指定,仅影响在该子句中引用的表或视图。

eg:

           select a.mkerdate, a.billno, a.askno from sa_shangwubaojiayj a            inner join sa_baoj b with(index(sa_baoj_billno)) on a.billno=b.billno             where  isnull(b.istates,'')=0 

强制使用找到的第一个索引. 其他数据库一般用force index(index_name)

4. SQL查询表中的有那些索引 

(1) 查询一个表中的索引及索引列         USE [datebase]         GO         SELECT indexname=a.name,tablename=c.name,indexcolumns=d.name,a.indid         FROM sysindexes a          JOIN sysindexkeys b ON a.id = b.id  AND a.indid = b.indid         JOIN sysobjects c ON b.id = c.id         JOIN syscolumns d ON b.id = d.id  AND b.colid = d.colid         WHERE a.indid NOT IN ( 0 , 255 )           -- and   c.xtype='U'   and   c.status>0 -- 查所有用户表         AND c .name = '[table]' --查指定表         ORDER BY c. name,a.name,d.name

(2) 系统存储过程、视图上索引的信息。       参数 :[@objname =]是当前数据库中表或视图的名称。name 的数据类型为 nvarchar(776),没有默认值.

      use DB_NAME       go       sp_helpindex '[@objname =]'

5. 主键与索引的区别:

(1)主键一定是唯一性索引,唯一性索引并不一定就是主键。

(2)一个表中可以有多个唯一性索引,但只能有一个主键。

(3)主键列不允许空值,而唯一性索引列允许空值。

6. 全文索引

(1)全文索引是针对数据表,只能对表创建全文索引,不能对数据库创建全文索引。

(2)每个数据库可以不包含全文目录或包含多个全文目录,一个全文目录可以包含多个全文索引,但一个全文索引只能用于构成一个全文目录。

(3)一个数据表只能创建一个全文索引,一个全文索引可以包含多个字段。

(4)创建全文索引的表必须要有一个唯一的非空索引,并且这个唯一的非空的索引只能是一个字段,不能是组合字段。

(5)每个表只允许有一个全文索引.

(6)可以使用以下查询语句来查看对应的数据库是否已开启全文搜索:

         SELECT DATABASEPROPERTY('{DatabaseName}', 'isfulltextenabled');

         如果返回结果是 0,可以使用以下脚本进行启用:          EXEC sp_fulltext_database 'enable'

(7)全文搜索查询与 LIKE 谓词的对比          LIKE与全文搜索不同,LIKE仅对字符模式有效。另外,不能使用LIKE来查询格式化的二进制数据。          此外,对大量非结构化的文本数据执行LIKE查询要比对相同数据执行同样的全文查询慢得多。          对数百万行文本数据进行的LIKE查询可能需要几分钟的时间才能返回结果;          而对于同样的数据,全文查询只需要几秒甚至更少的时间,具体取决于返回的行数。

(8)创建全文目录          全文目录用来存储全文索引。可以直接使用以下脚本进行创建:          CREATE FULLTEXT CATALOG DefaultFullTextCatalog;

(9)对Table表的Name和Address两个字段添加简体中文的全文索引:

    CREATE FULLTEXT INDEX ON [dbo].[Shop]     (           [Name] LANGUAGE 2052,         [Address] LANGUAGE 2052     )       KEY INDEX [PK_Shop] ON DefaultFullTextCatalog     WITH CHANGE_TRACKING AUTO

(10)全文搜索谓词/函数

全文查询使用全文谓词(CONTAINS和FREETEXT)以及全文函数(CONTAINSTABLE和FREETEXTTABLE)。它们支持复杂的 Transact-SQL 语法,这种语法支持各种形式的查询词。 CONTAINS CONTAINS用于在 SQL Server 中搜索单个词和短语的精确或模糊(不太精确的)匹配项、在一定差别范围内的相近词或加权匹配项。

SELECT * FROM dbo.Shop WHERE CONTAINS((Name, Address),N'福田')

(11)CONTAINSTABLE 在查询方式上与CONTAINS几乎一样。但CONTAINSTABLE返回的是符合查询条件的表, 在 SQL 语句中我们可以把它当作一个普通的表来使用,并且使用CONTAINSTABLE的查询对每一行返回一个相关性排名值 (RANK) 和全文键 (KEY)。RANK用于表示相关性的匹配程度,它的值在0~1000之间,KEY就是主表的ID。 CONTAINSTABLE 文档 所以我们的查询的时候可以使用RANK进行排序,将相关性高的排在前面: SELECT T0.Name,        T0.Address,        T1.RANK FROM dbo.Shop T0     INNER JOIN CONTAINSTABLE                (Name, Address, N'八戒') T1         ON T0.Name = T1.[KEY] ORDER BY T1.RANK DESC;

(12)FREETEXT/FREETEXTTABLE

FREETEXT/FREETEXTTABLE的用法与 CONTAINS/CONTAINSTABLE一致。不同的在于FREETEXT/FREETEXTTABLE会先把要查询的词句先进行分词然后再查询匹配。 FREETEXT 文档 FREETEXTTABLE 文档 例如可以直接查询:西天取经的八戒,查询时SQL Server会自动拆分。 SELECT T0.ShopID,        T0.ShopName,        T0.ShopAddress,        T1.RANK FROM dbo.Shop T0     INNER JOIN FREETEXTTABLE                (Shop, (ShopName, ShopAddress), N'西天取经的八戒') T1         ON T0.ShopID = T1.[KEY] ORDER BY T1.RANK DESC;

另外,可以通过查询sys.dm_fts_parser来查看分词结果: SELECT * FROM sys.dm_fts_parser ('"西天取经的八戒"', 2052, 0, 0);

 
最新回复(0)