带有READONLY子句的SQL Server SELECT

时间:2014-07-11 00:29:27

标签: sql-server readonly

我想以只读模式从表中读取一些数据。

之前曾在DB2上工作过,我感到困惑,并尝试在我的SELECT语句中使用FOR READONLY子句:P

在修补它之后,我意识到以下陈述有效:

SELECT * FROM dbo.Users READONLY

使用READONLY子句运行查询的时间不到一半,而不是没有它。

所以我决定谷歌提供一些相同的文档,但我找不到任何使用READONLY和SELECT子句的文档。

如果没有文档,我们的DBA已要求我们不要使用READONLY子句,因为它可能会在较新的更新/版本中过时。

如果有人能指出一些有用的文档并告诉我这是否可以在SQL Server存储过程中安全使用,我会很感激。

我使用的是SQL Server版本11.0.3000.0

4 个答案:

答案 0 :(得分:3)

老问题,但如果有人认为他们偶然发现了一个神奇的快速切换,那么它应该得到一个新的答案。

这与SELECT * FROM dbo.Users PLEASE_BUFF_MY_PYLONSSELECT * FROM Users AS U具有相同的语义。它将别名READONLY分配给表Users并且对执行计划没有任何影响或者自己查询执行时间,任何说得更好的人都有一些该死的好证据备份它(例如,显示READONLY的执行计划只是一个别名)。 READONLY T-SQL关键字,但仅限于将表变量传递给存储过程的上下文中。在此查询的上下文中,它只是另一个标识符。

在一种情况下查询速度较慢,另一种情况下查询速度较快(缓存执行计划是一个重要原因)有多种原因;将表格别名为READONLY不是其中之一。

虽然没有" readonly"对于查询的模式, 就是从表中读取而不使用snapshot isolation阻止编写者。这也不是一个神奇的快速切换,但它在许多OLT​​P工作负载中很有用。

答案 1 :(得分:2)

这是一个示例脚本,用于突出显示READONLY在您使用它的上下文中的含义:

DECLARE @t TABLE(id INT);
INSERT INTO @t(id)VALUES(1),(2),(3);

SELECT READONLY.id FROM @t READONLY;

导致:

id
1
2
3

换句话说,您为表READONLY(在示例中为表变量dbo.users)分配了一个名为@t的别名。

我建议不要将此作为别名使用。它可能不会导致错误,但可以在SQL Server的另一个上下文中使用(在存储过程中声明一个表值参数)。由于这个原因,READONLY可能应该是保留关键字,因为在一种情况下将此单词用作关键字并在另一种情况下用作表别名可能会令人困惑。

答案 2 :(得分:0)

通常,您不需要在SELECT语句中包含FOR READ ONLY子句。 SELECT是按定义的只读操作,因此通常不需要FOR READ ONLY子句。但是,在某些情况下,必须在SELECT语句中包含FOR READ ONLY关键字。

see this article了解更多信息。

答案 3 :(得分:0)

更新了链接:

bumbumpaw回复中的链接不再有效。我在IBM知识中心找到了关于使用" FOR READ ONLY"查询Informix数据库时的子句。

https://www.ibm.com/support/knowledgecenter/en/SSGU8G_11.50.0/com.ibm.sqls.doc/ids_sqs_1062.htm

正如Jeroen Mostert指出的那样,Microsoft SQL Server不包含" READONLY"子句,即使它是保留关键字。但是,它确实可以选择将数据库级别设置为" READ_ONLY",这超出了本问题的范围。

https://docs.microsoft.com/en-us/sql/t-sql/statements/alter-database-transact-sql-set-options?view=sql-server-2017