我们有一个怪物视图,其中包含与许多(许多)表的联接,以便返回所需的数据。在某些情况下,为了获取一列信息,我们必须连接到 4 个表,只是为了获取我们需要的值(数据库结构不是很好,我们无法更改它)。
为了提高性能,我提取了某些组件并将它们构建到自己的视图中,以简化执行计划,并希望优化查询。
如果我编写一个将这些视图连接在一起的查询,我是否会失去每个视图的查询优化的好处?即,我最终会回到开始的地方,将视图组合成单个选择,还是因为它们彼此原子地起作用,所以它本身会表现得更好?
这个问题让我疯狂了几天,我可能已经找到了答案,但我需要确认并检查最终的简单解决方案。
当存储过程使用一些用户定义的函数时,UDF 计划是合并到主计划中并且一切都得到优化还是每次都直接调用?
假设它没有发生,有没有办法强制 SQL Server 为特定的 SP 执行它?
我有几个表,我试图将它们与以下查询结合起来。我正在使用以下表格:
LoanOrigination:这包含贷款特征,例如资产价值、贷款期限等。每笔贷款有一个独特的观察。该表在LOAN_ID、SUB_SAMPLE和上建立索引COLLATERAL_TYPE。LoanPerformance:这包含了所有贷款的表现LoanOrigination。每一行是一个独特的MONTHLY_REPORTING_PERIOD和LOAN_ID组合,并且该表已被索引两个。CollateralData:这包含基于COLLATERAL_TYPE. 这样做的目的是估计贷款对抵押品的当前价值。下面查询的目的是组合这些表,以便每一行都包含贷款特征以及当月和下个月的拖欠状态。但是,查询速度非常慢。有什么办法可以加快速度吗?
with
COLLATERAL_VALUES as (
select
COLLATERAL_TYPE,
dateadd( day, 1-day(AsOfDate), AsOfDate) as ASOFDATE,
Value as INDEX
from LoanData.CollateralData
),
SAMPLE_LOANS as (
select
a.*,
b.INDEX as INDEX_T0
from LoanData.LoanOrigination a
join COLLATERAL_VALUES b on b.ASOFDATE = a.ORIG_DATE and b.COLLATERAL_TYPE = a.COLLATERAL_TYPE
where SUB_SAMPLE = 0
),
LOAN_STATE as (
select
a.LOAN_ID,
MONTHLY_REPORTING_PERIOD AS CUR_DATE,
CURRENT_ACTUAL_UPB as CUR_UPB,
LOAN_AGE, …Run Code Online (Sandbox Code Playgroud) 我的系统需要存储一个仅附加的事件日志。目前我有一个数据库表,将所有相关数据存储在一个表中:
CREATE TABLE `events` (
`event_id` VARCHAR(255) NOT NULL PRIMARY KEY,
`event_type` VARCHAR(255) NOT NULL,
`event_timestamp` DATETIME,
`group_id` VARCHAR(255),
`person_id` VARCHAR(255),
`client_id` VARCHAR(255),
`name` VARCHAR(768),
`result` VARCHAR(255),
`status` VARCHAR(255),
`logged_at` DATETIME,
`severity` VARCHAR(255),
`message` LONGTEXT,
INDEX `event_type_index` (`event_type`),
INDEX `event_timestamp_index` (`event_timestamp`),
INDEX `group_id_index` (`group_id`),
INDEX `person_id_index` (`person_id`),
INDEX `client_id_index` (`client_id`),
INDEX `name_index` (`name`),
INDEX `result_index` (`result`),
INDEX `status_index` (`status`),
INDEX `logged_at_index` (`logged_at`),
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8mb4 COLLATE=utf8_general_ci
Run Code Online (Sandbox Code Playgroud)
但是我注意到在 WHERE 子句中具有多个属性的查询仍然很慢。例如:
SELECT
count(e.event_id) as total
FROM events e
WHERE
e.result='Success' …Run Code Online (Sandbox Code Playgroud) I am building a PostgreSQL database and I have created a timestamp table, where the primary key is the timestamp itself (e.g. id: Fri Apr 13 2018 15:00:19). The database is supposed to be later migrated to a data warehouse, from which analytics will be extracted.
At this point, I am wondering whether it is beneficial to add extra columns to the timestamp table, containing the parsed metrics such as the example below, or have a single table with …
postgresql performance database-design optimization timestamp query-performance
我正在尝试创建一个查询执行计划的示例,它表明如果我对表的某些列进行基数估计,我可以决定哪个查询执行计划的成本最低。
所以我有这两篇文章(1和2),我可以将估计基数理解为列上不同值的数量。然后我计算选择性。
SELECT max(price) FROM tickets WHERE country = "CANADA";
Run Code Online (Sandbox Code Playgroud)
如果我的桌子有 180 件物品,而只有 10 件是加拿大的。而且只有 4 个不同的国家(加拿大、巴西、美国、德国)。所以....
列 country é 4的基数,因为它是不同项目的数量。
列 country = CANADA的选择性是访问的项目数除以表中的项目数。10/180 = 0.0555。
但是优化器可以根据基数选择哪些不同的查询执行计划?
如果这不是一个很好的例子,有人可以指出一个查询,基数对于优化器来说是一种财富,以便决定选择一个计划还是另一个计划?
谢谢,费利佩
sql-server optimization execution-plan cardinality-estimates
PostgreSQL 的COPY命令对于快速导入大量数据非常有用,并且数据必须采用数据类型的文本表示形式。
我正在导入大量数据,包括一timestamp列,但它存储为“unix time”,即自纪元以来的秒数。我可以将其转换为ISO 8601(例如2010-01-01 00:00:00,并且 PostgreSQL 接受 a 的转换timestamp。它不接受原始纪元值整数。
是否可以让 postgres 接受纪元整数值并将其解释/转换为时间戳?这将使我的代码更简单(也许更快)。
这适用于psql:
create temporary table test1 ( v1 timestamp );
copy test1 from stdin ;
Enter data to be copied followed by a newline.
End with a backslash and a period on a line by itself, or an EOF signal.
>> 2010-01-01 00:00:00
>> \.
COPY 1
Run Code Online (Sandbox Code Playgroud)
但这些没有:
copy test1 from stdin …Run Code Online (Sandbox Code Playgroud) 对于运行 ERP 系统的 Azure 上的 Microsoft SQL Server 2017 (RTM-CU20)(因此不能更改此处的代码)。
我有一个超过 4200 万行的表。这是一个机器操作统计跟踪表。用户按设备、日期、班次和统计类型(运行小时数、吨数等)输入运行统计数据。
该表具有这样的主键结构(请不要对 nchar 而不是 nvarchar 或将日期存储为字符串发表评论,这就是 ERP 供应商提供它的方式,这正是我必须使用的):
equip nchar(12) This is a 12 character equipment number
key_type nchar(1) One of two values E for equipment or G - always E here
shift_seq_no nchar(2) Sequence of shifts (usually 00 or 01)
stat_date nchar(8) Date, YYYYMMDD
stat_type nchar(2) A code for stat type, OH here (operating hours)
trc_seq_no nchar(3) A sequence number for when there's more than one entry …Run Code Online (Sandbox Code Playgroud) 我有一个具有以下架构的表
table_name
id int
task_id int
completed_date datetime (INDEX IX_TBL_NAME_COMPLETED_DATE)
Run Code Online (Sandbox Code Playgroud)
我在这个查询上运行 EXPLAIN
EXPLAIN
SELECT
*
FROM table_name TBL
WHERE
TBL.completed_date BETWEEN date1 AND date2
Run Code Online (Sandbox Code Playgroud)
此查询使用已完成日期的索引运行并获取记录
但是,在使用日期函数运行相同的查询时
EXPLAIN
SELECT
*
FROM table_name TBL
WHERE
CONVERT_TZ(TBL.completed_date, timezone1, timezone2) BETWEEN date1 AND date2
Run Code Online (Sandbox Code Playgroud)
未使用索引导致查询变慢。
有人可以解释这种行为背后的原因以及优化此类查询的解决方案吗?
我们实现了一个 Google 风格的搜索,其中在前端触发去抖动后运行 SQL 查询。(我们知道 SQL 可能是错误的技术,但我在这里陷入了启动混乱。)查询:
SELECT
TOP(50) [Name], [Surname]
FROM
[dbo].[Clients]
WHERE
[Name] LIKE @SearchTerm + '%' OR
[Surname] LIKE @SearchTerm + '%'
Run Code Online (Sandbox Code Playgroud)
这是一个相当大的表,所以我在两列上添加了两个非聚集索引以帮助加快速度:
CREATE NONCLUSTERED INDEX [IX_Patients_Name] ON [dbo].[Clients]
(
[Name] ASC
)
INCLUDE([Surname]);
CREATE NONCLUSTERED INDEX [IX_Patients_Surname] ON [dbo].[Clients]
(
[Surname] ASC
)
INCLUDE([Name]);
Run Code Online (Sandbox Code Playgroud)
我的想法是 SQL 会在两列上进行索引查找,但查询优化器似乎决定使用索引扫描。
对于这个简单的用例,这可能不是一个真正的问题,但我们有更复杂的版本,具有多个连接等。
有什么方法可以优化此查询以使用搜索吗?
optimization ×10
sql-server ×6
mysql ×2
performance ×2
postgresql ×2
timestamp ×2
copy ×1
datetime ×1
import ×1
index-tuning ×1
mysql-5.7 ×1
query ×1
view ×1