其他参考文献
是什么使SQL语句可存储?
#1 楼
P. Griffiths Selinger等人首先引入了“可燃”一词。在ACM发表的1979年论文“关系数据库管理系统中的访问路径选择”中。对于非ACM成员,可以在http://cs.stanford.edu/people/chrismre/cs345/rl/selinger.pdf上找到该文章的副本。
索引扫描和segment1扫描都可以选择使用谓词集(称为搜索参数(或SARGS)),它们在返回给RSI2调用者之前已应用于元组。如果元组满足谓词,则返回它;否则,返回它。否则,扫描将继续进行,直到找到满足SARGS的元组或用尽该段或指定索引值范围为止。通过消除对元组进行RSI调用的开销(可在RSS内有效拒绝),可以降低成本。并非所有谓词都可以变成SARGS形式。可预测谓词是“列比较运算符值”形式之一(或可以放入形式中)。 SARGS表示为此类谓词的布尔表达式,且为析取范式。
换句话说,可谓词可通过存储引擎(访问方法)直接解析观察表或索引记录。相反,不可持久的谓词需要更高级别的DBMS才能采取行动。例如,存储引擎可以通过简单地查看每个记录的字段
WHERE lastname = 'Doe'
的内容来确定lastname
的结果。另一方面,WHERE UPPER(lastname) = 'DOE'
要求SQL引擎执行功能,这意味着存储引擎将必须将其读取的所有行(假设它们与可能的其他可引用谓词匹配)返回给SQL引擎进行评估,从而导致额外的CPU费用。从原始定义中可以看到,只要满足条件“列比较运算符值”,则可谓词不仅可以应用于索引扫描,还可以应用于表(System R术语中的段)扫描。由存储引擎评估。 Db2是System R的后代,在很多方面确实是这种情况: ,因为谓词中涉及的列是索引键的一部分。这些谓词也由索引管理器评估。
数据可存储谓词是不能由索引管理器评估但可由Data Management Services(DMS)评估的谓词。通常,这些谓词需要访问基表中的各个行。如有必要,DMS会检索评估谓词所需的列。它的存储引擎无法在表扫描期间应用这样的谓词。在读取表或索引记录的同时,可以在查询处理的最低级别评估阶段1谓词。符合阶段1条件的行(如果有的话)将发送到评估的下一个阶段2。 ;段扫描在某种程度上等效于其他DBMS中的表扫描。
2- RSI-RSS3接口,一个面向元组的查询接口。与本次讨论相关的接口函数是NEXT,它返回匹配查询谓词的下一行。
3-RSS或Research Storage System,它是系统R的存储子系统。
评论
“直接观察表或索引记录”是什么意思?我的意思是肯定= UPPER()是函数调用,但memcmp本身也是。编写一个假定ASCII并忽略大小写的memcmp相对容易(只看第二个半字节)。这是否可维护?另请参阅@Ypercube的示例dba.stackexchange.com/questions/162263/…
–埃文·卡洛尔(Evan Carroll)
18-09-19在2:46
@EvanCarroll这意味着直接查看表或索引记录,而无需求助于存储引擎外部(例如在查询处理器/执行引擎/表达式服务中)实现的数据库功能。在ypercube的示例中,查询由计划器/优化器进行预处理,以使非SARGable搜索以SARGable术语表示。
–保罗·怀特♦
18-09-19在6:49
“直接看表或索引记录”是什么意思?我不确定这是如何解释“直接观察表或索引记录”的。 x = 0是否可维护? -0 = +0,'''或空间相等怎么办?可以肯定的例子是什么?当您说“不求助于存储引擎外部实现的数据库功能”时,您将包括在Ypercube的示例DATE()中,该示例包含在存储引擎内部。为什么它本身不可以保存?
–埃文·卡洛尔(Evan Carroll)
18-09-19在6:59
@EvanCarroll花一些时间阅读引用的论文,然后在此之后再进行一次回答。如果您仍然有此处要讨论的问题,可以问他们。请注意,DATE()不是真正的(SQL Server)函数,而是(我想)Cube先生进行类型转换的简写。如果您愿意,我们也可以在聊天中讨论。
–保罗·怀特♦
18/09/19在8:42
#2 楼
对我来说,SARGable意味着SQL Server可以使用您的搜索谓词执行索引查找。您不能仅仅说DBMS可以“利用”索引,因为有了不可持久的谓词,SQL Server可能最终会扫描非聚集索引。
评论
我也将其扩展到消除分区
– DavidדודוMarkovitz
17年1月26日在9:52
#3 楼
根据Dmitri Korotkevitch的Pro SQL Server Internals:,如果存在索引,则搜索参数ABLE谓词是SQL SERVER可以利用索引查找操作的条件。 SQL Server可以隔离单个值或索引键值范围进行处理
SARGable谓词包括以下运算符:
=
,>
,>=
,<
,<=
,IN
,BETWEEN
和LIKE
(在前缀匹配的情况下) 非SARGable运算符包括:
NOT
,NOT IN
,<>
和LIKE
(非前缀匹配),以及对表的功能或计算的使用,以及数据类型不满足创建的索引的类型转换。 示例:
WHERE name like 'SARGable%'
WHERE name like '%non-SARGable%'
演示:
DROP TABLE dbo.Testing;
GO
CREATE TABLE Testing (
WeirdDatatype int NOT NULL,
SomethingElse char(200)
);
CREATE NONCLUSTERED INDEX IDX_ALWAYS_SARGable
ON dbo.Testing( SomethingElse);
CREATE NONCLUSTERED INDEX IDX_NOT_ALWAYS_SARGable
ON dbo.Testing(SomethingElse);
INSERT INTO dbo.Testing
( WeirdDatatype, SomethingElse )
SELECT TOP 1000 m.message_id, CONVERT(char(200), m.text)
FROM sys.messages AS m;
现在我们运行:
SELECT *
FROM dbo.Testing AS t
WHERE t.WeirdDatatype = 1001;
SELECT *
FROM dbo.Testing AS t
WHERE t.SomethingElse LIKE 'Line%'
SELECT *
FROM dbo.Testing AS t
WHERE t.SomethingElse LIKE '%Line%'
AND t.WeirdDatatype = 1001;
结果是:
让我们看一下SARGable查询的属性(索引查找)
查询优化器能够在开始和结束的索引中定义一个限制。它有一个搜索参数供查询。
现在非SARGable查询:优化程序来定义索引的开始和结束或范围。现在必须搜索整个表(扫描)。
评论
再说一次,如果以后创建支持“%non-SARGable%”之类的WHERE名称的索引,是否会使条件可扩展?而且,如果是这样,我们不是在讨论特定的实现缺陷吗? IE。我们不应该说“ SQL Server 2016之前不可精简”
–埃文·卡洛尔(Evan Carroll)
17年1月25日在22:07
尽管在SQL Server发行版中有任何可能。在记住索引的引爆点的同时,在谓词的开头使用通配符会使查询优化器很难在索引中定义要搜索的值范围。因此,使用扫描和谓词然后称为不可SARG谓词。
–Vic Work
17年1月25日在23:00
当然,它是特定于实现的。例如,在较新的SQL Server版本(我认为是2008+)中,WHERE DATE(datetime_column)='2001-01-01'是“可更改的”(将进行索引查找),而在较旧的版本中则不是。
–超立方体ᵀᴹ
18年4月13日在8:42
评论
您可能要指出,您的问题不是关于SQL Server的,而是关于术语“可精化的”的。您的问题仅引用了SQL Server,因为它无法处理“%wordhere%”搜索谓词,而其他RDBMS显然可以。