标签: functions

性能调整大圆距离计算

我有一个查询,用于查找距离已知点 1 公里以内的位置。

为此,我使用了余弦球面定律公式和我的纬度和经度。

目前,该查询在大约 5 分钟内运行了大约 5000 条记录。这是可以接受的,但我想尽快完成。

我使用的主要查询:

select loc.*, base.key
from locations loc left outer join baseline base
on base.key in
(select key
from baseline
where [dbo].CIRCLEDISTANCE(loc.LAT, base.LATITUDE, loc.LONG, base.LONGITUDE) <= 1)
Run Code Online (Sandbox Code Playgroud)

圆距离标量值函数:

ALTER FUNCTION CIRCLEDISTANCE 
(
    -- Add the parameters for the function here
    @LAT1 varchar(250), 
    @LAT2 varchar(250),
    @LNG1 varchar(250), 
    @LNG2 varchar(250)
)
RETURNS float
AS
BEGIN

    DECLARE @Distance float
    DECLARE @LAT1_FLOAT float
    DECLARE @LNG1_FLOAT float
    DECLARE @LAT2_FLOAT float
    DECLARE @LNG2_FLOAT float

    select @LAT1_FLOAT …
Run Code Online (Sandbox Code Playgroud)

performance sql-server tuning functions

6
推荐指数
2
解决办法
2174
查看次数

RETURN TABLE 在 Postgres 函数中转换为 RETURN SETOF int

在 pgAdminIII 中,我创建了一个函数,该函数使用 RETURN TABLE 在名为 identifier 的单列中返回多行:

CREATE OR REPLACE FUNCTION test(
    IN parm1 date,
    IN parm2 interval)
  RETURNS TABLE(identifier INT) 
AS
$BODY$
BEGIN
    RETURN QUERY
    SELECT 1;

END;
$BODY$
  LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)

创建函数后,pgAdminIII 显示该函数具有以下定义:

CREATE OR REPLACE FUNCTION test(IN parm1 date, IN parm2 interval)
  RETURNS SETOF integer AS
$BODY$
BEGIN
    RETURN QUERY
    SELECT 1;

END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100
Run Code Online (Sandbox Code Playgroud)

执行函数时,它遵循RETURNS TABLE. 但是,在编辑该函数时,它将拾取RETURNS SETOF. 这提供了与我指定的函数不同的功能(例如,返回的列的名称不再存在)。

那么,如何强制 pgAdminIII 保留返回的列名identifier?我并不特别关心我是否将其定义为 aTABLESETOF …

postgresql pgadmin parameter functions

6
推荐指数
1
解决办法
6214
查看次数

函数使用两次时的 PL/pgSQL 问题(缓存问题?)

我面临一个绝对奇怪的问题,感觉更像是 Postgres 错误而不是算法问题。

我有这个功能:

CREATE FUNCTION sp_connect(mail character varying, passwd character varying, role character varying)
  RETURNS json LANGUAGE plpgsql STABLE AS
$$
DECLARE
    user_info record;
BEGIN
  IF role = 'Role1' THEN
    SELECT u.id, r.name INTO user_info
    FROM users u
    INNER JOIN users_roles ur ON ur.user_id = u.id
    INNER JOIN roles r ON ur.role_id = r.id
    WHERE u.email = mail
      AND u.password = encode(digest(CONCAT(passwd, u.password_salt), 'sha512'), 'hex')
      AND r.name = 'Role1';
  ELSIF role = 'Role2' THEN
    SELECT h.id, 'Role1' AS name …
Run Code Online (Sandbox Code Playgroud)

postgresql plpgsql functions plan-cache postgresql-9.4

6
推荐指数
1
解决办法
4091
查看次数

返回带有附加列的表的函数

我想编写一个 PostgreSQL 函数,它返回一个表和一个附加列。有没有办法在不手动指定的情况下做到这一点RETURNS TABLE (col1 type, col2 type, ...)

例如,考虑以下函数:

CREATE FUNCTION get_users_with_most_videos_since_time(ts TIMESTAMPTZ)
  RETURNS SETOF "user" AS $$
    SELECT
      u.*,
      count(v.id) AS vids_since

    FROM "user" AS u
    INNER JOIN "video" AS v ON v.creator_id = u.id
    WHERE v.created_at > ts

    GROUP BY u.id
    ORDER BY vids_since DESC;
$$ LANGUAGE SQL;
Run Code Online (Sandbox Code Playgroud)

这失败并出现错误:

ERROR:  return type mismatch in function declared to return "user"
DETAIL:  Final statement returns too many columns.
Run Code Online (Sandbox Code Playgroud)

公平地说,我们包括了该vids_since列,该列不存在于"user"表中。

因此,要解决此问题,我想将其更改为:

CREATE FUNCTION get_users_with_most_videos_since_time(ts …
Run Code Online (Sandbox Code Playgroud)

postgresql datatypes view functions set-returning-functions

6
推荐指数
1
解决办法
4380
查看次数

查找使用了哪些函数

我有一个PostgreSQL包含数百个函数的旧数据库模式。我知道其中一些不再使用了,我想删除它们。

查找有时执行哪些过程而哪些不执行的最简单方法是什么?PostgreSQL 中是否有任何关于过程使用的统计数据?

使用的引擎版本为 PostgreSQL 9.5。

postgresql statistics functions postgresql-9.5

6
推荐指数
1
解决办法
3895
查看次数

在 ORDER BY 中使用 CASE .. END 有意义吗?

类似SELECT * FROM t ORDER BY case when _parameter='a' then column_a end, case when _parameter='b' then column_b end的查询是可能的,但是:这是一个好习惯吗?

在查询的 WHERE 部分使用参数是很常见的,在 SELECT 部分有一些计算列,但参数化 ORDER BY 子句并不常见。

假设我们有一个列出二手车的应用程序 (à la CraigsList)。汽车列表可以按价格或颜色排序。我们有一个函数,给定一定数量的参数(比如价格范围、颜色和排序标准),它会返回一组带有结果的记录。

为了具体起见,让我们假设cars都在下表中:

CREATE TABLE cars
(
  car_id serial NOT NULL PRIMARY KEY,  /* arbitrary anonymous key */
  make text NOT NULL,       /* unnormalized, for the sake of simplicity */
  model text NOT NULL,      /* unnormalized, for the sake of simplicity */
  year integer,             /* may …
Run Code Online (Sandbox Code Playgroud)

postgresql order-by dynamic-sql functions postgresql-9.6

6
推荐指数
1
解决办法
9741
查看次数

如何在 SQL Server 中将数据转换为适当的大小写

SQL Server 包含用于查看/更新字符串数据为大写和小写但不正确大小写的系统函数。希望此操作发生在 SQL Server 中而不是在应用程序层中的原因有多种。就我而言,我们在整合来自多个来源的全球 HR 数据期间执行了一些数据清理。

如果您在 Internet 上搜索,您会发现此任务的多种解决方案,但许多解决方案似乎都有限制性警告或不允许在函数中定义异常。

注意:正如下面的评论中提到的,SQL Server 不是执行此转换的理想场所。还建议了其他方法 - 例如 CLR。在我看来,这篇文章已经达到了它的目的——将所有这些想法集中在一个地方,而不是随处可见的随机花絮。谢谢你们。

sql-server t-sql functions

6
推荐指数
3
解决办法
7万
查看次数

这个带有交叉应用的派生表如何工作?

我借用了一些关于如何压缩和解压缩诊断代码字符串的代码,以便为我的数据仓库构建桥表。它运作良好。但是,我只是不明白它是如何进行解压缩的。这是以下代码的 SQL Fiddle

create table dimDiagnosisGroup (dxGroupKey int, dxCodeList nvarchar(1024))
insert into dimDiagnosisGroup
values  (1,'042, 070.70, 722.10'),
        (2,'042, 070.70, 780.52, 496, 716.90, 581.9'),
        (3,'042, 070.70, 782.1, V58.69'),
        (4,'042, 070.70, 782.3, V58.69')


 WITH XMLTaggedList AS (
     SELECT dxGroupKey,
        CAST('<I>' + REPLACE(dxCodeList, ', ', '</I><I>') + '</I>' AS XML)
            AS Diagnosis_Code_List
     FROM dimDiagnosisGroup
 )
     SELECT dxGroupKey,
            ExtractedDiagnosisList.X.value('.', 'VARCHAR(MAX)') AS dxCodeList2
          FROM XMLTaggedList
        CROSS APPLY Diagnosis_Code_List.nodes('//I') AS ExtractedDiagnosisList(X)
Run Code Online (Sandbox Code Playgroud)

我理解XMLTaggedList部分很好。我不明白的是交叉应用到ExtractedDiagnosisList(X),然后是ExtractedDiagnosisList.X.value('.', 'VARCHAR(MAX)')

当我将鼠标悬停在 select 语句中的ExtractedDiagnosisList 上时,SSMS …

sql-server cte functions cross-apply

6
推荐指数
1
解决办法
1596
查看次数

SQL Server 2016 并发限制?数据库并发调优

我有一个包含约 10 亿条时间戳记录的表,每条记录都包含一个会话表的 FK(每天一个会话和每天 3-500,000 条记录),因此查找给定日期的记录只是一个整数连接。

我正在尝试分析此表中的数据(数据按会话分组),当使用客户端计算机上的 C# 控制台应用程序时,我可以在 70 分钟内运行完整的分析(每条记录)。当我尝试直接在 TSQL 中运行类似的分析时,需要 12 多个小时。我预计会有一些惩罚,因为 TSQL 查询使用标量函数和自定义聚合 (clr)。

我的问题:在 C# 中,我了解如何最大化和调整并发性,因此 70 分钟是一个调整过的数字。是否可以直接在 SQL 中调整最大并发的查询,还是最好留给 C# api?(我也可以在 R、数据库或外部完成这项工作,但 .Net 并发 API 给我留下了优越的印象。)

询问:

SELECT TypeNumber, SessionId, dbo.udf_SessionName([timestamp]) SessionName, 
CAST(max(price)-min(price) AS REAL) as Variance, sum(EventNumber) as Volume, 
dbo.Direction(price,[timestamp]) as MoveDirection
INTO temp.AnalysisResults
FROM MyTable
WHERE ISNULL(price,0)<>0
GROUP BY TypeNumber, SessionId, dbo.udf_SessionName([timestamp])
Run Code Online (Sandbox Code Playgroud)

杂项

  • 由于插入,为此查询启用了批量记录
  • 此查询中未使用主键(它是跨三个字段的复合键,此处不需要。但是,查询计划显示正在扫描此索引,而不是我在下面提到的索引(该计划最初推荐) )。
  • 行级压缩已启用
  • 数据跨越五年,每个月有一个只读文件组(按月分区);所有文件组都驻留在同一个 SSD 上(不太好,我知道)
  • 索引:非聚集在 SessionId asc 上,包括 TypeNumber、Timestamp、Price
  • 4 个 CPU 内核可用
  • 标量函数获取每个时间戳,使用 AT …

performance sql-server functions sql-clr sql-server-2016 query-performance

6
推荐指数
1
解决办法
269
查看次数

将 SQL 函数标记为 LEAKPROOF 是否有任何性能优势?

PostgreSQL 有一个属性LEAKRPOOF,你可以用它来声明一个函数,

LEAKPROOF表示该函数没有副作用。除了返回值外,它不显示有关其参数的任何信息。例如,对于某些参数值而不是其他参数值抛出错误消息的函数,或者在任何错误消息中包含参数值的函数都不是防漏的。这会影响系统对使用该security_barrier选项创建的视图或启用了行级安全性的表执行查询的方式。系统将在用户提供的包含非防漏功能的查询本身的任何条件之前强制执行安全策略和安全屏障视图中的条件,以防止数据意外暴露。标记为防漏的函数和操作符被认为是可信的,并且可以在安全策略和安全屏障视图的条件之前执行。

文件继续说,

查询计划器在处理没有副作用的函数时具有更大的灵活性。此类函数称为LEAKPROOF,并且包括许多简单、常用的运算符,例如许多相等运算符。查询规划器可以安全地允许在查询执行过程中的任何点评估此类函数,因为在用户不可见的行上调用它们不会泄漏有关不可见行的任何信息。此外,不接受参数或未从安全屏障视图传递任何参数的函数不必标记为LEAKPROOF被推下,因为它们永远不会从视图接收数据。相比之下,根据作为参数接收到的值可能抛出错误的函数(例如在溢出或被零除时抛出错误的函数)不是防漏的,并且可以提供关于看不见的行的重要信息如果在安全视图的行过滤器之前应用。

是下面的LEAKRPOOF函数

CREATE FUNCTION foo_leakproof(bar int)
RETURNS int AS $$
  SELECT bar;
$$
IMMUTABLE LEAKPROOF
LANGUAGE sql;
Run Code Online (Sandbox Code Playgroud)

曾经有过不同的计划,或者它是否使用与LEAKPROOF缺乏替代方案不同的运行时配置文件运行,

CREATE FUNCTION foo_leaky(bar int)
RETURNS int AS $$
  SELECT bar;
$$
IMMUTABLE
LANGUAGE sql;
Run Code Online (Sandbox Code Playgroud)

postgresql performance functions

6
推荐指数
1
解决办法
981
查看次数