我编写了一个表值UDF,它以CTE开头,从大表中返回行的子集.CTE中有几个连接.一对内部和一个左边连接到其他表,这些表不包含很多行.CTE有一个where子句,它返回日期范围内的行,以便只返回所需的行.
然后,我在4个自左连接中引用此CTE,以便使用不同的标准构建小计.
查询非常复杂,但这是一个简化的伪版本
WITH DataCTE as
(
SELECT [columns] FROM table
INNER JOIN table2
ON [...]
INNER JOIN table3
ON [...]
LEFT JOIN table3
ON [...]
)
SELECT [aggregates_columns of each subset] FROM DataCTE Main
LEFT JOIN DataCTE BananasSubset
ON [...]
AND Product = 'Bananas'
AND Quality = 100
LEFT JOIN DataCTE DamagedBananasSubset
ON [...]
AND Product = 'Bananas'
AND Quality < 20
LEFT JOIN DataCTE MangosSubset
ON [...]
GROUP BY [
Run Code Online (Sandbox Code Playgroud)
我觉得SQL Server会感到困惑并为每次自我加入调用CTE,这似乎通过查看执行计划得到了证实,尽管我承认自己并不是那些阅读它们的专家.
我会假设SQL Server足够聪明,只能从CTE执行一次数据检索,而不是多次执行.
我尝试了相同的方法,但不是使用CTE来获取数据的子集,我使用了与CTE中相同的选择查询,而是将其输出到临时表.
引用CTE版本的版本需要40秒.引用临时表的版本需要1到2秒.
为什么SQL Server不够智能,无法将CTE结果保留在内存中? …
我需要什么(并获得临时表或视图是这样的):
numcasos valcount1 valcount2
-------- --------- -----------
0 2 1
1 1 2
2 (NULL) (NULL)
3 (NULL) 1
4 1 (NULL)
5 (NULL) (NULL)
6 (NULL) (NULL)
7 (NULL) (NULL)
8 (NULL) (NULL)
9 (NULL) (NULL)
10 (NULL) (NULL)
Run Code Online (Sandbox Code Playgroud)
这是一个例子,因为我需要300多个valcounts.MySQL的:
CREATE TEMPORARY TABLE sumnum1
SELECT numos.num1 AS num1,
COUNT(*) AS valcount1
FROM `numos`
GROUP BY numos.num1 ;
CREATE TEMPORARY TABLE sumnum2
SELECT numos.num2 AS num2,
COUNT(*) AS valcount2
FROM `numos`
GROUP BY numos.num2 ;
SELECT casos.`numcasos` AS numcasos,
sumnum1.valcount1 …Run Code Online (Sandbox Code Playgroud) 我有一个使用内存引擎创建的临时表如下:
CREATE TEMPORARY TABLE IF NOT EXISTS some_text (
id INT DEFAULT 0,
string varchar(400) DEFAULT ''
) engine = memory;
Run Code Online (Sandbox Code Playgroud)
当我插入行时,我遇到#1114错误,因为表已满.它在mysql文档中解释了更改tmp_table_size和max_heap_table_size不做任何事情来增加用户创建的临时表的大小,这是我认为我在这里.如何让这张桌子更大?
我希望能够通过调用SET动态做到这一点,但我已经试过设置tmp_table_size和max_heap_table_size他们都远远超出我在此表中预期的数据量.那么有谁知道如何在这个表上解决这个错误?谢谢任何帮助过的人.
Pandas有一个很棒的功能,您可以在其中将数据帧写入SQL中的表.
df.to_sql(con=cnx, name='some_table_name', if_exists='replace', flavor='mysql', index=False)
有没有办法以这种方式制作临时表?
据我所知,文档中没有任何内容.
背景
我有一个MySQL测试环境,其中的表包含2亿多行。在此表上必须执行两种类型的查询;
client_id和的列表,sgtin最多可容纳50.000个项目,我需要知道sgtin表中存在哪些。client_id和的列表,sgtin最多可容纳50.000个项目,我需要提取整行。(商店,gtin ...)对于单个“ client_id”,该表可以增长到200+百万条记录。
测试环境
至强E3-1545M / 32GB RAM / SSD。InnoDB缓冲池24 GB。(生产将是具有192GB RAM的更大服务器)
表
CREATE TABLE `sgtins` (
`client_id` INT UNSIGNED NOT NULL,
`sgtin` varchar(255) NOT NULL,
`store` varchar(255) NOT NULL,
`gtin` varchar(255) NOT NULL,
`timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
INDEX (`client_id`, `store`, `sgtin`),
INDEX (`client_id`),
PRIMARY KEY (`client_id`,`sgtin`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Run Code Online (Sandbox Code Playgroud)
测验
首先,我生成了随机的sgtin值,这些值分布在10个“ client_id”上,以用2亿行填充表格。
我创建了一个基准工具,该工具可以执行尝试的各种查询。另外,我还使用了解释计划来找出最佳性能。对于每次测试,该工具都会从我用来填充数据库的数据中读取新的随机数据。确保每个查询都是不同的。
对于这篇文章,我将使用28 sgtins。
临时表
CREATE TEMPORARY TABLE sgtins_tmp_table (`sgtin` …Run Code Online (Sandbox Code Playgroud) 试图解决:
我想我偶然发现了一个解决方案,我想看看它是否是一种解决问题的犹太方式.
(简短摘要)我想对一个记录ID列表进行linq-join,这些记录id不是(完全或至少很容易)在SQL中生成的.这是一个很大的列表,经常超过TDS RPC调用的2100项限制.所以我在SQL中所做的就是把它们放在一个临时表中,然后在我需要它时加入它.
所以我在Linq做了同样的事情.
在我的MyDB.dbml文件中,我添加了:
<Table Name="#temptab" Member="TempTabs">
<Type Name="TempTab">
<Column Name="recno" Type="System.Int32" DbType="Int NOT NULL"
IsPrimaryKey="true" CanBeNull="false" />
</Type>
</Table>
Run Code Online (Sandbox Code Playgroud)
打开设计器并关闭它会在那里添加必要的条目,但为了完整起见,我将引用MyDB.desginer.cs文件:
[Table(Name="#temptab")]
public partial class TempTab : INotifyPropertyChanging, INotifyPropertyChanged
{
private static PropertyChangingEventArgs emptyChangingEventArgs = new PropertyChangingEventArgs(String.Empty);
private int _recno;
#region Extensibility Method Definitions
partial void OnLoaded();
partial void OnValidate(System.Data.Linq.ChangeAction action);
partial void OnCreated();
partial void OnrecnoChanging(int value);
partial void OnrecnoChanged();
#endregion
public TempTab()
{
OnCreated();
}
[Column(Storage="_recno", DbType="Int NOT NULL", IsPrimaryKey=true)]
public int recno
{
get …Run Code Online (Sandbox Code Playgroud) 我想在SQLAlchemy中创建一个临时表.我可以通过调用一个对象来构建CREATE TABLE带有TEMPORARY子句的语句,但这不如用于向数据操作语言表达式添加前缀那么优雅.table._prefixes.append('TEMPORARY')Tabletable.select().prefix_with()
是否有相当于.prefix_with()DDL?
我有一个存储过程,我在其中创建一个临时表,通常包含1到10行.在存储过程中,此表被截断并填充多次.它被截断,因为这比删除更快.当我因使用删除而受到惩罚(截断对表变量不起作用)时,通过用表变量替换此临时表,我是否可以获得任何性能提升
虽然表变量主要在内存中,并且通常比临时表更快,但是我必须通过删除而不是截断来获得任何好处吗?
我目前有一个脚本正在运行,并且认为运行不会花这么长时间,脚本正在修改临时表.
我知道临时表只存在于当前会话中,但无论如何都要查看它们在会话外保存的数据吗?
原因是我想知道我的脚本将继续运行多长时间,如果我能看到临时数据,那么我就能弄明白.
为什么临时表比SQL Server中的连接的表变量更快?
注意:在两种情况下,表都有PK,表通过PK与其他"物理"表连接.
temp-tables ×10
mysql ×5
python ×2
sql-server ×2
join ×1
linq ×1
memory ×1
pandas ×1
performance ×1
sql ×1
sqlalchemy ×1
t-sql ×1