具有两个 UDT 参数的查询需要 0.3 秒,但是当封装在内联表值函数中时,需要 3.5 秒以上。
我读过(为什么 UDF 比子查询慢这么多?),但正在努力解决如何修复/重写。
根据下面@JasonALong 的反馈,
0.3 秒内完成的 SELECT 语句的执行计划: https://www.brentozar.com/pastetheplan/? id=HJnrqC53Z(请注意,此页面上提供了 SQL)。
下面粘贴了在 3.5 秒内完成的函数代码以及此链接中的执行计划:https://www.brentozar.com/pastetheplan/ ?id=BJZbqR93b
SELECT
SelectedContracts.MeasurableID,
SelectedContracts.EntityID,
EntityName,
EntityAbbrev,
EntityLogoURL,
EntityHex1,
EntityHex2,
EntitySportID,
MeasurableName,
MeasurableOrganizationID,
YearFilter,
SeasonFilter,
CategoryFilter,
ResultFilter,
Logo4Result,
MeasurableSportID,
MouseoverFooter,
ContractRank4Org,
ContractEndUTC,
HighContractPrice4Period,
HighTradeID,
HighTradeUTC,
HighTradeNumberOfContracts,
HighTradeCurrency,
LowContractPrice4Period,
LowTradeID,
LowTradeUTC,
LowTradeNumberOfContracts,
LowTradeCurrency,
LastTradePrice,
LastTradeID,
LastTradeUTC,
LastTradeNumberOfContracts,
LastTradeCurrency,
SecondLastTradePrice,
SecondLastTradeID,
SecondLastTradeUTC,
SecondLastTradeNumberOfContracts,
SecondLastTradeCurrency,
ContractPrice4ChangeCalc,
ContractID4ChangeCalc,
ContractUTC4ChangeCalc,
ContractsNumberTraded4ChangeCalc,
ContractCurrency4ChangeCalc,
HighestBidID,
HighestBidMemberID,
HighestBidPrice,
HighestBidAvailableContracts,
HighestBidCurrency,
LowestAskID,
LowestAskMemberID,
LowestAskPrice,
LowestAskAvailableContracts, …Run Code Online (Sandbox Code Playgroud) sql-server stored-procedures user-defined-functions user-defined-types
我有两个返回数据的存储过程:
ALTER proc [dbo].[spBuscarUrl]
@CodigoContrato nvarchar(255),
@url nvarchar(255) OUTPUT
AS
SET NOCOUNT ON;
SELECT @url = url
FROM v_compras_y_contrataciones AS cc
WHERE CodigoContrato = @CodigoContrato;
RETURN
Run Code Online (Sandbox Code Playgroud)
当我尝试返回第二个存储过程的值时,错误显示:
ALTER procedure [dbo].[spCaller]
AS BEGIN
DECLARE @URL nvarchar(255);
EXECUTE spBuscarUrl
'MIREX-2017-00001', @url = @URL OUTPUT;
RETURN convert(nvarchar(255),@URL);
END
Run Code Online (Sandbox Code Playgroud)
消息 245,级别 16,状态 1,过程 spCaller,第 6 行 转换 nvarchar 值时转换失败 ' https://comunidad.comprasdominicana.gob.do//Public/Tendering/OpportunityDetail/Index?noticeUID=DO1.NTC.2 ' 转换为数据类型 int。
我有一个存储过程(称为sp1),它正在两个表之间进行联接。
表的架构如下:
Table1 (id, country, name, ccy)
Table2 (sId, price)
Run Code Online (Sandbox Code Playgroud)
这是存储过程:
SELECT
RTRIM(id) as id,
country
FROM
dbo.Table1
LEFT OUTER JOIN
dbo.Table2 ON Table1.Id = Table2.sId
Run Code Online (Sandbox Code Playgroud)
在一个数据库上,我得到以下结果
MNKD US UnitedStates
928502811 UnitedStates
Run Code Online (Sandbox Code Playgroud)
但在另一个数据库上,我得到了不同顺序的结果:
928502811 UnitedStates
MNKD US UnitedStates
Run Code Online (Sandbox Code Playgroud)
唯一显着的区别是表 1 由许多列组成,而表 2 只有两列。
有人可以帮助我找出原因以及如何修复它以获得一致的结果吗?谢谢
我有一个类 ( dbConnections),其中包含处理数据库查询类型的方法。我想调用此类中的方法,传递过程名称和包含该特定调用所需参数的数组。
然而,当执行时,它无法识别已传递的任何参数。如果我对它们进行硬编码,它们工作得很好,所以我的循环应用程序显然有问题。
我希望能够重用这个方法来传递和获取不同的参数,我只是不知道应该如何处理它。我还没有处理返回参数,因为我还没有让它工作......
任何见解将不胜感激。
这是我班级中的方法dbConnections:
public void ExecuteProcedure(string procedureName, string[] paramName, string[] procParams)
{
SqlCommand cmd = new SqlCommand(procedureName, con);
cmd.CommandType = CommandType.StoredProcedure;
for (int i = 0; i >= paramName.Length; i++)
{
cmd.Parameters.AddWithValue(paramName[i], procParams[i]);
}
cmd.ExecuteNonQuery();
}
Run Code Online (Sandbox Code Playgroud)
这是一个调用方法:
private void btn_logIn_Click(object sender, EventArgs e)
{
string uid = txb_userId.Text;
string pwd = txb_password.Text;
string procedureName = "spUsers_Login";
string[] paramName = new string[2];
string[] procParams = new string[2];
paramName[0] = "@Username";
procParams[0] = uid;
paramName[1] …Run Code Online (Sandbox Code Playgroud) 我在 Ubuntu 18.04.1 上使用 PostgreSQL 10.9。以下存储过程采用数组作为输入和变量 beta。两个输入变量都用于计算聚合索引。该数组可以具有不同的长度。由于我在另一个查询中使用此函数数千次,因此此函数的性能非常重要。我删除了 CTE 并将其更改为子查询,这有点帮助。但是我找不到任何其他方法来进一步提高性能。
CREATE OR REPLACE FUNCTION public.part_accessibility_index(traveltime_array NUMERIC[], beta numeric)
RETURNS SETOF NUMERIC
LANGUAGE sql
AS $function$
SELECT COALESCE(sum_index,0)
FROM
(
SELECT sum(part) sum_index
FROM (
SELECT EXP(UNNEST(traveltime_array)*(beta)) AS part
)
index_part
)
sum_index;
$function$
Run Code Online (Sandbox Code Playgroud)
该函数可以这样调用
SELECT part_accessibility_index(ARRAY[100.2,323.9,1323.313,432.232,1100.22,144.1], -0.001)
Run Code Online (Sandbox Code Playgroud)
我得到以下查询计划。
ProjectSet (cost=0.00..5.27 rows=1000 width=32) (actual time=0.180..0.184 rows=1 loops=1)
-> Result (cost=0.00..0.01 rows=1 width=0) (actual time=0.000..0.001 rows=1 loops=1)
Planning time: 0.022 ms
Execution time: 0.197 ms
Run Code Online (Sandbox Code Playgroud)
如前所述,查询并不是很慢,但可能仍有改进的方法。我将非常乐意提供任何帮助!
我已经奋斗了大约一个小时,试图让一个简单的存储函数在 mysql 中工作。我做了下面的简单例子,我不确定它有什么问题。
CREATE FUNCTION hello(id INT)
RETURNS VARCHAR
BEGIN
RETURN 'Works';
END;
hello(2);
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
1064 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,了解在“BEGIN RETURN 'Works”附近使用的正确语法;END' 在第 3 行
我很确定这是一个“愚蠢”的问题,但我不是一个 sql 专家,并且迫切需要组合一组函数来构建自定义报告
USE AdventureWorks2019;
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE OR ALTER PROCEDURE dbo.EmployeeGenderbyJobTitle
AS
BEGIN
SET NOCOUNT ON;
DROP TABLE IF EXISTS #EmployeeGenderbyJobTitle
GO
CREATE TABLE #EmployeeGenderbyJobTitle
(
EmployeeID int NOT NULL PRIMARY KEY,
Gender nchar(1),
JobTitle nvarchar(50)
)
GO
INSERT INTO #EmployeeGenderbyJobTitle (Gender, JobTitle)
SELECT Gender, JobTitle
FROM humanresources.employee AS e
GO
SELECT COUNT(*) AS FemaleEmployees, JobTitle
FROM #EmployeeGenderbyJobTitle
WHERE Gender = 'F'
GROUP BY JobTitle
GO
SELECT COUNT(*) AS MaleEmployees, JobTitle
FROM #EmployeeGenderbyJobTitle
WHERE Gender …Run Code Online (Sandbox Code Playgroud) 我有这样的疑问:
SELECT
t.[DataTran]
,t.[Dok]
,t.[Product]
,p.idxbox
,po.[Mark]
,po.[Model]
,(SELECT
TOP(1) [poz_La]
FROM [RaportyAutko].[dbo].[G_API_Data]
WHERE
idxbox= p.idxbox
AND DATEDIFF(second,{d '1970-01-01'}, [dataandtime]) < DATEDIFF(second,{d '1970-01-01'},t.[DataTran])
AND [distance]<>0
ORDER BY dataandtime DESC) AS [poz_La]
,(SELECT
TOP(1) [poz_Lo]
FROM [RaportyAutko].[dbo].[G_API_Data]
WHERE
idxbox= p.idxbox
AND DATEDIFF(second,{d '1970-01-01'}, [dataandtime]) < DATEDIFF(second,{d '1970-01-01'},t.[DataTran])
AND [distance]<>0
ORDER BY dataandtime DESC) AS [poz_Lo]
,(SELECT
TOP(1) [adress]
FROM [RaportyAutko].[dbo].[G_API_Data]
WHERE
idxbox= p.idxbox
AND DATEDIFF(second,{d '1970-01-01'}, [dataandtime]) < DATEDIFF(second,{d '1970-01-01'},t.[DataTran])
AND [distance]<>0
ORDER BY dataandtime DESC) AS [adress]
,
(SELECT
TOP(1) …Run Code Online (Sandbox Code Playgroud) 在我的网页图片从文件上传控件中获取,它必须存储在 sql server 中。如何编写存储过程以在 sql server 中保存图像?
我想出于某种目的更新我的日期列.已存储在列中的值如下所示
18-06-14
并且在更新时如果我不更新任何东西并进行调试和检查,则需要格式化为 2014-06-18T00:00:00
因此,在更新时,我在我的程序中得到如下错误.
ORA-1843:不是有效月份
以下是我将其作为更新参数发送的方式
LAUNCH_DATE = P_LAUNCH_DATE,
在P_LAUNCH_DATE我有更新的价值观.这给了我上面的错误.我该如何解决它.
UPDATE
这是我整个存储过程中使用它的方式.
PROCEDURE INSERT_INTO_RRSOC_MST
(
P_STORE_CODE IN NVARCHAR2,
P_STATE IN NVARCHAR2,
P_CITY IN NVARCHAR2,
P_SITE_STORE_FORMAT IN NVARCHAR2,
P_STORE_SITENAME IN NVARCHAR2,
P_STORE_SITENAME_LANDL_1 IN NVARCHAR2,
P_STORE_SITENAME_LANDL_2 IN NVARCHAR2,
P_STORE_ASST_MANAGER_NAME IN NVARCHAR2,
P_STORE_ASST_MANAGER_MOBNO IN NVARCHAR2,
P_STORE_MANAGER_NAME IN NVARCHAR2,
P_MANAGER_MOBNO IN NVARCHAR2,
P_EMP_NEAREST_STORE IN NVARCHAR2,
P_EMP_NEAREST_STORE_MOBNO IN NVARCHAR2,
P_SUPERVISOR_NAME IN NVARCHAR2,
P_SUPERVISOR_MOBNO IN NVARCHAR2,
P_SECURITY_SUP_NAME_STORE IN NVARCHAR2,
P_SECURITY_SUP_MOBNO_STORE IN NVARCHAR2,
P_NAME_ALIGNED_LPO IN NVARCHAR2,
P_LPO_MOBILENO IN NVARCHAR2,
P_ALPM_ALPO_NAME IN NVARCHAR2,
P_ALPM_ALPO_MOBNO IN …Run Code Online (Sandbox Code Playgroud) sql ×7
sql-server ×7
asp.net ×1
c# ×1
mysql ×1
oracle ×1
performance ×1
plsql ×1
postgresql ×1
sql-update ×1
syntax-error ×1
t-sql ×1