Sql 哪个示例最擅长使用索引

Sql 哪个示例最擅长使用索引,sql,tsql,optimization,indexing,Sql,Tsql,Optimization,Indexing,使用mssql server 2008。我需要比较性能。我要到下周才能使用查询分析器。这只是一个疯狂的想法,我想知道哪个剧本会表现得最好 我想知道哪些脚本可以使用txt上的索引,为什么 这两个表总共有3个索引,两个表都有大约1百万行 table1(id int(clustered index), name varchar(10)) table2(t1_id int(non-clustered index), txt varchar(10)(non-clustered inde

使用mssql server 2008。我需要比较性能。我要到下周才能使用查询分析器。这只是一个疯狂的想法,我想知道哪个剧本会表现得最好

我想知道哪些脚本可以使用txt上的索引,为什么

这两个表总共有3个索引,两个表都有大约1百万行

table1(id int(clustered index), name varchar(10))          
table2(t1_id int(non-clustered index), txt varchar(10)(non-clustered index)) 
SQL1:(2*连接)

SQL2:(1*加入1*'或')


我不认为你真的在拿苹果和这里的苹果进行比较;在一个查询中使用notlike,在另一个查询中使用Like,将在行为上产生显著的差异。由于不相似,优化程序不太可能在SQL1上使用txt列的索引。它通常给出一个非常不明确(或非选择性)的查询。也就是说,您实际上是在要求优化者在txt列中查找所有内容,除了那些以蓝色或绿色开头的值。这可能意味着您需要该列中的大多数值

我也不认为两次加入表2会给你带来什么


当然,虽然我所说的可能很有趣,但唯一重要的真正观点是解释计划。

我不认为你在这里真的是在拿苹果和苹果进行比较;在一个查询中使用notlike,在另一个查询中使用Like,将在行为上产生显著的差异。由于不相似,优化程序不太可能在SQL1上使用txt列的索引。它通常给出一个非常不明确(或非选择性)的查询。也就是说,您实际上是在要求优化者在txt列中查找所有内容,除了那些以蓝色或绿色开头的值。这可能意味着您需要该列中的大多数值

我也不认为两次加入表2会给你带来什么


当然,虽然我所说的可能很有趣,但唯一重要的真正观点是解释计划。

在第一个sql查询中,您不应该使用两个连接,而应该使用us a not EXISTS,因为这不会影响临时数据库中抛出的列数

SELECT *
FROM table1 t1 
  INNER JOIN table2 t3 ON t1.id = t3.t1_id
WHERE NOT EXISTS (
  SELECT TOP 1 1 
  FROM table2 t2 
  WHERE t1.id = t2.t1_id
    AND NOT t2.txt LIKE 'blue%'
    AND NOT t2.txt LIKE 'green%')
它的可读性更高,而且做的工作也完全相同,但是你应该避免双重否定(“不存在”,“不喜欢”),因为它使可读性更难

如果第二个查询的性能可用或几乎相同,我建议使用它


您还想过使用全文索引吗?

在您的第一个sql查询中,您不应该使用两个联接,而是使用一个不存在的us,因为这不会影响临时数据库中抛出的列数

SELECT *
FROM table1 t1 
  INNER JOIN table2 t3 ON t1.id = t3.t1_id
WHERE NOT EXISTS (
  SELECT TOP 1 1 
  FROM table2 t2 
  WHERE t1.id = t2.t1_id
    AND NOT t2.txt LIKE 'blue%'
    AND NOT t2.txt LIKE 'green%')
它的可读性更高,而且做的工作也完全相同,但是你应该避免双重否定(“不存在”,“不喜欢”),因为它使可读性更难

如果第二个查询的性能可用或几乎相同,我建议使用它


您也想过使用全文索引吗?

AFAI记得Stack Exchange Data Explorer有一个“查看执行计划”选项。虽然SQL2没有否定项,但乍一看它更具可搜索性。顺便说一句,请提供正确的DDL(您遗漏了关于
t1\u id
的任何信息,并且未能准确解释您有哪些索引-t2上有2个单独的索引还是只有1个复合索引。如果有2个,那么哪些是聚集的,哪些是非聚集的?)@MartinSmith更正了t1_id,总共3个索引,我添加了哪些索引是聚集的,哪些不是。唯一有趣的索引是txt上的索引。勾选“包括执行计划”框。
t1\u id,txt
上的复合索引可以避免连接内部的扫描。@我有很多方法从这两个表中检索数据。我无法创建索引来匹配每个查询。我的大多数查询都没有使用txt,如果我更改索引,这些搜索将没有索引。谢谢你的链接。我不知道您可以在临时表上建立索引。请记住,Stack Exchange Data Explorer有一个“查看执行计划”选项。虽然SQL2没有否定项,但乍一看它更具可搜索性。顺便说一句,请提供正确的DDL(您遗漏了关于
t1\u id
的任何信息,并且未能准确解释您有哪些索引-t2上有2个单独的索引还是只有1个复合索引。如果有2个,那么哪些是聚集的,哪些是非聚集的?)@MartinSmith更正了t1_id,总共3个索引,我添加了哪些索引是聚集的,哪些不是。唯一有趣的索引是txt上的索引。勾选“包括执行计划”框。
t1\u id,txt
上的复合索引可以避免连接内部的扫描。@我有很多方法从这两个表中检索数据。我无法创建索引来匹配每个查询。我的大多数查询都没有使用txt,如果我更改索引,这些搜索将没有索引。谢谢你的链接。我不知道可以在临时表上建立索引,我测试了sql,它们给出了相同的结果。尽管这看起来很奇怪,但这两个连接有一个目的,一个是确保列存在,另一个是确保颜色没有经过sql测试,并且它们给出相同的结果。尽管看起来很奇怪,但这两个连接有一个目的,一个是确保列存在,另一个是确保颜色不存在
SELECT *
FROM table1 t1 
  INNER JOIN table2 t3 ON t1.id = t3.t1_id
WHERE NOT EXISTS (
  SELECT TOP 1 1 
  FROM table2 t2 
  WHERE t1.id = t2.t1_id
    AND NOT t2.txt LIKE 'blue%'
    AND NOT t2.txt LIKE 'green%')