标签: functions

在创建索引期间“错误:文本搜索字典“unaccent”不存在?

我在 Mac OS X Yosemite 上运行 PostgreSQL 9.3。

我尝试创建一个非重音小写三元组索引。为了实现它,我这样做了:

mydb=# CREATE EXTENSION pg_trgm SCHEMA public VERSION "1.1"; 
       CREATE EXTENSION unaccent SCHEMA public; 
       ALTER FUNCTION unaccent(text) IMMUTABLE;
CREATE EXTENSION
CREATE EXTENSION
ALTER FUNCTION
Run Code Online (Sandbox Code Playgroud)

然后我尝试创建索引:

mydb=# CREATE INDEX author_label_hun_gin_trgm ON address 
       USING gin (public.unaccent(lower(label_hun)) gin_trgm_ops);
ERROR:  text search dictionary "unaccent" does not exist
Run Code Online (Sandbox Code Playgroud)

...并得到这个错误。如果我尝试列出可用的文本搜索词典,该unaccent词典似乎就在那里:

mydb=# \dFd
                             List of text search dictionaries
   Schema   |      Name       |                        Description                        
------------+-----------------+-----------------------------------------------------------
 pg_catalog | danish_stem     | snowball stemmer for danish language
 pg_catalog | dutch_stem      | …
Run Code Online (Sandbox Code Playgroud)

postgresql index index-tuning functions unaccent

4
推荐指数
1
解决办法
1万
查看次数

密码生成器功能

如果无法在函数中使用非确定性函数,那么在 SQL Server 中创建密码生成器用户定义函数函数的最佳方法是什么?

我想创建一个函数,该函数使用给定字符串中的字符返回随机生成的 varchar(10),如下所示:“1234567890QWERTYUIOPASDFGHJKLZXCVBNM”

我有自己的想法,但不是很自然的解决方案。

该功能背后的想法是,如果有人需要重置密码,我可以执行以下操作:

UPDATE Users SET Password = dbo.GeneratePassword() WHERE UserID = @UserID
Run Code Online (Sandbox Code Playgroud)

一个函数比单独的预分配密码表更容易部署和重用。

sql-server functions password

4
推荐指数
1
解决办法
8278
查看次数

什么时候使用存储过程/用户定义函数?

我对 SP(存储过程)和 UDF(用户定义函数)的使用感到困惑。通常,也可以在数据库之外的程序中编写代码。

是否有任何一般建议来决定何时使用它们?

postgresql stored-procedures functions

4
推荐指数
1
解决办法
9419
查看次数

从另一个函数创建一个函数

是否可以从另一个 plpgsql 函数创建一个新函数?像这样的东西:

CREATE OR REPLACE FUNCTION func_test()
RETURNS VOID AS
$BODY$
BEGIN
  CREATE OR REPLACE FUNCTION func_test2()
  RETURNS INT AS
  BEGIN
  $$
    SELECT 1;
  $$
  END
END
$BODY$
LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)

当我执行上面的代码时,我得到:

ERROR:  unexpected end of function definition at end of input
LINE 13: $BODY$`
Run Code Online (Sandbox Code Playgroud)

postgresql ddl plpgsql functions

4
推荐指数
1
解决办法
4761
查看次数

PostgreSQL 可信语言列表?

我正在尝试查找 PostgreSQL可信过程语言 (PL)的列表,因为我经常需要在非超级用户环境中使用 PL。

但我找不到确切的答案。例如,这里Postgres 文档表明 perl 有一个受信任和一个不受信任的 PL,这是一种我不太熟悉的语言。这里,它说TRUSTED关键字是您在创建 PL 语言时可以指定的内容,在某些情况下可能会被忽略。

但我也有(可能是错误的)印象,即某些 PL 语言仅受信任(例如 JavaScript PL/V8)或仅不受信任(Python)。其他帖子似乎表明可以调整 pg 以使用以下内容制作甚至是python一种可信赖的语言:

UPDATE pg_language SET lanpltrusted = true WHERE lanname = 'plpythonu';
Run Code Online (Sandbox Code Playgroud)

我的问题比理论更实际。基本上:

是否可以将任何 PL 设置为可信和不可信?

如果不是,可以设置为受信任或受信任的特定语言是什么。

“受信任”是指普通用户在 PL 语言中创建/执行/修改函数时应该具有有效的相同权限。另外,我使用的是 Postgres 9.x)

postgresql security functions postgresql-extensions

4
推荐指数
1
解决办法
2188
查看次数

我应该为函数添加 set nocount 吗?

我一直在阅读有关所有触发器和过程的好处,除非您使用 DONE_IN_PROC,否则实现了“set nocount on”。

我有一个从更新触发器调用的标量值函数,用于计算多个表中的值的总和。

搜索 msdn 和过去的文章,我无法找到使用 set nocounton 的函数的明确示例。

包含或排除“set nocount on”对函数有什么影响?函数中是否有一点或代码异味应该表明添加了 set nocount on?

sql-server t-sql functions set-returning-functions

4
推荐指数
1
解决办法
3180
查看次数

SQL Server 2017:交错执行如何工作?

Interleaved Execution 是2017 查询处理器中一系列功能的一部分,其中包括:

那么交错执行是如何工作的呢?

sql-server functions sql-server-2017 interleaved-execution

4
推荐指数
1
解决办法
423
查看次数

更改为兼容级别 150 会使 SQL Server 消耗所有可用内存

我们正在将现有数据库移动到新的 SQL Server 2019 实例。

如果我们将兼容级别更改为 150,则没有任何效果。任务管理器显示 sql server 服务正在消耗所有可用内存并且所有查询超时并显示错误

内部资源池中的系统内存不足,无法运行此查询

RAM 被完全消耗,直到无法运行查询(所有这些都以我提到的上一个错误结束)。我们尝试过 16、32 和 64GB 的 RAM。

任何人都可以提供有关如何调试的任何提示吗?

请注意,这不是查询问题……仅更改兼容级别就足以使 SQL 开始耗尽内存。

即使运行一个简单的标量函数(内部使用多个 Substring 和 cast 调用 - 没有表或视图选择)也足以使其消耗所有可用内存。

sql-server memory functions compatibility-level sql-server-2019

4
推荐指数
1
解决办法
884
查看次数

如何将当前行传递给 Postgres 中的生成列函数?

Postgres 12+ 支持生成列:https://www.postgresql.org/docs/current/ddl- generated-columns.html

从文档来看,语法似乎受到限制 - 它强制人们显式命名生成列所依赖的列。

CREATE TABLE people (
    ...,
    height_cm numeric,
    height_in numeric GENERATED ALWAYS AS (height_cm / 2.54) STORED
);
Run Code Online (Sandbox Code Playgroud)

有没有办法将整行传递给生成函数?就像是

CREATE TABLE people (
    ...,
    height_cm numeric,
    height_in numeric GENERATED ALWAYS AS generator_function(current_row) STORED
);
Run Code Online (Sandbox Code Playgroud)

postgresql functions computed-column postgresql-12

4
推荐指数
1
解决办法
1047
查看次数

标量函数改变前一个运算符的估计

请有人帮助我理解为什么标量函数的存在会改变先前索引扫描的估计?

我正在使用 StackOverflow2013 数据库的副本。SQL Server 2019(兼容模式100)

为了演示这个问题,我创建了一个简单的函数,它检查 User.DisplayName 中是否有“s”:

CREATE FUNCTION dbo.IsUserS (@DisplayName nvarchar(80))

RETURNS bit
AS
BEGIN
    RETURN CHARINDEX('S', @DisplayName)
END
 
Run Code Online (Sandbox Code Playgroud)

这是使用该函数的查询:

SELECT  U.ID,
    U.[DisplayName],
    U.[Reputation]
FROM    [dbo].[Users] AS [U]
WHERE   [U].[CreationDate] > '20100101'
AND [U].[Reputation] > 100
AND dbo.[IsUserS](u.[DisplayName]) = 1
Run Code Online (Sandbox Code Playgroud)

我正在将此查询的计划与完全相同的查询进行比较,但没有函数调用。以下是计划:

https://www.brentozar.com/pastetheplan/?id=ByLy1LlNi

在这两个计划中,我们都从聚集索引扫描开始。对于底部计划(没有过滤器的计划),扫描运算符的估计值与实际值很接近。对于带有过滤器的计划,估计值相差很大(实际行数的 36%)。

我的问题是,为什么 UDF 的存在会改变先前索引扫描的估计?

请注意,我正在 Compat' 模式 100 下运行。如果我翻转到 150,估计值与实际值实际上会更差,除非我打开旧基数估计器(在这种情况下,它与 100 相同,所以仍然很糟糕)。

sql-server execution-plan functions cardinality-estimates

4
推荐指数
1
解决办法
354
查看次数